bachelor of technologymcs142144/documents/collaboration_tool.pdf · ibm rational team concert (rtc)...

89
PROJECT COLLABORATION TOOL A PROJECT REPORT Submitted by SASIDHARAN. R (1010106100) SURESH. P (1010106127) in partial fulfillment for the award of the degree of BACHELOR OF TECHNOLOGY in INFORMATION TECHNOLOGY SONA COLLEGE OF TECHNOLOGY, SALEM (AUTONOMOUS) ANNA UNIVERSITY: CHENNAI 600 025 MAY 2014

Upload: others

Post on 23-Mar-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

PROJECT COLLABORATION TOOL

A PROJECT REPORT

Submitted by

SASIDHARAN R (1010106100)

SURESH P (1010106127)

in partial fulfillment for the award of the degree

of

BACHELOR OF TECHNOLOGY

in

INFORMATION TECHNOLOGY

SONA COLLEGE OF TECHNOLOGY SALEM

(AUTONOMOUS)

ANNA UNIVERSITY CHENNAI 600 025

MAY 2014

i

PROJECT COLLABORATION TOOL

A PROJECT REPORT

Submitted by

SASIDHARAN R (1010106100)

SURESH P (1010106127)

in partial fulfillment for the award of the degree

of

BACHELOR OF TECHNOLOGY

in

INFORMATION TECHNOLOGY

SONA COLLEGE OF TECHNOLOGY SALEM

(AUTONOMOUS)

ANNA UNIVERSITY CHENNAI 600 025

MAY 2014

ii

BONAFIDE CERTIFICATE

This is to certify that this project report ldquoPROJECT

COLLABORATION TOOLrdquo is the bonafide work of ldquoSASIDHARAN R

SURESH Prdquo who carried out the project work under my supervision

SIGNATURE SIGNATURE

DR J AKILANDESWARI ME PhD DR J AKILANDESWARI ME PhD

HEAD OF THE DEPARTMENT SUPERVISOR

Professor Professor

Information technology Information technology

Sona College of Technology Sona College of Technology

Thiagarajar Polytechnic College Road Thiagarajar Polytechnic College Road

Salem ndash 636 005 Salem ndash 636 005

Submitted for Project Phase II held on helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

INTERNAL EXAMINER EXTERNAL EXAMINER

iii

ABSTRACT

We are living in a digital world which is governed by computers

New technologies are emerging every day because of several research and

development projects But management of the project development is a

challenging and complex task To make this management easier we propose

our project lsquoProject Collaboration Toolrsquo

Collaboration makes the management more complicated when

there are more than one person involved in the project development It is

difficult for all the members of a team to work in a single geographical location

Even if the developers (collaborators) are working on a project at the same

place merging the individual components is difficult

When two or more developers collaborate on a project there may

be the necessity to replicate data Although replication increases reliability

duplication of work is required to update every replicated copy To overcome

these difficulties we propose the ldquoProject Collaboration Toolrdquo which aims at

helping the developers to collaborate easily and to make the project

development efficient

Although there are several collaboration tools available they do

not provide the notification facility where each member of a project is intimated

when a new class method or interface is created during the development

process The notification can be one among desktop notification email

notification or SMS notification This facility will help to avoid the duplication

of work so that lot of time will be conserved

iv

ACKNOWLEDGMENT

First and foremost we thank to Power of Almighty for showing us inner

peace and for all blessings

Special gratitude to our Parents for showing their support and love

always

We like to acknowledge the constant support provided by Sri C

Valliappa Chairman for his consistent motivation in pursuing my project

We are immensely grateful to our principal Dr V Jayaprakash (Ph D)

who has been our constant source of inspiration

We express our sincere thanks to the Head of Information Technology Dr

J Akilandeswari ME PhD for providing us her valuable guidance

untiring patience diligent encouragement and adequate laboratory facilities

during the entire span of this project

We extend our gratitude to Mrs J Jeba Emilyn Ms AL Punitha Mr

Mohanraj and Mr Selvanathan for their consistent mentoring throughout the

project

We feel proud in sharing this success with my staff members non-teaching

staff and friends who helped directly or indirectly in completing this project

successfully

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

i

PROJECT COLLABORATION TOOL

A PROJECT REPORT

Submitted by

SASIDHARAN R (1010106100)

SURESH P (1010106127)

in partial fulfillment for the award of the degree

of

BACHELOR OF TECHNOLOGY

in

INFORMATION TECHNOLOGY

SONA COLLEGE OF TECHNOLOGY SALEM

(AUTONOMOUS)

ANNA UNIVERSITY CHENNAI 600 025

MAY 2014

ii

BONAFIDE CERTIFICATE

This is to certify that this project report ldquoPROJECT

COLLABORATION TOOLrdquo is the bonafide work of ldquoSASIDHARAN R

SURESH Prdquo who carried out the project work under my supervision

SIGNATURE SIGNATURE

DR J AKILANDESWARI ME PhD DR J AKILANDESWARI ME PhD

HEAD OF THE DEPARTMENT SUPERVISOR

Professor Professor

Information technology Information technology

Sona College of Technology Sona College of Technology

Thiagarajar Polytechnic College Road Thiagarajar Polytechnic College Road

Salem ndash 636 005 Salem ndash 636 005

Submitted for Project Phase II held on helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

INTERNAL EXAMINER EXTERNAL EXAMINER

iii

ABSTRACT

We are living in a digital world which is governed by computers

New technologies are emerging every day because of several research and

development projects But management of the project development is a

challenging and complex task To make this management easier we propose

our project lsquoProject Collaboration Toolrsquo

Collaboration makes the management more complicated when

there are more than one person involved in the project development It is

difficult for all the members of a team to work in a single geographical location

Even if the developers (collaborators) are working on a project at the same

place merging the individual components is difficult

When two or more developers collaborate on a project there may

be the necessity to replicate data Although replication increases reliability

duplication of work is required to update every replicated copy To overcome

these difficulties we propose the ldquoProject Collaboration Toolrdquo which aims at

helping the developers to collaborate easily and to make the project

development efficient

Although there are several collaboration tools available they do

not provide the notification facility where each member of a project is intimated

when a new class method or interface is created during the development

process The notification can be one among desktop notification email

notification or SMS notification This facility will help to avoid the duplication

of work so that lot of time will be conserved

iv

ACKNOWLEDGMENT

First and foremost we thank to Power of Almighty for showing us inner

peace and for all blessings

Special gratitude to our Parents for showing their support and love

always

We like to acknowledge the constant support provided by Sri C

Valliappa Chairman for his consistent motivation in pursuing my project

We are immensely grateful to our principal Dr V Jayaprakash (Ph D)

who has been our constant source of inspiration

We express our sincere thanks to the Head of Information Technology Dr

J Akilandeswari ME PhD for providing us her valuable guidance

untiring patience diligent encouragement and adequate laboratory facilities

during the entire span of this project

We extend our gratitude to Mrs J Jeba Emilyn Ms AL Punitha Mr

Mohanraj and Mr Selvanathan for their consistent mentoring throughout the

project

We feel proud in sharing this success with my staff members non-teaching

staff and friends who helped directly or indirectly in completing this project

successfully

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

ii

BONAFIDE CERTIFICATE

This is to certify that this project report ldquoPROJECT

COLLABORATION TOOLrdquo is the bonafide work of ldquoSASIDHARAN R

SURESH Prdquo who carried out the project work under my supervision

SIGNATURE SIGNATURE

DR J AKILANDESWARI ME PhD DR J AKILANDESWARI ME PhD

HEAD OF THE DEPARTMENT SUPERVISOR

Professor Professor

Information technology Information technology

Sona College of Technology Sona College of Technology

Thiagarajar Polytechnic College Road Thiagarajar Polytechnic College Road

Salem ndash 636 005 Salem ndash 636 005

Submitted for Project Phase II held on helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip

INTERNAL EXAMINER EXTERNAL EXAMINER

iii

ABSTRACT

We are living in a digital world which is governed by computers

New technologies are emerging every day because of several research and

development projects But management of the project development is a

challenging and complex task To make this management easier we propose

our project lsquoProject Collaboration Toolrsquo

Collaboration makes the management more complicated when

there are more than one person involved in the project development It is

difficult for all the members of a team to work in a single geographical location

Even if the developers (collaborators) are working on a project at the same

place merging the individual components is difficult

When two or more developers collaborate on a project there may

be the necessity to replicate data Although replication increases reliability

duplication of work is required to update every replicated copy To overcome

these difficulties we propose the ldquoProject Collaboration Toolrdquo which aims at

helping the developers to collaborate easily and to make the project

development efficient

Although there are several collaboration tools available they do

not provide the notification facility where each member of a project is intimated

when a new class method or interface is created during the development

process The notification can be one among desktop notification email

notification or SMS notification This facility will help to avoid the duplication

of work so that lot of time will be conserved

iv

ACKNOWLEDGMENT

First and foremost we thank to Power of Almighty for showing us inner

peace and for all blessings

Special gratitude to our Parents for showing their support and love

always

We like to acknowledge the constant support provided by Sri C

Valliappa Chairman for his consistent motivation in pursuing my project

We are immensely grateful to our principal Dr V Jayaprakash (Ph D)

who has been our constant source of inspiration

We express our sincere thanks to the Head of Information Technology Dr

J Akilandeswari ME PhD for providing us her valuable guidance

untiring patience diligent encouragement and adequate laboratory facilities

during the entire span of this project

We extend our gratitude to Mrs J Jeba Emilyn Ms AL Punitha Mr

Mohanraj and Mr Selvanathan for their consistent mentoring throughout the

project

We feel proud in sharing this success with my staff members non-teaching

staff and friends who helped directly or indirectly in completing this project

successfully

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

iii

ABSTRACT

We are living in a digital world which is governed by computers

New technologies are emerging every day because of several research and

development projects But management of the project development is a

challenging and complex task To make this management easier we propose

our project lsquoProject Collaboration Toolrsquo

Collaboration makes the management more complicated when

there are more than one person involved in the project development It is

difficult for all the members of a team to work in a single geographical location

Even if the developers (collaborators) are working on a project at the same

place merging the individual components is difficult

When two or more developers collaborate on a project there may

be the necessity to replicate data Although replication increases reliability

duplication of work is required to update every replicated copy To overcome

these difficulties we propose the ldquoProject Collaboration Toolrdquo which aims at

helping the developers to collaborate easily and to make the project

development efficient

Although there are several collaboration tools available they do

not provide the notification facility where each member of a project is intimated

when a new class method or interface is created during the development

process The notification can be one among desktop notification email

notification or SMS notification This facility will help to avoid the duplication

of work so that lot of time will be conserved

iv

ACKNOWLEDGMENT

First and foremost we thank to Power of Almighty for showing us inner

peace and for all blessings

Special gratitude to our Parents for showing their support and love

always

We like to acknowledge the constant support provided by Sri C

Valliappa Chairman for his consistent motivation in pursuing my project

We are immensely grateful to our principal Dr V Jayaprakash (Ph D)

who has been our constant source of inspiration

We express our sincere thanks to the Head of Information Technology Dr

J Akilandeswari ME PhD for providing us her valuable guidance

untiring patience diligent encouragement and adequate laboratory facilities

during the entire span of this project

We extend our gratitude to Mrs J Jeba Emilyn Ms AL Punitha Mr

Mohanraj and Mr Selvanathan for their consistent mentoring throughout the

project

We feel proud in sharing this success with my staff members non-teaching

staff and friends who helped directly or indirectly in completing this project

successfully

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

iv

ACKNOWLEDGMENT

First and foremost we thank to Power of Almighty for showing us inner

peace and for all blessings

Special gratitude to our Parents for showing their support and love

always

We like to acknowledge the constant support provided by Sri C

Valliappa Chairman for his consistent motivation in pursuing my project

We are immensely grateful to our principal Dr V Jayaprakash (Ph D)

who has been our constant source of inspiration

We express our sincere thanks to the Head of Information Technology Dr

J Akilandeswari ME PhD for providing us her valuable guidance

untiring patience diligent encouragement and adequate laboratory facilities

during the entire span of this project

We extend our gratitude to Mrs J Jeba Emilyn Ms AL Punitha Mr

Mohanraj and Mr Selvanathan for their consistent mentoring throughout the

project

We feel proud in sharing this success with my staff members non-teaching

staff and friends who helped directly or indirectly in completing this project

successfully

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

v

TABLE OF CONTENTS

CHAP

NO TITLE

PAGE

NO

ABSTRACT iii

ACKNOWLEDGEMENT iv

LIST OF TABLES viii

LIST OF FIGURES viii

LIST OF ABBREVIATIONS ix

1 INTRODUCTION 1

2 LITERATURE SURVEY 2

21 FEATURES 2

211 Open Atrium 2

212 GIT 2

213 Microsoft Project 3

214 Zoho Projects 4

215 TeamBox (Redbooth) 4

216 IBM Rational Team Concert (RTC) 5

22 DRAWBACKS OF EXISTING APPLICATIONS 5

3 HARDWARE AND SOFTWARE REQUIREMENTS 6

31 HARDWARE REQUIREMENTS 6

311 Minimum hardware requirements for server 6

312 Minimum hardware requirements for client 6

32 SOFTWARE REQUIREMENTS 6

321 Minimum software requirements for server 6

322 Minimum software requirements for client 6

4 PROJECT DESCRIPTION 7

41 PROJECT SCOPE 7

42 TECHNICAL FEASIBILITY 8

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

vi

43 TIME FEASIBILITY 8

44 LAMP ARCHITECTURE 8

441 Linux 8

442 Apache 8

443 MySQL 8

444 PHP 9

45 FEATURES 9

451 Features of ownCloud 9

4511 Data access synchronization amp sharing 9

4512 Restoring deleted files 9

4513 Integration with Google Drive amp DropBox 9

4514 Security 10

4515 File View in Browser 11

452 Features of lsquoCollaborationrsquo application 11

4521 Project Timeline 11

4522 Task Management 12

4523 Dashboard 14

4524 Report Generation 14

4525 File Content Management 15

4526 Version Control System 16

4527 Online Collaborative Document Editing 16

4528 Tasks view 17

4529 Notification 17

45210 Skill set 17

45211 Email notifications 17

45212 SMS alerts 18

45213 Task scheduling in calendar 18

45214 Responding to external events 19

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

vii

45215 Local language support

(Internationalization)

20

46 DESIGN 21

461 Use Case Model Survey 21

462 Class Diagram 23

463 Activity Diagrams 24

4631 Activity Diagram for Login 24

4632 Activity Diagram for Task Assignment 25

464 Sequence Diagrams 26

4641 Sequence Diagram for Login 26

4642 Sequence Diagram for Task Assignment 27

465 ER Diagram 28

466 Database Schema Diagram 29

47 FUTURE ENHANCEMENTS 30

471 Meeting module 30

472 Social Networking Integration 30

473 Exporting of reports 30

474 Knowledge transfer request 30

475 Instant Messaging (Chat) 30

476 Migration support 30

477 Task progress 30

5 RESULTS 31

APPENDIX (SAMPLE CODE) 50

REFERENCES 76

LIST OF PUBLICATIONS 78

PROOF FOR THE PUBLICATIONS 79

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

viii

LIST OF TABLES

TABLE

NO

TITLE PAGE

NO

1 Use Case Model Survey 21

LIST OF FIGURES

FIGURE

NO

DESCRIPTION PAGE

NO

1 Task status diagram 13

2 Use Case Diagram 22

3 Class Diagram 23

4 Activity Diagram for Login 24

5 Activity Diagram for Task Assignment 25

6 Sequence Diagram for Login 26

7 Sequence Diagram for Task Assignment 27

8 ER Diagram 28

9 Database Schema Diagram 29

10 Dashboard 31

11 Comment 32

12 Create Project 33

13 Create Task 34

14 Skillset View 35

15 View Tasks 36

16 View Projects 37

17 Contribution Report 38

18 Project Timeline 39

19 Task Status Report 40

20 Notification 41

21 Update Skillset 42

22 View Project Details 43

23 Update Project Details 44

24 Change Task Status 45

25 View Task Details 46

26 Update Task Details 47

27 Share Directory (Folder) 48

28 Task Logged as Event in Calendar 49

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

ix

LIST OF ABBREVIATIONS

S

NO

ABBREVIATION FULL FORM

1 LAMP Linux Apache MySQL PHP

2 SQL Structured Query Language

3 PHP Hypertext Preprocessor

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

1

CHAPTER 1

INTRODUCTION

We are living in a digital world which is governed by computers The

role of computers is indispensable since they play a vital role in the fields of

education business and media and so on New technologies are emerging

everyday because of several research and development projects New software

is being invented in order to meet the requirements of the modern world But

management of the project development is a challenging and complex task

Collaboration makes the management more complicated when there is

more than one person involved in the project development It is difficult for all

the members of a team to work in a single geographical location Even if the

developers are working on a project at the same place merging the individual

components is a difficult task

When two or more developers collaborate on a project there may be a

necessity to replicate code This improves the reliability of the code as it is

available in more than one location However there is a serious problem of

inconsistency if the replicated copies are not updated correctly

Hence we proposed and implemented a tool that allows easy online

collaboration of the project development process This tool has been

implemented (using the famous LAMP architecture) as a plug-in for an open

source private cloud software called Own Cloud

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

2

CHAPTER 2

LITERATURE SURVEY

The following are few of the existing systems for which we have

identified the features and disadvantages

21 FEATURES

A lot of applications are available today to support the process of project

collaboration Examples of such applications are listed below Along with the

applications their descriptions and features are also mentioned

211 Open Atrium

Open Atrium is an open source collaboration software solution that lets

the organizations to securely connect their teams and projects A more effective

solution is the Open Atriumrsquos framework which easily allows the organizations

to easily integrate their existing software Using Open Atrium communication

and education becomes better through an intranet social collaboration platform

web portal or learning management system A few features of Open Atrium are

Discussions

Notifications

Messaging

Knowledge management

212 GIT

GIT is a Version Control System (VCS) and Source Code Management

(SCM) software GIT was found by Linus Trovalds the founder of Linux

Operating System To collaborate using GIT a website

httpswwwgithubcom is available GitHub provides easy code collaboration

through feeds wikis social networking graph and so on A large number of

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

3

repositories (each source code package of a software is called a repository) are

available in GitHub Listed below are the functionalities of GIT

Versioning

Branching

Logging

213 Microsoft Project

This tool being a product of Microsoft provides various options for

easily planning projects and collaboration with others It lets you keep track of

the projects through the project management system The project management

system has the capability to integrate with other Microsoft applications and

cloud services A few of the features of Microsoft Project are

Project progress management

Graphical report generation

Live contact with collaborators

Instant Messaging (IM) ndash Chat

Video chat

Email

Task management

Budget management

(Auto) Scheduling

Templates for different types of projects

Timeline view of tasks

Synchronization with SharePoint

Burndown reports

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

4

214 Zoho Projects

Zoho Projects provides several features for project collaboration and

management However the free version of the software supports management

of only a single project whereas the paid versions provide greater functionality

The features are listed below

Task management

Visual chats

Live conversation

File content management (Google Drive integration)

Mobile Application

215 TeamBox (Redbooth)

Redbooth (formerly Teambox) is a simple online collaboration and

communication platform to ease the process of collaborating with the team The

name change had taken place very recently (in January 2014) and the features

of Redbooth are listed below

Conversation

Task management

Task allocation

Task prioritization

Video conferencing

Group chat

Management of multi projects

File content management

Google Drive integration

Drop box integration

Mobile application support

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

5

216 IBM Rational Team Concert (RTC)

Rational Team Concert (RTC) is a project collaboration tool developed

by IBM which is available as both standalone as well as web application It

helps the teams to manage the projects across their lifecycle Listed below are a

few features of RTC

Collaboration across development lifecycles

Change Management

Software Configuration Management

Reporting

Dashboards amp notification

22 DRAWBACKS OF EXISTING APPLICATIONS

A lot of necessary features are missing in the existing applications A few

missing features are listed below

No emailSMS alerts

Online Collaborative Document Editing is not possible

Forum like environment is not available

Members skill sets are not maintained amp tracked

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

6

CHAPTER 3

HARDWARE AND SOFTWARE REQUIREMENTS

31 HARDWARE REQUIREMENTS

311 Minimum hardware requirements for server

Processor i3

RAM 4GB

Processor speed 266 GHz

312 Minimum hardware requirements for client

Processor Core 2 Duo

RAM 512 MB

32 SOFTWARE REQUIREMENTS

321 Minimum software requirements for server

Operating System Linux

Server Apache

Database MySQL

CompilerInterpreter PHP

Tools Any browser (for administration)

322 Minimum software requirements for client

An operating system (OS) and a browser

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

7

CHAPTER 4

PROJECT DESCRIPTION

In order to avoid the disadvantages in the existing systems we propose

our project ldquoPROJECT COLLABORATION TOOLrdquo consists of various

features as listed below This project has a wide range of features like Progress

management Scheduling Task management live conversation notification amp

messaging knowledge management report generation burn down reports

version control system file content management and timeline view

41 PROJECT SCOPE

The scope of this project is to provide a user friendly environment for the

project developers who want to collaborate the development with their

(geographically distributed) team Our proposed project will help the project

collaboration process much simpler Our project will help several organizations

team developers and college students for easily develop and collaborate with

each other from different locations This project will help the individuals who

find the integration of individual modules difficult

This project will be useful for team members team leaders individual

developers organizations etc for easily collaborating and managing the project

The goal of this project is to support the project collaboration and it does not

aim at providing a platform for coding However this project can be used for

sharing and distributing the code to the members involved in developing the

project

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

8

42 TECHNICAL FEASIBILITY

Since our project is implemented as a web project using LAMP (Linux

Apache MySQL PHP) all the resources are available at free of cost and hence it

was technically feasible for us to implement this project

43 TIME FEASIBILITY

As our team had previous working experience in the Linux platform we

were able to analyse design develop and test our project within the given time

period

44 LAMP ARCHITECTURE

LAMP stands for Linux Apache MySQL and PHP Each of these terms

is explained as follows

441 Linux

It is an open source operating system (in fact Linux is a kernel)

developed by Linus Trovalds There are many flavours of Linux available today

like Ubuntu Fedora CentOS RedHat etc All these operating systems are

available free of cost OwnCloud server is designed to be configurable on Linux

platform Hence the Linux operating system had been chosen for the

development of this project

442 Apache

Apache is an open source server software which is used for serving the

clients which request the web pages This is one of the most famous servers

used commonly with Linux Since ownCloud supports Apache server it is used

as the server for the project

443 MySQL

Though other database management systems are supported by ownCloud

including PostgreSQL MySQL had been chosen as DBMS as it is convenient

and easy to integrate with PHP

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

9

444 PHP

Hypertext Preprocessor (PHP) is a HTML-embedded scripting language

commonly used for server side scripting Since ownCloud is developed using

PHP and all the ownCloud applications can created in PHP the development

language chosen for this project is PHP

45 FEATURES

451 Features of ownCloud

4511 Data access synchronization amp sharing

OwnCloud allows storing of files folders contacts photo galleries

calendars and more on the userrsquos server The data can be accessed from mobile

devices or desktops whenever they are needed

It helps to keep your files contacts pictures and calendars synchronized

among all the devices Moreover since is supports version control

collaboration is much easier

OwnCloud provides features for sharing the data with others and giving

them access to latest photo galleries calendars music or anything else Sharing

can be public or private

4512 Restoring deleted files

Just as any other cloud storage system ownCloud also provides support for

undeleting or restoring the deleted files

4513 Integration with Google Drive amp DropBox

OwnCloud also provides external storage support which means that the

storage space on the server could either be the own storage or cloud storage

obtained from Google Drive DropBox and a few other vendors

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

10

4514 Security

The actual key encrypted with username acts as key for file encryption

Encryption algorithms used are

o Version 5 ndash Crypt Blowfish

o Version 6 ndash AES 128 bit

SSL certificate can be configured to run ownCloud so that it can be

opened with https protocol

SQL Injection is avoided since every query being executed is a prepared

statement

Cross Site Scripting (XSS) attack is avoided through the Content Security

Policy (CSP) which is recommended by W3C

o Eg Inline JavaScript is blocked

The following steps were used to configure SSL certificate for ownCloud

1 Install the openssl software that is used to generate the private and the

public keys through terminal For installation run this command in

terminal while the system is connected to the Internet

$ sudo apt-get install openssl

2 Enable the ssl and rewrite module in apache2 Use the following

commands

$sudo su -

a2enmod ssl

a2enmod rewrite

3 Create a ssl directory inside etcapache2

mkdir -p etcapache2ssl

4 To create a self-signed certificate enter the following command in the

terminal and fill the information that is being asked

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

11

$ openssl req -new -x509 -days 365 -nodes -out

etcapache2sslowncloudpem -keyout etcapache2sslowncloudkey

5 Edit the lsquoowncloudconfrsquo file

6 Restart the apache server and now ownCloud will open in https protocol

Since the signature is self-signed a warning message will appear and it

can be simply ignored

4515 File View in Browser

ownCloud provides a fascinating feature of opening the following file

types in the browser itself so that almost everything can be done under the same

browser window

PDF

Images

VCF cards

Audio

Video

Text Document (odt only)

Spreadsheet (ods only)

Plain Text documents (txt)

452 Features of lsquoCollaborationrsquo application

4521 Project Timeline

The project timeline aims at displaying the progress of the project It can be

used by the project leaders for monitoring the project progress and helps them to

track and take necessary actions in order to complete the project before the

deadline The progress of the project will be displayed in form of a timeline

view The progress is calculated using the formula

Progress =

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

12

4522 Task Management

A set of tasks will be allocated to the employeesrsquo along with their priorities

Before assigning a task to a particular member the team leader has the option to

view the skillsets experience and expertise of that particular member The team

leader can also view the number of tasks assigned so far to that member in

order to assign tasks to a member who is free

A task can have one of the following states

Unassigned ndash Task has been created but not assigned to anyone yet

In Progress ndash Task has been assigned to a member and currently is in

progress

Held ndash Task is awaiting for some resources

Cancelled ndash The purpose of the task is no more and hence the task has

been cancelled

Completed ndash The task has been completed by the team member and is

awaiting for verification by the team lead

Verified ndash The completed task has been verified and accepted by the team

leader

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

13

Fig 1 Task status diagram

When a task is newly created by the administrator (Team leader) the task

initially goes to the Unassigned state Once it has been assigned to a team

member the task then goes to the In Progress (Assigned) state If the team

member is waiting for some resource to complete the task assigned to himher

heshe may hold the task so that it goes to the Held state Later when the

resource becomes available the team member can resume the task to bring it

back to the In Progress state

Once the task has been finished it is put into the Completed state The

team leader then verifies whether the completed task is according to hisher

specification and can either accept or reject inorder to put the task in Verified

or In Progress states respectively The task may be cancelled by the team

leader when it is in unassigned in progress or held states Once a task has been

cancelled or verified no more changes are allowed on that particular task

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

14

4523 Dashboard

The list of all activities taking place in the projects is posted on the

dashboard of the users The users can view amp comment on the posts so that a

thread is maintained for each post

The dashboard page is made dynamic so that more and more posts get

loaded when the users scroll down to the bottom of the page This dynamic

loading is done with the help of the lsquoonscrollrsquo event of JavaScript where it calls

a PHP function though AJAX to fetch more posts from the MySQL database

The list of activities posted on the dashboard include

1 Project Creation

2 Project Update

3 Task Creation

4 Task Update (Status change)

5 FileFolder sharing

6 User removal

7 Custom posts

4524 Report Generation

Reports play a vital role for monitoring and tracking the project Reports are

helpful for understanding whether the project is progressing as expected and for

taking necessary actions if the project progress is less Contribution report helps

in knowing the number of tasks performed by every member This number of

tasks performed by a member can be directly used as a parameter for paying the

members on the basis of lsquopay per taskrsquo or for rewarding the members who have

carried out more number of tasks Graphical report in form of bar graph will be

generated for the contributions of individual developers

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

15

Knowing the number of tasks in each state is important as it gives an

overall view about the tasks in a project Report is available to view the number

of tasks in each state in form of pie chart This also tells whether there are

pending tasks (tasks in lsquoIn Progressrsquo or lsquoHeldrsquo state) in the given project so that

the team leader can know how many more tasks needs to be completed to

complete the project For the generation of the graphical reports the ltdivgt tag

of HTML amp Canvas of HTML5 was used

4525 File Content Management

All the files are stored in the data directory of the server and hence unless

and otherwise the password is breached the data will not be revealed to the

users other than the owner amp the ownCloud administrator If the security has to

be still improved the user can enable the lsquoEncryptionrsquo application so that their

files and folders are stored in encrypted format in the ownCloud server

For synchronizing files with the desktop server it is recommended to use

the ownCloud Client for Windows Mac OS X and Linux The ownCloud

Desktop Client helps to connect to the private ownCloud Server Folders can be

created in the local directory and can be synchronized with the ownCloud

server thorugh ownCloud client applications

ownCloud keeps a copy of your deleted files in case you need them again

To make sure that the user doesnrsquot run out of memory the deleted files app

manages the size of the deleted files for the user The app takes care to never

use more that 50 of your currently available free space If the deleted files

exceed this limit ownCloud automatically deletes the oldest versions until it

meets the memory usage limit again

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

16

4526 Version Control System

Multiple versions of each file will be maintained so that any versions of any

file can be used anytime This feature is inbuilt in ownCloud ownCloud

supports simple version control for files Versioning is enabled by default and

creates backups of files which are accessible via the history tab This tab also

links to the history page where you can roll back a file to any previous version

The versioning app expires and hence removes the old versions

automatically to make sure that the usersrsquo do not run out of space Following

pattern is used for creating versions

bull For the first 10 seconds ownCloud keeps one version every 2 seconds

bull For the first hour ownCloud keeps one version every minute

bull For the first 24 hours ownCloud keeps one version every hour

bull For the first 30 days ownCloud keeps one version every day

bull After the first 30 days ownCloud keeps one version every week

The versions are adjusted along this pattern every time a new version gets

created Beside that the version app takes care to never use more that 50 of the

usersrsquo currently available free space If the stored versions exceed this limit

ownCloud delete the oldest versions until it meets the memory usage limit

again

4527 Online Collaborative Document Editing

With ownCloud documents can be creatededited collaboratively Online

Collaborative Document Editing means a single document can be viewed and

edited by more than a person at the same time which saves the time taken for

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

17

merging the contents of one file into correct location of the other file This

feature will be very helpful for preparing the documentation of the projects

4528 Tasks view

The list of available tasks can be seen in the tasks view Tasks can be

filtered according to their status according to the project to which they belong

to and also according to the person who assigned it The tasks view is available

to both the team leaders as well as the team members The team leaders will use

the tasks view to identify the tasks whose deadlines are approaching and can

remind the corresponding team member about the deadline The team members

will use the tasks view to see the list of tasks that they have to complete

4529 Notification

If a particular announcement is to be made for individual member set of

members or to a group of roles it can be made through notifications The

notification will be posted on the intended membersrsquo dashboard with a subject

45210 Skill set

The users have the option to update their skill set by adding their own skills

along with their experience and expertise in that particular skill This is the

feature which is not available in most of the collaboration software available

today

45211 Email notifications

Automatic email will be sent to the members when one of the following

events happens

1 A new project has been created

2 A rolemember has been added to a project

3 A task has been assigned to a member

4 A notification is posted in the dashboard

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

18

5 Every day with a morning overview of the list of tasks to be done on a

particular day

Every time the email is sent only if the user wishes to in order to avoid

flooding the email accounts of the users Since multithreading is not available

in PHP the OSrsquos lsquocronrsquo (schedule) job is taken to initiate a morning overview of

tasks every 24 hours

45212 SMS alerts

When the deadline of a task is approaching the task is still incomplete a

reminder SMS is sent to the registered mobile number of the team member so

that heshe can try to complete that task within the given deadline

The following method is used for sending SMS alerts

1 The SMS server which is written in Java for Android will be running on

an Android mobile

2 The ownCloud server amp SMS server will be connected to the same

network

3 The SMS server will listen to a port on its lsquolocalhostrsquo

4 The ownCloud server knows the IP address of the Android mobile and

the port in which the SMS server is listening to

5 Whenever an SMS is to be sent the ownCloud server writes the mobile

number amp data to be sent into that particular IP amp port

6 The data amp mobile number are fetched by the SMS server and the

content is texted to that particular mobile number

45213 Task scheduling in calendar

Every time a task is assigned to a member the task is noted in the calendar

application so that the user can be aware of the tasks that heshe is currently

working in through the calendar application itself which also provides the

timeline view of tasks

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

19

45214 Responding to external events

For responding to the events taking place outside the lsquoCollaborationrsquo

application (the event taking place in another application ndash external events)

ownCloud provides a method called Hook In the collaboration application two

external events have been handled

When the user is removed from ownCloud

The tasks that were in progress by that user are changed to

unassigned state and a notification about the user removal is posted on the

dashboard of members working in the projects that the removed member

was working in

Whenever a user is removed from ownCloud the following things

happen

1 The tasks assigned to himher are automatically changed to the

Unassigned state if it is in In Progress Held or Completed states

2 A notification is posted on the Dashboard of the members of the project

in which the removed member was working in

3 The member is removed from all roles in the projects in which heshe

was working in

4 The skills of the member are removed

5 All the notificationsposts created by the removed member are deleted

When a filefolder is shared from one member to another

member

A notification is posted on dashboard indicating the member who

shared the filefolder amp the location of the shared filefolder

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

20

45215 Local language support (Internationalization)

All the strings were translated into Tamil (local language) using Transifex

website amp multi-language support has been provided to the lsquoCollaborationrsquo app

just as the other ownCloud applications The steps followed for the translation

of strings are as follows

1 Every string visible to the user in the application is given after passing

to the translation function which is defined in ownCloud

2 A perl file built-in with ownCloud is run with the lsquoreadrsquo command line

option to generate the pot (Portable Object Template) file

3 The pot file corresponding to the lsquoCollaborationrsquo application is uploaded

into a repository of the lsquoTransifexrsquo website

4 The string translations are done at lsquoTransifexrsquo with the help of

translategooglecom and many other websites

5 The po (Portable Object) file has been downloaded from the lsquoTransifexrsquo

file and placed inside the lsquol10nrsquo directory of the lsquoCollaborationrsquo app

6 The perl file is run once again but with the lsquowritersquo command line option

to generate an associative array in PHP for translation

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

21

46 DESIGN

461 Use Case Model Survey

S

No

Activity Actors

involved

Description

1 View

contributionpr

oject progress

Administrator

Team

Members

The members and the leader can view the

contribution or the project progress in

form of graphs which are generated by

the Administrators

2 Organize files

amp folders

Administrator

Team

Member

The leader and the members can upload

download delete or add filesfolders into

the common file system

3 Share

resources for

knowledge

transfer

Administrator

Team

Member

The leader and the member can share the

resources like e-books (in PDF format)

websites (as URLs) etc to the other

members through knowledge transfer

4 Assign amp

prioritize tasks

Administrator The Administrator will be assigning the

tasks of a project to the team members

who will be apt for completing that

particular task

5 Create Project Administrator The admin can create a project amp assign

members to it The administrator can also

send email notifications amp SMS

notifications to the members about the

creation of the project

6 View

Notifications

Administrator

Team

Member

The members can view all the

notifications through their dashboards

7 Send

notifications

Administrator

Team

Member

NotificationsAnnouncements can be

made by the team members to either a

specific person a set of people or to the

people in a given role

8 Update skillset Administrator

Team

Member

Skills can be added amp removed by the

members along with their experience amp

expertise

Table 1 Use Case Model Survey

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

22

Fig 2 Use Case Diagram

Team lead Team member

Assign amp prioritize tasks

View contribution project progress

Generate burndown reports

Instant messaging

Organize files and folders

Schedule project progress

Generate contribution reports

Share resources for

Knowledge Transfer

View burndown reports

Generate Progress Reports

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

23

462 Class Diagram

Fig 3 Class Diagram

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

24

463 Activity Diagrams

4631 Activity Diagram for Login

When user requests for login the login credentials are obtained from the

user If the data matches with the details stored in database then the user will be

logged in successfully if the details do not match then we will re-request the

credentials for limited number of times

Fig 4 Activity Diagram for Login

Get login credentials

Login successful

Does the credentials match Max tries exceeded

Request to try later

Display Dashboard

No Yes

No

Yes

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

25

4632 Activity Diagram for Task Assignment

When the team leader request for assigning task they will be checked

whether they have been logged as team leader if not they will be request to login

as team leader They will be asked to enter the task id and member id

Corresponding member will be notified and his dashboard will be updated

Fig 5 Activity Diagram for Task Assignment

Request to assign task

Login as TL

Login as TL to assign task

Enter task ID amp user ID

Post to user

Alert the user

No

Yes

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

26

464 Sequence Diagrams

4641 Sequence Diagram for Login

The login credentials entered by the team member in the user interface

will be sent to the system The system requests the login credentials from the

database and checks whether the user input and the database tuple matches If

they match a success message is displayed to the team member

Fig 6 Sequence Diagram for Login

Team Member User Interface System Database

Login Credential

Pass Credential

Query DB

Fetch login details

Query Reply

Verify Credential

Success Message

Display Message

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

27

4642 Sequence Diagram for Task Assignment

When a task needs to be assigned the leader sends a request to the

system The system checks with the database and confirms the assignment As

soon as the task is confirmed it is assigned to the team member and notified to

the team leader

Fig 7 Sequence Diagram for Task Assignment

Team

Leader User

interface System

Team

member Database

Request task assign

Assign task request

Assign task

Update success message

Task assigned

Success message

Update task details

Update succeeded

Intimate success

Display message

Task accepted

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

28

465 ER Diagram

Fig 8 ER Diagram

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

29

466 Database Schema Diagram

Fig 9 Database Schema Diagram

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

30

47 FUTURE ENHANCEMENTS

The following enhancements are proposed to be included in the

lsquoCollaborationrsquo application in the future

471Meeting module

When a meeting is to be scheduled the notification should be posted to all

the members who should attend the meeting and a slot has to be allotted in their

calendars

472Social Networking Integration

The application could be integrated with available social networking

sites like Facebook Twitter etc so that every notification is posted directly in

the social networking account

473Exporting of reports

Reports must be able to be stored in some form like pdf so that they are

available for producing to the clients

474Knowledge transfer request

A concept can be learnt by a member from some other member by fixing

an appointment so that effective knowledge transfer takes place

475Instant Messaging (Chat)

Chatting module has to be implemented so that the members can discuss

about their project online

476Migration support

Migration of user support has to be provided for the lsquoCollaborationrsquo

application

477Task progress

Task progress can be monitored by the team leaders The progress of each

task will be updated by the performer of that task at regular intervals (for

example at the End of the day)

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

31

CHAPTER 5

RESULTS

Fig 10 Dashboard

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

32

Fig 11 Comment

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

33

Fig 12 Create Project

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

34

Fig 13 Create Task

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

35

Fig 14 Skillset View

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

36

Fig 15 View Tasks

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

37

Fig 16 View Projects

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

38

Fig 17 Contribution Report

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

39

Fig 18 Project Timeline

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

40

Fig 19 Task Status Report

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

41

Fig 20 Notification

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

42

Fig 21 Update Skillset

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

43

Fig 22 View Project Details

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

44

Fig 23 Update Project Details

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

45

Fig 24 Change Task Status

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

46

Fig 25 View Task Details

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

47

Fig 26 Update Task Details

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

48

Fig 27 Share Directory (Folder)

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

49

Fig 28 Task Logged as Event in Calendar

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

50

APPENDIX

SAMPLE CODE

databasexml

ltxml version=10 encoding=ISO-8859-1 gt

ltdatabasegt

ltnamegtdbnameltnamegt

ltcreategttrueltcreategt

ltoverwritegtfalseltoverwritegt

ltcharsetgtutf8ltcharsetgt

lttablegt

ltnamegtdbprefixcollaboration_taskltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

51

ltnamegtpriorityltnamegt

lttypegtintegerlttypegt

ltlengthgt1ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtevent_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_taskltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

lt--foreigngt

ltnamegtfk_collaboration_task_pidltnamegt

ltfieldgtpidltfieldgt

ltreferencesgt

lttablegtdbprefixcollaboration_projectlttablegt

ltfieldgtpidltfieldgt

ltreferencesgt

ltondeletegtrestrictltondeletegt

ltonupdategtcascadeltonupdategt

ltforeign--gt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_task_statusltnamegt

ltdeclarationgt

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

52

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtreasonltnamegt

lttypegttextlttypegt

ltlengthgt300ltlengthgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_task_statusltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtstatusltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtlast_updated_timeltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_projectltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltautoincrementgttrueltautoincrementgt

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

53

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtdescriptionltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtstarting_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtending_dateltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtlast_updatedltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcompletedltnamegt

lttypegtbooleanlttypegt

ltnotnullgttrueltnotnullgt

ltdefaultgtfalseltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtcalendar_idltnamegt

lttypegtintegerlttypegt

ltnotnullgttrueltnotnullgt

ltunsignedgttrueltunsignedgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_projectltnamegt

ltprimarygttrueltprimarygt

ltfieldgt

ltnamegtpidltnamegt

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

54

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltindexgt

ltnamegtuk_collaboration_projectltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegttitleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_postltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltautoincrementgttrueltautoincrementgt

ltdefaultgt0ltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttitleltnamegt

lttypegttextlttypegt

ltlengthgt100ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltdefaultgtNULLltdefaultgt

ltfieldgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

55

ltfieldgt

ltnamegttidltnamegt

lttypegtintegerlttypegt

ltdefaultgtNULLltdefaultgt

ltunsignedgttrueltunsignedgt

ltnotnullgtfalseltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttypeltnamegt

lttypegttextlttypegt

ltlengthgt35ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_to_allltnamegt

lttypegtbooleanlttypegt

ltdefaultgttrueltdefaultgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_postltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_works_onltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpidltnamegt

lttypegtintegerlttypegt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

56

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_works_onltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpidltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtroleltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_notificationltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_notificationltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtpost_idltnamegt

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

57

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtvisible_toltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_commentltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtcomment_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltdefaultgt0ltdefaultgt

ltautoincrementgttrueltautoincrementgt

ltunsignedgttrueltunsignedgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcontentltnamegt

lttypegttextlttypegt

ltlengthgt3000ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtcreatorltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtpost_idltnamegt

lttypegtintegerlttypegt

ltlengthgt20ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegttimeltnamegt

lttypegttimestamplttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_commentltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtcomment_idltnamegt

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

58

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

lttablegt

ltnamegtdbprefixcollaboration_skillltnamegt

ltdeclarationgt

ltfieldgt

ltnamegtmemberltnamegt

lttypegttextlttypegt

ltlengthgt64ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

lttypegttextlttypegt

ltlengthgt30ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexperienceltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt2ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexp_on_dateltnamegt

lttypegtdatelttypegt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltfieldgt

ltnamegtexpertiseltnamegt

lttypegtintegerlttypegt

ltdefaultgt0ltdefaultgt

ltlengthgt1ltlengthgt

ltnotnullgttrueltnotnullgt

ltfieldgt

ltindexgt

ltnamegtpk_collaboration_skillltnamegt

ltuniquegttrueltuniquegt

ltfieldgt

ltnamegtmemberltnamegt

ltsortinggtascendingltsortinggt

ltfieldgt

ltfieldgt

ltnamegtskillltnamegt

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

59

ltsortinggtascendingltsortinggt

ltfieldgt

ltindexgt

ltdeclarationgt

lttablegt

ltdatabasegt

update_taskjs StringprototypetoTitleCase = function ()

var A = thissplit( ) B = []

for (var i = 0 A[i] == undefined i++)

B[Blength] = A[i]substr(0 1)toUpperCase() + A[i]substr(1)toLowerCase()

return Bjoin( )

$(document)ready(function()

$(collaboration_content)css(marginLeft $(tabs_collaboration)outerWidth(true)

padding 10px)

if($(project)length = 0)

loadMembersList()

$(deadline_time)datetimepicker(

minDate 1

timeFormat HHmm

)

$(project)bind(change loadMembersList)

$(event_info)css(display none)

$(event)bind(change function(event)

if($(this)is(checked))

$(event_info)css(display none)

$(event_info_ + thisidsubstr(6))css(display inline)

)

if($(input[name=tid])length == 0)

$(create_task img)css(opacity 10)

$(create_task a)css(color black backgroundColor E9E3E3)

$(project)chosen(

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

60

no_results_text t(collaboration No matches found)

disable_search_threshold 5

)

else

var status = $(task_status)text()

if(statusindexOf(Cancelled) = -1 || statusindexOf(Verified) = -1)

OCRoutergenerate() will work only after loading the page completely

setTimeout(function()

$(collaboration_content)append(ltform id=task_details

method=post action= gt +

ltinput type=hidden name=tid value= + $(tid)val() + gt +

ltinput type=hidden name=msg value= +

((statusindexOf(Cancelled) = -1)

t(collaboration You cannot make changes on a cancelled task)

t(collaboration You cannot make changes on a verified task)) +

gt +

ltformgt)

$(task_details)attr(action

OCRoutergenerate(collaboration_route rel_path task_details))

$(task_details)submit()

10)

)

function loadMembersList()

showLoadingImage(load_members)

$ajax(

type POST

url OCfilePath(collaboration ajax load_membersphp)

data pid $(project)val()

success

function(data)

$(load_members)empty()

if (datastatus == success)

var list =

var user = oc_current_usertoLowerCase()

for(var role in datamembers)

list += ltoptgroup label= + role + gt

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

61

for(var member in datamembers[role])

list += ltoption value= +

datamembers[role][member]toTitleCase() + + ((datamembers[role][member]toLowerCase() ==

user) selected=selected ) + gt + datamembers[role][member]toTitleCase() + ltoptiongt

list += ltoptgroupgt

$(members)html(list)

$(skillset_link)attr(href

OCRoutergenerate(collaboration_route rel_path skillset_details) + project= +

$(project)val())

var deadline =

$ajax(

type POST

url OCfilePath(collaboration ajax

get_project_deadlinephp)

data pid $(project)val()

success

function(inner)

if(innerstatus == success)

var old_time =

$(deadline_time)datetimepicker(getDate)

$(deadline_time)datetimepicker(option

maxDate new Date(innerdeadlinesplit( )[0]))

$(deadline_time)datetimepicker(setDate old_time)

)

else

alert(An error occurred in loading members list Please try again

later)

$(members)empty()

)

function showLoadingImage(id)

var img = documentcreateElement(img)

imgsetAttribute(src OCimagePath(core loadinggif))

$(img)css(width 15px height 15px)

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

62

$( + id)append(img)

update_taskphp (template) ltphp

print_unescaped($this-gtinc(tabs))

gt

ltdiv id=collaboration_content gt

lth1 id=titlegt

ltphp p($_[title]) gt

lth1gt

ltphp

if(isset($_[tid]) ampamp (isset($_[projects]) || count($_[projects]) == 0))

gt

ltpgt

ltphp p($l-gtt(Sorry you are not into any project yet You can create

tasks only after joining a project)) gt

ltpgt

ltphp

else

gt

ltform action=ltphp print_unescaped(OCPUtillinkToRoute(collaboration_route

array(rel_path =gt submit_update_task)))gt method=post name=task_updation_formgt

ltphp

if(isset($_[tid]))

gt

ltinput type=hidden id=tid name=tid value=ltphp p($_[tid]) gt gt

ltphp

gt

lttablegt

lttrgt

lttdgt

ltphp p($l-gtt(Project)) gt

lttdgt

lttdgt

ltphp

if(isset($_[tid]))

gt

ltspan class=requiredgtltspangt

ltphp

gt

lttdgt

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

63

lttdgt

ltphp

if(isset($_[tid]))

gt

ltselect name=pid id=project

class=chzen-select requiredgt

ltphp

foreach($_[projects] as $pid =gt $ptitle)

print_unescaped(ltoption value= $pid gt $ptitle ltoptiongt)

gt

ltselectgt

ltphp

else

print_unescaped(ltspangt

$_[task_details][proj_title] ltspangt)

print_unescaped(ltinput

id=project type=hidden name=pid value= $_[task_details][pid] gt)

gt

ltspan id=load_members gtltspangt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Title)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text name=title pattern=[a-zA-

Z]([a-zA-Z0-9]s(-s))298[a-zA-Z0-9] title=Title can contain alphabets numbers spaces and

hyphens with 4 to 100 characters First character should be an alphabet and last one can be an

alphabet or a numeral autocomplete=off required autofocus ltphp if(isset($_[tid]))

print_unescaped(value=$_[task_details][title]) gt gt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Task Description)) gt

lttdgt

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

64

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

lttextarea maxlength=3000 name=description

required gtltphp if(isset($_[tid])) p($_[task_details][description]) gtlttextareagt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Priority)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltselect name=priority required gt

ltoption value=1 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 1) print_unescaped(selected) gtgtltphp p($l-gtt(Very High))

gtltoptiongt

ltoption value=2 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 2) print_unescaped(selected) gtgtltphp p($l-gtt(High))

gtltoptiongt

ltoption value=3 ltphp if((isset($_[tid])

ampamp $_[task_details][priority] == 3) || isset($_[tid])) print_unescaped(selected) gtgtltphp p($l-

gtt(Normal)) gtltoptiongt

ltoption value=4 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 4) print_unescaped(selected) gtgtltphp p($l-gtt(Low))

gtltoptiongt

ltoption value=5 ltphp if(isset($_[tid])

ampamp $_[task_details][priority] == 5) print_unescaped(selected) gtgtltphp p($l-gtt(Very Low))

gtltoptiongt

ltselectgt

lttdgt

lttrgt

lttrgt

lttdgt

ltphp p($l-gtt(Deadline)) gt

lttdgt

lttdgt

ltspan class=requiredgtltspangt

lttdgt

lttdgt

ltinput type=text id=deadline_time

name=deadline_time placeholder=MMDDYYYY HHMM autocomplete=off required ltphp

if(isset($_[tid])) print_unescaped(value=

OC_Collaboration_TimeconvertDBTimeToUITimeShort($_[task_details][ending_time]) ) gt

gt

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

65

lttdgt

lttrgt

lttablegt

ltdiv id=submit-form gt

ltinput type=submit value=ltphp p($_[submit_btn_name]) gt

gt

ltdivgt

ltformgt

ltphp

gt

ltdivgt

update_taskphp (user page) ltphp

OCPUsercheckLoggedIn()

OCPAppcheckAppEnabled(collaboration)

OCPAppsetActiveNavigationEntry( collaboration )

OCPUtiladdStyle(collaboration tabs)

OCPUtiladdStyle(collaboration update_task)

OCPUtiladdStyle(collaboration3rdparty jquery-ui-timepicker-

addon)

OCPUtiladdScript(collaboration update_task)

OCPUtiladdScript(collaboration3rdparty jquery-ui-

sliderAccess)

OCPUtiladdScript(collaboration3rdparty jquery-ui-timepicker-

addon)

$l = OC_L10Nget(collaboration)

$tpl = new OCPTemplate(collaboration update_task user)

$bol = OC_Collaboration_ProjectisAdmin()

if($bol == true)

if(isset($_POST[tid]))

$tpl-gtassign(title $l-gtt(Update Task))

$tpl-gtassign(submit_btn_name $l-gtt(Update))

$tpl-gtassign(tid $_POST[tid])

$tpl-gtassign(task_details

OC_Collaboration_TaskreadTask($_POST[tid]))

else

$tpl-gtassign(title $l-gtt(Create Task))

$tpl-gtassign(submit_btn_name $l-gtt(Create))

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

66

$tpl-gtassign(projects

OC_Collaboration_ProjectgetProjects(OC_UsergetUser()))

$tpl-gtprintPage()

else

header(Location

OCPUtillinkToRoute(collaboration_route

array(rel_path=gtdashboard)))

OCPUtilwriteLog(collaboration Permission denied for

OC_UsergetUser() to create task OCPUtilWARN)

exit()

gt

update_taskcss title

text-align center

font-size 20px

text-transform uppercase

font-weight bold

textarea[name=description]

max-width 950px

max-height 500px

width 750px

height 150px

input[name=title]

width 400px

input[name=reason]

width 400px

deadline_time

width 150px

submit-form

text-align center

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

67

required

color red

font-size 16px

skillset_link

color blue

skillset_linkhover

text-decoration underline

create_tablessql

CREATE TABLE `oc_collaboration_project` (

`pid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`starting_date` datetime NOT NULL

`ending_date` datetime NOT NULL

`last_updated` datetime NOT NULL

`completed` tinyint(1) NOT NULL DEFAULT 0

`calendar_id` int(10) unsigned NOT NULL

PRIMARY KEY (`pid`)

UNIQUE KEY `uk_collaboration_project` (`title`)

)

CREATE TABLE `oc_collaboration_post` (

`post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT

NULL

`pid` int(10) unsigned DEFAULT 0

`tid` int(10) unsigned DEFAULT 0

`type` varchar(35) COLLATE utf8_unicode_ci NOT NULL

`time` datetime NOT NULL

`post_to_all` tinyint(1) NOT NULL DEFAULT 1

PRIMARY KEY (`post_id`)

UNIQUE KEY `pk_collaboration_post` (`post_id`)

)

CREATE TABLE `oc_collaboration_task` (

`tid` int(10) unsigned NOT NULL AUTO_INCREMENT

`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL

`description` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`pid` int(10) unsigned NOT NULL

`priority` smallint(5) unsigned NOT NULL

`starting_time` datetime NOT NULL

`ending_time` datetime NOT NULL

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

68

`event_id` int(10) unsigned NOT NULL

PRIMARY KEY (`tid`)

UNIQUE KEY `pk_collaboration_task` (`tid`)

)

CREATE TABLE `oc_collaboration_task_status` (

`tid` int(10) unsigned NOT NULL

`status` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`last_updated_time` datetime NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL

`reason` varchar(300) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_task_status`

(`tid``status``last_updated_time`)

)

CREATE TABLE `oc_collaboration_works_on` (

`pid` int(10) unsigned NOT NULL

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`role` varchar(30) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_works_on` (`pid``member``role`)

)

CREATE TABLE `oc_collaboration_notification` (

`post_id` bigint(20) unsigned NOT NULL

`visible_to` varchar(64) COLLATE utf8_unicode_ci NOT NULL

UNIQUE KEY `pk_collaboration_notification`

(`post_id``visible_to`)

)

CREATE TABLE `oc_collaboration_comment` (

`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

`content` varchar(3000) COLLATE utf8_unicode_ci NOT NULL

`creator` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`post_id` bigint(20) NOT NULL

`time` datetime NOT NULL

PRIMARY KEY (`comment_id`)

UNIQUE KEY `pk_collaboration_comment` (`comment_id`)

)

CREATE TABLE `oc_collaboration_skill` (

`member` varchar(64) COLLATE utf8_unicode_ci NOT NULL

`skill` varchar(30) COLLATE utf8_unicode_ci NOT NULL

`experience` smallint(6) NOT NULL DEFAULT 0

`exp_on_date` date NOT NULL

`expertise` smallint(6) NOT NULL DEFAULT 0

UNIQUE KEY `pk_collaboration_skill` (`member``skill`)

)

change_statusphp (AJAX service page) ltphp

OCPJSONcheckLoggedIn()

OCPJSONcallCheck()

OCPJSONcheckAppEnabled(collaboration)

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

69

if(isset($_POST[tid]) ampamp isset($_POST[event]) ampamp

isset($_POST[reason]))

if(strcasecmp(OC_Collaboration_TaskgetWorkingMember($_POST[

tid]) OC_UsergetUser()) = 0)

throw new Exception(OC_UsergetUser() is trying to

change status of task $_POST[tid])

OC_JSONerror()

exit()

$tid = $_POST[tid]

$title = OC_Collaboration_TaskgetTaskTitle($tid)

$status =

OC_Collaboration_TaskgetStatusFromPerformerEvent($_POST[event])

$creator = OC_UsergetUser()

OC_Collaboration_TaskchangeStatus($tid $title $status

$creator NULL $_POST[reason] false)

OCPJSONsuccess(array())

exit()

OC_Logwrite(collaboration $_POST[tid] $_POST[event]

$_POST[reason] OCPUtilDEBUG)

OC_JSONerror()

exit()

postsphp (Class file) ltphp

class OC_Collaboration_Post

public static function readPosts($member= $project=

$start=0 $count=20)

try

$sql = SELECT `project``title` AS proj_title

`post``title` AS title `post``tid` `post_id`

`content` `creator` `type` `time`

FROM `PREFIXcollaboration_post` AS

post LEFT JOIN `PREFIXcollaboration_project`

AS project ON

(`post``pid`=`project``pid` AND `project``completed`=false)

WHERE ((`post_to_all`=true AND

(`post``pid` IN

(SELECT `works_on``pid` FROM

`PREFIXcollaboration_works_on` AS works_on WHERE

`works_on``member`=)))

(($member == ) OR

(`post``post_id` IN

(SELECT `notification``post_id`

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

70

FROM

`PREFIXcollaboration_notification` AS notification

WHERE `visible_to`=))) )

(($project == ) AND `project``title`=)

ORDER BY `time` DESC

LIMIT $start $count

$query = OCPDBprepare($sql)

$args = array()

$args[0] = $member

$i = 1

if($member = )

$args[$i++] = $member

if($project = )

$args[$i++] = $project

$result = $query-gtexecute($args)

$val = array(array())

for($i = 0 $row = $result-gtfetchRow() $i++)

foreach($row as $key =gt $value)

$val[$i][$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function getPostDetails($post_id)

try

$sql = SELECT FROM `PREFIXcollaboration_post`

WHERE `post_id`=

$query = OCPDBprepare($sql)

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

71

$result = $query-gtexecute(array($post_id))

$val = array()

if($row = $result-gtfetchRow())

foreach($row as $key =gt $value)

$val[$key] = $value

return $val

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function createPost($title $content $creator

$pid $type $viewers=array() $inTransaction=false $tid=NULL)

try

$cnt = count($viewers)

if(isset($viewers) || $cnt == 0)

$post_to_all = true

else

$post_to_all = false

if($inTransaction ampamp $post_to_all)

OCPDBbeginTransaction()

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_post`(`title` `content` `creator` `pid`

`type` `time` `post_to_all` `tid`) VALUES(

CURRENT_TIMESTAMP ))

$query-gtexecute(array($title $content $creator

$pid $type $post_to_all $tid))

$post_id =

OCPDBinsertid(PREFIXcollaboration_post)

if($post_to_all)

$query = OCPDBprepare(INSERT INTO

`PREFIXcollaboration_notification`(`post_id` `visible_to`)

VALUES( ))

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

72

for($i = 0 $i lt $cnt $i++)

$query-gtexecute(array($post_id

$viewers[$i]))

if($inTransaction)

OCPDBcommit()

return $post_id

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostAccessibleToMember($post_id

$member)

try

$query = OCPDBprepare(SELECT `post_id`

FROM

`PREFIXcollaboration_post`

WHERE

`post_id`=

AND

(`post_to_all`=true OR `post_id` IN

(SELECT

`post_id`

FROM

`PREFIXcollaboration_notification`

WHERE

`visible_to`=)))

$result = $query-gtexecute(array($post_id $member))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function isPostEditable($pid)

try

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

73

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `post_id`= AND `type`=)

$result = $query-gtexecute(array($pid Custom

Post))

return ($result-gtfetchRow())

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function deletePost($post_id

$inTransaction=false)

try

if($inTransaction)

OCPDBbeginTransaction()

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$query = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_post` WHERE `post_id`=)

$result = $query-gtexecute(array($post_id))

$result = $del_comment-gtexecute(array($post_id))

if($inTransaction)

OCPDBcommit()

return true

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function removePostsByMember($member

$inTransaction=false)

try

if($inTransaction)

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

74

OCPDBbeginTransaction()

$del_notification = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_notification` WHERE `visible_to`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `creator`=)

$query = OCPDBprepare(SELECT `post_id` FROM

`PREFIXcollaboration_post` WHERE `creator`=)

$result = $query-gtexecute(array($member))

while($row = $result-gtfetchRow())

selfdeletePost($row[post_id] true)

$del_notification-gtexecute(array($member))

$del_comment-gtexecute(array($member))

if($inTransaction)

OCPDBcommit()

catch(Exception $e)

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

public static function editPost($post_id $title $content)

try

OCPDBbeginTransaction()

$query = OCPDBprepare(UPDATE

`PREFIXcollaboration_post` SET `title`= `content`=

`time`=CURRENT_TIMESTAMP WHERE `post_id`=)

$del_comment = OCPDBprepare(DELETE FROM

`PREFIXcollaboration_comment` WHERE `post_id`=)

$result = $query-gtexecute(array($title $content

$post_id))

$result = $del_comment-gtexecute(array($post_id))

OCPDBcommit()

return true

catch(Exception $e)

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

75

OC_Logwrite(collaboration __METHOD__

Exception $e-gtgetMessage() OCPUtilDEBUG)

return false

load the class

new OC_Collaboration_Post()

gt

ta_LKphp (Translation Associative Array Sample) ltphp

$TRANSLATIONS = array(

Success =gt வெறறி Skills are successfully added =gt

திறனகளவெறறிகரமாகசேரககபபடடன Failed =gt சதாலெியுறறது Unable to add skills Please try again later =gt

திறனகளைசேரககஇயலெிலளல தயவுவேயதுபினனரமுயரசேிககவும On s at s =gt s அனறு s மணிககு Edit =gt திருதது Delete =gt நககு Comments =gt கருததுகள Project s =gt திடடம s On s at s by s =gt s அனறு s மணிககு s ஆல View details =gt ெிெரஙகளைககாண Status s =gt நிளல s Username =gt பயனரவபயர Role =gt பஙகு Email =gt மினனஞேல Add Member =gt உறுபபினளரசேர Another project with this title already exists =gt

பிரிவதாறுதிடடமஇசததளலபபிலஉளைது Filter by status =gt நிளலளயளெததுெடிகடடு Show tasksampnbsp =gt பணிகளைககாணபிககampnbsp created by me =gt எனனாலஉருொககபபடட requested to me =gt எனககுசகாரபபடட Sorry no task is available to display =gt மனனிககவும

காணபிககபணிகிளடககெிலளல Kindly give your reason in passive voice =gt

தஙகளகாரணதளதவேயபாடடுெிளனொககியமாகவகாடுகக) gt

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

76

REFERENCES

1 Bin Xu Xiaohu Yang Ma A Role based cross-project collaboration in multiple distributed software design projects Computer Supported Cooperative Work in Design 2008 CSCWD 2008 12th International Conference on vol no pp177182 16-18 April 2008

2 Chao J Student Project Collaboration Using Wikis Software Engineering Education amp Training 2007 CSEET 07 20th Conference on vol no pp255261 3-5 July 2007

3 Moser T Mordinyi R Winkler D Biffl S Engineering project management using the Engineering Cockpit A collaboration platform for project managers and engineers Industrial Informatics (INDIN) 2011 9th IEEE International Conference on vol no pp579584 26-29 July 2011

4 Samson D Okuda T International Internet-based project collaboration a case study Professional Communication Conference 1997 IPCC 97 Proceedings Crossroads in Communication 1997 IEEE International vol no pp393397 22-25 Oct 1997

5 wwwzohocom

6 wwwteamboxcom

7 wwwgithubcom

8 wwwdrupalorg

9 wwwopenatriumcom 10 httpwwww3schoolscomphpphp_mailasp

11 httpphpnetmanualenfunctionmailphp

12 httpwebcheatsheetcomphpsend_email_text_html_attachmentphp

13 httpwwwtutorialspointcomphpphp_sending_emailshtm

14 httpwwwozekismscommmsxmlreceive-mmsindexphpowpn=327

15 httpanswersyahoocomquestionindexqid=20131004152609AA6cZoW

16 httpappsowncloudcomkbCollaborationkbid=2318

17 httppearphpnetmanualenstandardscontrolphp

18 httppearphpnetmanualenstandardssamplephp

19 httpshelpubuntucomcommunityEclipsePDT

20 httpjqueryuicomtabsvertical

21 httpubuntuserverguidecom201304how-to-setup-owncloud-server-5-with-ssl-connectionhtml

22 httpenalexnogardcomsecure-ssl-https-owncloud-centos

23 httpwwww3schoolscomjqueryevent_scrollasp

24 httpin1phpnetarray_keys

25 httpdocstranslatehouseorgprojectstranslate-toolkitenlatestcommandsphp2pohtml

26 httpmarcinfol=pear-devampm=116223202712107

27 httpcakeboxhomeunixnetdocpearMDB2_Schemadocsxml_schema_documentationhtml

28 httpsharadchhetricom20130515installing-owncloud-in-ubuntu-13-04

29 httpblogkarlitschekde201312owncloud-6-is-herehtml

30 httpwwwtutorialspointcomjquerycss-outerwidthhtm

31 httpschromegooglecomwebstoredetailcolorpicker-

09jegimleidpfmpepbfajjlielaheedkdorelated

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

77

32 httpwwww3schoolscomtagstag_datalistasp

33 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri

34 httpdevmysqlcomdocrefman50enstring-functionshtmlfunction_concat

35 httpwwww3schoolscomjqueryjquery_ref_selectorsasp

36 httpwwwerichyndscomblogjquery-ui-multiselect-widget

37 httpenwikipediaorgwikiContent_Security_Policy

38 httpblogschiessleorg20130528introduction-to-the-new-owncloud-encryption-app

39 httpsowncloudcomblogmore-to-security-than-encryption

40 httphtml5doctorcomhtml5-custom-data-attributes

41 httpdocowncloudorgserver50developer_manual-ownCloud 5 Developer manual

42 httpdocowncloudorgserver60developer_manualindexhtml - ownCloud 6 Developer manual

43 httpdocowncloudorgserver50ownCloudAdminManualpdf - ownCloud 5 Admin manual

44 httpdocowncloudorgserver60ownCloudAdminManualpdf - ownCloud 6 Admin manual

45 httpenwikipediaorgwikiGit_(software) 46 httpenwikipediaorgwikiGitHub 47 httpofficemicrosoftcomen-inprojectproject-management-and-ppm-showcase-microsoft-

project-FX103802304aspx 48 httpenwikipediaorgwikiZoho_Office_SuiteZoho_Projects 49 httpsredboothcommediapress 50 httpenwikipediaorgwikiIBM_Rational_Team_Concert 51 httpstackoverflowcomquestions3714558sending-mail-in-php 52 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 53 httpstackoverflowcomquestions15267423php-send-mail-in-localhost 54 httpstackoverflowcomquestions1881409sending-email-through-gmail-smtp-using-php 55 httpstackoverflowcomquestions5265692smtp-server-response-530-5-7-0-must-issue-a-

starttls-command-first 56 httpstackoverflowcomquestions2096113chrome-make-non-resizable-textareas 57 httpstackoverflowcomquestions10613469css-dynamic-height-based-on-child-elements 58 httpstackoverflowcomquestions2487921convert-date-format-yyyy-mm-dd-dd-mm-yyyy 59 httpstackoverflowcomquestions2822713reset-auto-increment-column-value-in-script-

mysql 60 httpstackoverflowcomquestions2615417what-happens-when-auto-increment-on-integer-

column-reaches-the-max-value-in-data 61 httpstackoverflowcomquestions4004205mysql-show-constraints-on-tables-command 62 httpstackoverflowcomquestions7213720how-to-set-a-foreign-key 63 httpstackoverflowcomquestions18110175array-value-find-using-index-partial-string-using-

php 64 httpstackoverflowcomquestions3740961php-shorthand-for-pre-concatenation 65 httpwwww3schoolscomtagstag_datalistasp 66 httpstackoverflowcomquestions5317889sql-keys-mul-vs-pri 67 httpstackoverflowcomquestions8506379how-to-implement-ternary-conditional-operator-

in-mysql 68 httpstackoverflowcomquestions12166753how-to-get-child-element-by-class-name 69 httpwwww3schoolscomjqueryjquery_ref_selectorsasp 70 httpstackoverflowcomquestions20519670sql-query-to-get-the-student-name-with-rank-

between-10-and-20-out-of-100-student 71 httpstackoverflowcomquestions3898130how-to-check-if-a-user-has-scrolled-to-the-bottom 72 httphtml5doctorcomhtml5-custom-data-attributes

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

78

LIST OF PUBLICATIONS

1 Dr J Akilandeswari P Suresh R Sasidharan 2014 Tool for online

project collaboration using private cloud Department of Information

Technology Sona College of Technology proceedings of the National

Conference on ldquoSocial Mobile Analytics and Cloudrdquo Salem India

April 11 2014 pp 51-56

79

PROOF FOR THE PUBLICATIONS

79

PROOF FOR THE PUBLICATIONS