diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..6aba5147 --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "egroupware/projectmanager", + "description": "EGroupware project-management application", + "type": "egroupware-app", + "homepage": "https://www.egroupware.org/", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Ralf Becker", + "email": "rb@egroupware.org" + }, + { + "name": "Hadi Nategh", + "email": "hn@egroupware.org" + }, + { + "name": "Nathan Gray", + "email": "ng@egroupware.org" + } + ], + "require": { + "egroupware/egroupware": "self.version" + } +} diff --git a/inc/class.projectmanager_bo.inc.php b/inc/class.projectmanager_bo.inc.php index a3246904..722fbf4e 100644 --- a/inc/class.projectmanager_bo.inc.php +++ b/inc/class.projectmanager_bo.inc.php @@ -5,9 +5,8 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package projectmanager - * @copyright (c) 2005-13 by Ralf Becker + * @copyright (c) 2005-19 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - * @version $Id$ */ use EGroupware\Api; @@ -150,7 +149,7 @@ class projectmanager_bo extends projectmanager_so * Constructor, calls the constructor of the extended class * * @param int $pm_id id of the project to load, default null - * @param string $instanciate='' comma-separated: constraints,milestones,roles + * @param string $instanciate ='' comma-separated: constraints,milestones,roles * @return projectmanager_bo */ function __construct($pm_id=null,$instanciate='') @@ -184,7 +183,7 @@ function __construct($pm_id=null,$instanciate='') * Instanciates some classes which dont get instanciated by default * * @param string $instanciate comma-separated: constraints,milestones,roles - * @param string $pre='so' class prefix to use, default so + * @param string $pre ='so' class prefix to use, default so */ function instanciate($instanciate,$pre='so') { @@ -203,7 +202,7 @@ function instanciate($instanciate,$pre='so') * * This is implemented in the projectelements class, we call it via ExecMethod * - * @param int|array $pm_id=null int project-id, array of project-id's or null to use $this->pm_id + * @param int|array $pm_id =null int project-id, array of project-id's or null to use $this->pm_id * @return array|boolean with summary information (keys as for a single project-element), false on error */ function pe_summary($pm_id=null) @@ -222,12 +221,13 @@ function pe_summary($pm_id=null) * an whole update or even the update itself might be avoided. * Not used at the moment! * - * @param int $pm_id=null project-id or null to use $this->data['pm_id'] - * @param int $update_necessary=-1 which fields need updating, or'ed PM_ constants from the datasource class - * @param array $data=null data of the project-element if availible + * @param int $pm_id =null project-id or null to use $this->data['pm_id'] + * @param int $update_necessary =-1 which fields need updating, or'ed PM_ constants from the datasource class + * @param array $data =null data of the project-element if availible, currently not used */ function update($pm_id=null,$update_necessary=-1,$data=null) { + unset($data); // not used //error_log(__METHOD__."($pm_id, $update_necessary, ".array2string($data).")"); if (!$pm_id) { @@ -268,8 +268,8 @@ function update($pm_id=null,$update_necessary=-1,$data=null) } if ($save_necessary) { - //error_log(__METHOD__."() calling save"); - $this->save(null,false); // dont touch modification date + $this->save(null, false, // dont touch modification date + true, true); // do not send notification emails, they wont work in shutdown callback and NOT wanted for PE updates } // restore $this->data if (is_array($save_data) && $save_data['pm_id']) @@ -284,11 +284,12 @@ function update($pm_id=null,$update_necessary=-1,$data=null) * reimplemented to automatic create a project-ID / pm_number, if empty * * @param array $keys if given $keys are copied to data before saveing => allows a save as - * @param boolean $touch_modified=true should modification date+user be set, default yes - * @param boolean $do_notify=true should link::notify be called, default yes + * @param boolean $touch_modified =true should modification date+user be set, default yes + * @param boolean $do_notify =true should link::notify be called, default yes + * @param boolean $skip_notification =false should notification(-email) be skiped * @return int 0 on success and errno != 0 else */ - function save($keys=null,$touch_modified=true,$do_notify=true) + function save($keys=null, $touch_modified=true, $do_notify=true, $skip_notification=false) { //error_log(__METHOD__."(".array2string($keys).", touch_modified=$touch_modified, do_notify=$do_notify)"); if ($keys) $this->data_merge($keys); @@ -304,7 +305,7 @@ function save($keys=null,$touch_modified=true,$do_notify=true) $this->data['pm_creator'] = $GLOBALS['egw_info']['user']['account_id']; $this->data['pm_created'] = $this->now_su; } - $check_modified = $this->data['pm_modified'] - $this->tz_offset_s;; + $check_modified = $this->data['pm_modified'] - $this->tz_offset_s; if ($touch_modified) { $this->data['pm_modifier'] = $GLOBALS['egw_info']['user']['account_id']; @@ -355,7 +356,7 @@ function save($keys=null,$touch_modified=true,$do_notify=true) $this->tracking = new projectmanager_tracking($this); $this->tracking->html_content_allow = true; } - if (!$this->tracking->track($this->data,$old,$this->user)) + if (!$this->tracking->track($this->data, $old, $this->user, null, null, $skip_notification)) { return implode(', ',$this->tracking->errors); } @@ -366,7 +367,7 @@ function save($keys=null,$touch_modified=true,$do_notify=true) * deletes a project identified by $keys or the loaded one, reimplemented to remove the project-elements too * * @param array $keys if given array with col => value pairs to characterise the rows to delete - * @param boolean $delete_sources=false true=delete datasources of the elements too (if supported by the datasource), false dont do it + * @param boolean $delete_sources =false true=delete datasources of the elements too (if supported by the datasource), false dont do it * @param boolean $skip_notification Do not send notification of delete * * @return int affected rows, should be 1 if ok, 0 if an error @@ -481,7 +482,7 @@ function db2data($data=null) */ function data2db($data=null) { - if ($intern = !is_array($data)) + if (($intern = !is_array($data))) { $data = &$this->data; } @@ -494,19 +495,50 @@ function data2db($data=null) return $data; } + const DEFAULT_ID_GERERATION_FORMAT = 'P-%Y-%04ix'; + const DEFAULT_ID_GERERATION_FORMAT_SUB = '%px/%04ix'; + /** * generate a project-ID / generated by Api\Config format * - * @param boolean $set_data=true set generated number in $this->data, default true - * @param string $parent='' pm_number of parent + * @param boolean $set_data =true set generated number in $this->data, default true + * @param string $parent ='' pm_number of parent * @return string the new pm_number */ function generate_pm_number($set_data=true,$parent='') { - if(!$this->config['ID_GENERATION_FORMAT']) $this->config['ID_GENERATION_FORMAT'] = 'P-%Y-%04ix'; //this used to be the default - if(!$this->config['ID_GENERATION_FORMAT_SUB']) $this->config['ID_GENERATION_FORMAT_SUB'] = '%px/%04ix'; - $format = $parent === '' ? $this->config['ID_GENERATION_FORMAT'] : $this->config['ID_GENERATION_FORMAT_SUB']; - //echo "format: $format
"; + // migrate evtl. set config to new forced preference (once) + static $forced_prefs = null; + foreach(array( + 'ID_GENERATION_FORMAT' => 'id-generation-format', + 'ID_GENERATION_FORMAT_SUB' => 'id-generation-format-sub' + ) as $config => $pref) + { + if (!empty($this->config[$config])) + { + if (!isset($forced_prefs)) $forced_prefs = new Api\Preferences('forced'); + $forced_prefs->add('projectmanager', $pref, $this->config[$config], 'forced'); + Api\Config::save_value($config, null, 'projectmanager'); + $this->prefs[$pref] = $this->config[$config]; + unset($this->config[$config]); + } + } + if (isset($forced_prefs)) + { + $forced_prefs->save_repository(false, 'forced'); + } + + if ($parent === '') + { + $format = empty($this->prefs['id-generation-format']) ? + self::DEFAULT_ID_GERERATION_FORMAT : $this->prefs['id-generation-format']; + } + else + { + $format = empty($this->prefs['id-generation-format-sub']) ? + self::DEFAULT_ID_GERERATION_FORMAT_SUB : $this->prefs['id-generation-format-sub']; + } + $pm_format = ''; $index = false; for($i = 0;$i < strlen($format);$i++) @@ -616,9 +648,9 @@ function generate_pm_number($set_data=true,$parent='') * Rights are given via owner grants or role based Acl * * @param int $required Acl::READ, Acl::EDIT, Acl::ADD, EGW_ACL_ADD_TIMESHEET, Acl::DELETE, EGW_ACL_BUDGET, EGW_ACL_EDIT_BUDGET - * @param array|int $data=null project or project-id to use, default the project in $this->data - * @param boolean $no_cache=false should a cached value be used, if availible, or not - * @param int $user=null for which user to check, default current user + * @param array|int $data =null project or project-id to use, default the project in $this->data + * @param boolean $no_cache =false should a cached value be used, if availible, or not + * @param int $user =null for which user to check, default current user * @return boolean true if the rights are ok, false if not or null if entry not found */ function check_acl($required,$data=0,$no_cache=false,$user=null) @@ -631,7 +663,10 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) if ($user == $this->user) { $grants = $this->grants; - $rights =& $cache[$pm_id]; + $cached =& $cache[$pm_id]; + $rights =& $cached['rights']; + $private =& $cached['private']; + $grants_from_groups =& $cached['group']; } else // user other then current one, do NO caching at all { @@ -649,7 +684,7 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) if (!is_array($data)) { $data_backup =& $this->data; unset($this->data); - $data =& $this->read($data); + $data =& parent::read($data); $this->data =& $data_backup; unset($data_backup); if (!$data) return null; // $pm_id not found ==> no rights @@ -659,11 +694,12 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) { $data =& $this->data; } + $private = $data['pm_access'] === 'private'; // rights come from owner grants or role based Acl - $memberships = $GLOBALS['egw']->accounts->memberships($this->user); + $memberships = $GLOBALS['egw']->accounts->memberships($user); $member_from_groups = array_intersect_key((array)$data['pm_members'], $memberships); $grants_from_groups = 0; - foreach ($member_from_groups as $member_from_group => $member_acl) { + foreach (array_keys($member_from_groups) as $member_from_group) { $grants_from_groups = $grants_from_groups | (int) $data['pm_members'][$member_from_group]['role_acl']; } @@ -681,7 +717,8 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) } } // private project need either a private grant or a role ACL - if (is_array($data) && $data['pm_access'] === 'private' && !($rights & Acl::PRIVAT) && !$data['pm_members'][$user]['role_acl']) + if ($private && !($rights & Acl::PRIVAT) && !(($data['pm_members'][$user]['role_acl'] & $required) || + $grants_from_groups & $required)) { $access = false; } @@ -805,9 +842,9 @@ function link_query( $pattern, Array &$options = array() ) $need_count = true; } $result = array(); - $order = $this->prefs['link_sort_order']; + $sort_order = $this->prefs['link_sort_order']; // Protect against bad preference value - $order = $this->field2label[reset(explode(' ',$order))] ? $order : 'pm_created DESC'; + $order = $this->field2label[reset(explode(' ', $sort_order))] ? $sort_order : 'pm_created DESC'; foreach((array) $this->search($pattern,false,$order,'','%',false,'OR',$limit,array('pm_status'=>'active'), true, $need_count) as $prj ) { if ($prj['pm_id']) $result[$prj['pm_id']] = $this->link_title($prj); @@ -827,11 +864,13 @@ function link_query( $pattern, Array &$options = array() ) * @param int $id pm_id of project * @param int $check Acl::READ for read and Acl::EDIT for write or delete access * @param string $rel_path path relative to project directory (currently not used) - * @param int $user=null for which user to check, default current user + * @param int $user =null for which user to check, default current user * @return boolean true if access is granted or false otherwise */ function file_access($id,$check,$rel_path,$user=null) { + unset($rel_path); // not used, but required by funciton signature + return $this->check_acl($check,$id,false,$user); } @@ -841,8 +880,8 @@ function file_access($id,$check,$rel_path,$user=null) * A project P is the parent of an other project C, if link_id1=P.pm_id and link_id2=C.pm_id ! * To get all parents of a project C, we use all links to the project, which link_id2=C.pm_id. * - * @param int $pm_id=0 id or 0 to use $this->pm_id - * @param array $ancestors=array() already identified ancestors, default none + * @param int $pm_id =0 id or 0 to use $this->pm_id + * @param array $ancestors =array() already identified ancestors, default none * @return array with ancestors */ public static function &ancestors($pm_id=0,$ancestors=array()) @@ -856,7 +895,7 @@ public static function &ancestors($pm_id=0,$ancestors=array()) $ancestors_cache[$pm_id] = array(); // read all projectmanager entries attached to this one - foreach(Link::get_links('projectmanager',$pm_id,'projectmanager') as $link_id => $data) + foreach(array_keys(Link::get_links('projectmanager',$pm_id,'projectmanager')) as $link_id) { // we need to read the complete link, to know if the entry is a child (link_id1 == pm_id) $link = Link::get_link($link_id); @@ -883,8 +922,8 @@ public static function &ancestors($pm_id=0,$ancestors=array()) * A project P is the parent of an other project C, if link_id1=P.pm_id and link_id2=C.pm_id ! * To get all children of a project C, we use all links to the project, which link_id1=C.pm_id. * - * @param int $pm_id=0 id or 0 to use $this->pm_id - * @param array $children=array() already identified ancestors, default none + * @param int $pm_id =0 id or 0 to use $this->pm_id + * @param array $children =array() already identified ancestors, default none * @return array with children */ function &children($pm_id=0,$children=array()) @@ -898,7 +937,7 @@ function &children($pm_id=0,$children=array()) $children_cache[$pm_id] = array(); // read all projectmanager entries attached to this one - foreach(Link::get_links('projectmanager',$pm_id,'projectmanager') as $link_id => $data) + foreach(array_keys(Link::get_links('projectmanager',$pm_id,'projectmanager')) as $link_id) { // we need to read the complete link, to know if the entry is a child (link_id1 == pm_id) $link = Link::get_link($link_id); @@ -922,11 +961,11 @@ function &children($pm_id=0,$children=array()) /** * Query the project-tree from the DB, project tree is indexed by a path consisting of pm_id's delimited by slashes (/) * - * @param array $filter=array('pm_status' => 'active') filter for the search, default active projects - * @param string $filter_op='AND' AND or OR filters together, default AND - * @param array|string $_parents=null pm_id(s) of parents or null to return whole tree + * @param array $filter =array('pm_status' => 'active') filter for the search, default active projects + * @param string $filter_op ='AND' AND or OR filters together, default AND + * @param array|string $_parents =null pm_id(s) of parents or null to return whole tree * if $_parents is given we also return number of (grand-)children as value for key "children" - * @param int $_pm_id=null pm_id of (current) project, which need to be included for $_parents==='mains' + * @param int $_pm_id =null pm_id of (current) project, which need to be included for $_parents==='mains' * @return array with path => array(pm_id,pm_number,pm_title,pm_parent) pairs */ function get_project_tree($filter = array('pm_status' => 'active'),$filter_op='AND', $_parents=null, $_pm_id=null) @@ -938,9 +977,9 @@ function get_project_tree($filter = array('pm_status' => 'active'),$filter_op='A // if parents given, also return number of (grand-)children if (isset($_parents)) $extra_cols[] = 'children'; - $order = $this->prefs['link_sort_order']; + $sort_order = $this->prefs['link_sort_order']; // Protect against bad preference value - $order = $this->field2label[reset(explode(' ',$order))] ? $order : 'pm_status,pm_number'; + $order = $this->field2label[reset(explode(' ', $sort_order))] ? $sort_order : 'pm_status,pm_number'; // get the children while (($children = $this->search($filter,$this->table_name.'.pm_id AS pm_id,pm_number,pm_title,link_id1 AS pm_parent,pm_status', @@ -1155,8 +1194,8 @@ function date_add($start,$time,$uid) * Copies a project * * @param int $source id of project to copy - * @param int $only_stage=0 0=both stages plus saving the project, 1=copy of the project, 2=copying the element tree - * @param string $parent_number='' number of the parent project, to create a sub-project-number + * @param int $only_stage =0 0=both stages plus saving the project, 1=copy of the project, 2=copying the element tree + * @param string $parent_number ='' number of the parent project, to create a sub-project-number * @return int|boolean successful copy new pm_id or true if $only_stage==1, false otherwise (eg. permission denied) */ function copy($source,$only_stage=0,$parent_number='') @@ -1233,7 +1272,6 @@ function copy($source,$only_stage=0,$parent_number='') } $file = $dir . '/' . $file; } - $copied = array(); Api\Vfs::copy_files($files, "/apps/projectmanager/{$this->data['pm_id']}"); return $boelements->pm_id; @@ -1283,7 +1321,6 @@ function async_notification() //error_log(__METHOD__."() checking with $pref filter '$filter' ($pref_value) for user $user ($email)"); - $params = array('filter' => $filter, 'custom_fields' => true, 'subs' => true); $results = $this->search('',TRUE, '', '', '', FALSE, 'AND', FALSE, Array($filter)); if(!$results || !is_array($results)) { diff --git a/inc/class.projectmanager_datasource.inc.php b/inc/class.projectmanager_datasource.inc.php index 0958b2c9..0c4073e8 100644 --- a/inc/class.projectmanager_datasource.inc.php +++ b/inc/class.projectmanager_datasource.inc.php @@ -140,7 +140,6 @@ function get($data_id) // return the projectmembers as resources $ds['pe_resources'] = $data['pm_members'] ? array_keys($data['pm_members']) : array($data['pm_creator']); $ds['pe_details'] = $data['pm_description']; - $ds['pe_status'] = $data['pm_status']; // use completition calculated by times, if completion is only set from the elements // if re is set, use this diff --git a/inc/class.projectmanager_elements_bo.inc.php b/inc/class.projectmanager_elements_bo.inc.php index a2ff3bd1..b7a32066 100644 --- a/inc/class.projectmanager_elements_bo.inc.php +++ b/inc/class.projectmanager_elements_bo.inc.php @@ -96,7 +96,7 @@ class projectmanager_elements_bo extends projectmanager_elements_so */ var $status_filter = array( 'all' => false, - 'used' => array('new','regular'), + 'used' => '!ignore', 'new' => 'new', 'ignored' => 'ignore', ); @@ -261,12 +261,8 @@ function &update($app,$id,$pe_id=0,$pm_id=null,$update_project=true,$extra_keys= $this->data['pm_id'] = $pm_id; $this->data['pe_id'] = $pe_id; $this->data['pe_overwrite'] = 0; // none set so far + $this->data['pe_status']= 'new'; - // only set status if it's not set by the datasource - if (!isset($this->data['pe_status'])) - { - $this->data['pe_status']= 'new'; - } // if user linking has no ADD rights, the entry is set to ignored if (!$this->check_acl(Acl::ADD,array('pm_id'=>$pm_id)) && ! ($this->check_acl(EGW_ACL_ADD_TIMESHEET, array('pm_id'=>$pm_id)) && $app == 'timesheet') @@ -563,11 +559,11 @@ function save($keys=null,$touch_modified=true,$update_project=-1) * deletes a project-element or all project-elements of a project, reimplemented to remove the link too * * @param array/int $keys if given array with pm_id and/or pe_id or just an integer pe_id - * @param boolean $delete_sources=false true=delete datasources of the elements too (if supported by the datasource), false dont do it - * @param boolean $unlink = false Internal use only, passing false will skip the unlinking steps + * @param boolean $delete_sources =false true=delete datasources of the elements too (if supported by the datasource), false dont do it + * @param boolean $unlink =true Internal use only, passing false will skip the unlinking steps * @return int affected rows, should be 1 if ok, 0 if an error */ - function delete($keys=null,$delete_sources=false, $unlink = true) + function delete($keys=null,$delete_sources=false, $unlink=true) { if ((int) static::DEBUG >= 1 || static::DEBUG === 'delete') { projectmanager_bo::debug_message("projectmanager_elements_bo::delete(" . print_r($keys, true) . ",$delete_sources) this->data[pm_id] = " . $this->data['pm_id']); @@ -927,7 +923,12 @@ function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard= } if ($cumulate_in) // do we have something (timesheets) to cumulate { - foreach(parent::search(array('pe_id' => array_keys($cumulate_in)),false) as $to_cumulate) + foreach(parent::search( + array('pe_id' => array_keys($cumulate_in)) + ,false,'','','',False, 'AND',false,array( + 'pe_status != "ignore"' + ) + ) as $to_cumulate) { // get the row, where the entry cumulates if (($k = array_search($cumulate_in[$to_cumulate['pe_id']],$row_pe_ids)) !== false) diff --git a/inc/class.projectmanager_elements_ui.inc.php b/inc/class.projectmanager_elements_ui.inc.php index 7f59b97b..973825d4 100644 --- a/inc/class.projectmanager_elements_ui.inc.php +++ b/inc/class.projectmanager_elements_ui.inc.php @@ -508,6 +508,12 @@ function get_rows(&$query_in,&$rows,&$readonlys) if ($this->status_filter[$query['filter']]) { $query['col_filter']['pe_status'] = $this->status_filter[$query['filter']]; + + if ($query['col_filter']['pe_status'][0] === '!') + { + $query['col_filter'][] = 'pe_status != '.$this->db->quote(substr($query['col_filter']['pe_status'], 1)); + unset($query['col_filter']['pe_status']); + } } else { @@ -816,15 +822,22 @@ protected function get_actions() 'checkbox' => true, 'isChecked' => 'javaScript:app.projectmanager.is_ignored', 'onExecute' => 'javaScript:app.projectmanager.ignore_action' - ), - 'timesheet' => array( + ) + ); + $group++; + if ($GLOBALS['egw_info']['user']['apps']['timesheet']) + { + $actions['timesheet'] = array( 'icon' => 'timesheet/navbar', 'caption' => 'Timesheet', 'egw_open' => 'add-timesheet', 'allowOnMultiple' => false, - 'group' => ++$group, - ), - 'infolog-subs' => array( + 'group' => $group, + ); + } + if ($GLOBALS['egw_info']['user']['apps']['infolog']) + { + $actions['infolog-subs'] = array( 'icon' => 'infolog/navbar', 'caption' => 'View subs', 'hint' => 'View all subs of this entry', @@ -835,8 +848,8 @@ protected function get_actions() 'url' => 'menuaction=infolog.infolog_ui.index&action=sp&action_id=$id', 'targetapp' => 'infolog', 'hideOnDisabled' => true - ), - ); + ); + } if ($GLOBALS['egw_info']['user']['apps']['filemanager']) { $actions['filemanager'] = array( diff --git a/inc/class.projectmanager_export_elements_csv.inc.php b/inc/class.projectmanager_export_elements_csv.inc.php index c1dd03fa..5ec0eb4a 100644 --- a/inc/class.projectmanager_export_elements_csv.inc.php +++ b/inc/class.projectmanager_export_elements_csv.inc.php @@ -17,7 +17,8 @@ /** * export project elements to CSV */ -class projectmanager_export_elements_csv implements importexport_iface_export_plugin { +class projectmanager_export_elements_csv implements importexport_iface_export_plugin +{ // Used in conversions static $types = array( @@ -37,20 +38,25 @@ class projectmanager_export_elements_csv implements importexport_iface_export_pl * * @param egw_record $_definition */ - public function export( $_stream, importexport_definition $_definition) { + public function export( $_stream, importexport_definition $_definition) + { $options = $_definition->plugin_options; $no_project = true; - if($options['pm_id']) { + if($options['pm_id']) + { $_REQUEST['pm_id'] = $options['pm_id']; $no_project = false; - } elseif(!$GLOBALS['egw_info']['user']['preferences']['projectmanager']['current_project']) { + } + elseif(!$GLOBALS['egw_info']['user']['preferences']['projectmanager']['current_project']) + { // Fake a pm_id so elements_ui works $_REQUEST['pm_id'] = 1; } $ui = new projectmanager_elements_ui(); $selection = array(); - if ($options['selection'] == 'selected') { + if ($options['selection'] == 'selected') + { // ui selection with 'Use search results' $query = $old_query = Api\Cache::getSession('projectmanager', 'projectelements_list'); $query['num_rows'] = -1; // all @@ -161,23 +167,28 @@ public function export( $_stream, importexport_definition $_definition) { // $options['selection'] is array of identifiers as this plugin doesn't // support other selectors atm. - foreach ($selection as $record) { + foreach ($selection as $record) + { if(!is_array($record) || !$record['pe_id']) continue; - if(is_array($record['pe_resources'])) { + if(is_array($record['pe_resources'])) + { $resources = array(); - foreach($record['pe_resources'] as $resource) { + foreach($record['pe_resources'] as $resource) + { $resources[] = Api\Accounts::username($resource); } $record['pe_resources'] = implode(',', $resources); } $element = new projectmanager_egw_record_element(); $element->set_record($record); - if($options['mapping']['pm_title']) { + if($options['mapping']['pm_title']) + { $project = ExecMethod('projectmanager.projectmanager_bo.read', $element->pm_id); $element->pm_title = $project['pm_title']; } - if($options['convert']) { + if($options['convert']) + { importexport_export_csv::convert($element, self::$types); } $this->convert($element, $options); @@ -192,7 +203,8 @@ public function export( $_stream, importexport_definition $_definition) { * * @return string name */ - public static function get_name() { + public static function get_name() + { return lang('Project element CSV export'); } @@ -201,7 +213,8 @@ public static function get_name() { * * @return string descriprion */ - public static function get_description() { + public static function get_description() + { return lang("Exports a list of project elements to a CSV File."); } @@ -210,11 +223,13 @@ public static function get_description() { * * @return string suffix */ - public static function get_filesuffix() { + public static function get_filesuffix() + { return 'csv'; } - public static function get_mimetype() { + public static function get_mimetype() + { return 'text/csv'; } @@ -234,18 +249,29 @@ public function get_filename() } /** - * return Api\Html for options. - * this way the plugin has all opportunities for options tab + * Return array of settings for export dialog + * + * @param $definition Specific definition * + * @return array ( + * name => string, + * content => array, + * sel_options => array, + * readonlys => array, + * preserv => array, + * ) */ - public function get_options_etpl() { + public function get_options_etpl(importexport_definition &$definition = NULL) + { + return false; } /** * returns selectors information * */ - public function get_selectors_etpl() { + public function get_selectors_etpl() + { return array( 'name' => 'projectmanager.export_elements_csv_selectors', 'content' => array( @@ -261,7 +287,8 @@ public function get_selectors_etpl() { * * @param projectmanager_egw_record_project $record Record to be converted */ - protected static function convert(projectmanager_egw_record_element &$record, array $options = array()) { + protected static function convert(projectmanager_egw_record_element &$record, array $options = array()) + { foreach(array('pe_used_time', 'pe_planned_time', 'pe_replanned_time') as $duration) { switch($options[$duration]) { case 'd': @@ -281,7 +308,7 @@ public static function get_egw_record_class() { return 'projectmanager_egw_record_element'; } - + /** * Adjust automatically generated filter fields */ diff --git a/inc/class.projectmanager_export_projects_csv.inc.php b/inc/class.projectmanager_export_projects_csv.inc.php index e6e514bf..12719a25 100644 --- a/inc/class.projectmanager_export_projects_csv.inc.php +++ b/inc/class.projectmanager_export_projects_csv.inc.php @@ -236,11 +236,21 @@ public function get_filename() } /** - * return html for options. - * this way the plugin has all opportunities for options tab + * Return array of settings for export dialog * + * @param $definition Specific definition + * + * @return array ( + * name => string, + * content => array, + * sel_options => array, + * readonlys => array, + * preserv => array, + * ) */ - public function get_options_etpl() { + public function get_options_etpl(importexport_definition &$definition = NULL) + { + return false; } /** diff --git a/inc/class.projectmanager_hooks.inc.php b/inc/class.projectmanager_hooks.inc.php index 9688587a..b51beee5 100644 --- a/inc/class.projectmanager_hooks.inc.php +++ b/inc/class.projectmanager_hooks.inc.php @@ -5,9 +5,8 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package projectmanager - * @copyright (c) 2005-13 by Ralf Becker + * @copyright (c) 2005-19 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - * @version $Id$ */ use EGroupware\Api; @@ -50,6 +49,8 @@ public static function init_static() */ static function search_link($location) { + unset($location); // not used, but required by function signature + return array( 'query' => 'projectmanager.projectmanager_bo.link_query', 'title' => 'projectmanager.projectmanager_bo.link_title', @@ -292,11 +293,12 @@ static private function &_project_tree($pm_id,$filter,$select_link,$label,$title { return null; } - $tree = Api\Html::tree($projects,$selected_project,false,'load_project'); // hack for stupid ie (cant set it as a class!) //if (Api\Header\UserAgent::type() == 'msie') $tree = str_replace('id="foldertree"','id="foldertree" style="overflow: auto; width: 198px;"',$tree); // do it all the time, as we want distinct behavior here - $tree = str_replace('id="foldertree"','id="foldertree" style="overflow: auto; max-width:400px; width:100%; max-height:450px;"',$tree); + $tree = str_replace('id="foldertree"','id="foldertree" style="overflow: auto; max-width:400px; width:100%; max-height:450px;"', + Api\Html::tree($projects,$selected_project,false,'load_project')); + return array( 'text' => "\n".$tree, 'no_lang' => True, @@ -317,6 +319,7 @@ static private function &_project_tree($pm_id,$filter,$select_link,$label,$title */ static private function &_project_selectbox($pm_id,$filter,$select_link,$label,$title) { + unset($filter); // not used anymore $projects = array(); foreach((array)$GLOBALS['projectmanager_bo']->search(array( 'pm_status' => 'active', @@ -666,10 +669,11 @@ static function settings() } catch (Exception $e) { + unset($e); // permission error continue; } - if ($title = $definition->get_title()) + if (($title = $definition->get_title())) { $options[$title] = $title; } @@ -687,7 +691,7 @@ static function settings() 'admin' => False, 'default'=> isset($options[$default_def]) ? $default_def : false, ); - $default_def = 'export-projectmanager-elements'; + $default_defe = 'export-projectmanager-elements'; $settings['nextmatch-export-definition-element'] = array( 'type' => 'select', 'values' => $options, @@ -697,9 +701,36 @@ static function settings() 'run_lang' => false, 'xmlrpc' => True, 'admin' => False, - 'default'=> isset($options[$default_def]) ? $default_def : false, + 'default'=> isset($options[$default_defe]) ? $default_defe : false, ); } + $settings[] = array( + 'type' => 'section', + 'title' => lang('ID generation'), + 'no_lang'=> true, + 'xmlrpc' => False, + 'admin' => False + ); + $settings['id-generation-format'] = array( + 'type' => 'input', + 'size' => 20, + 'label' => 'How should IDs for new projects be generated?', + 'name' => 'id-generation-format', + 'help' => "You can use %Ymd to insert the date of creation. It uses the same syntax like the PHP funktion date(). Other placeholders are %px to insert the parents ID (only at the subprojects generation) or %ix to insert an index. Indices will be increased automatically to avoid duplicated IDs. Every generation format should contain exactly one index! (Exept you are sure that the date will identify the project). You can also use e.g. %04ix. This index will be filled with '0' to 4 digits (e.g. 0001). If you leave out the filling character (e.g. %5ix), the index will be filled with '0'.", + 'xmlrpc' => true, + 'admin' => false, + 'default' => 'P-%Y-%04ix', + ); + $settings['id-generation-format-sub'] = array( + 'type' => 'input', + 'size' => 20, + 'label' => 'How should IDs for new subprojects be generated?', + 'name' => 'id-generation-format-sub', + 'help' => "You can use %Ymd to insert the date of creation. It uses the same syntax like the PHP funktion date(). Other placeholders are %px to insert the parents ID (only at the subprojects generation) or %ix to insert an index. Indices will be increased automatically to avoid duplicated IDs. Every generation format should contain exactly one index! (Exept you are sure that the date will identify the project). You can also use e.g. %04ix. This index will be filled with '0' to 4 digits (e.g. 0001). If you leave out the filling character (e.g. %5ix), the index will be filled with '0'.", + 'xmlrpc' => true, + 'admin' => false, + 'default' => '%px/%04ix', + ); return $settings; } @@ -740,6 +771,8 @@ static function verify_settings($data) */ public static function acl_rights($params) { + unset($params); // not used, but required by function signature + return array( Acl::READ => 'read', Acl::EDIT => 'edit', @@ -759,6 +792,8 @@ public static function acl_rights($params) */ public static function categories($data) { + unset($data); // not used, but required by function signature + return true; } diff --git a/inc/class.projectmanager_import_projects_csv.inc.php b/inc/class.projectmanager_import_projects_csv.inc.php index c8d45223..5ebd7c16 100644 --- a/inc/class.projectmanager_import_projects_csv.inc.php +++ b/inc/class.projectmanager_import_projects_csv.inc.php @@ -26,7 +26,7 @@ class projectmanager_import_projects_csv extends importexport_basic_import_csv { * @var string */ static $record_class = 'projectmanager_egw_record_project'; - + public static $special_fields = array( 'parent' => 'Parent project, use Project-ID or Title', ); @@ -54,7 +54,7 @@ public function init(importexport_definition &$_definition ) // Get the tracker for changes $this->tracking = new projectmanager_tracking($this->bo); - + // List roles as account type $roles = new projectmanager_roles_so(); $role_list = $roles->query_list(); @@ -202,7 +202,7 @@ protected function action ( $_action, importexport_iface_egw_record &$record, $r if(count($changed) == 0) { return true; } - + // Fall through case 'insert' : if($_action == 'insert') { @@ -216,7 +216,7 @@ protected function action ( $_action, importexport_iface_egw_record &$record, $r } else { // Members needs special setting, from projectmanager_ui:173 $this->bo->data['pm_members'] = $_data['pm_members']; - + $result = $this->bo->save( $_data, true, false ); if($result) { $this->errors[$record_num] = $result; @@ -236,7 +236,7 @@ protected function action ( $_action, importexport_iface_egw_record &$record, $r } default: throw new Api\Exception('Unsupported action'); - + } } @@ -300,7 +300,8 @@ public static function get_filesuffix() { * preserv => array, * ) */ - public function get_options_etpl() { + public function get_options_etpl(importexport_definition &$definition=null) + { // lets do it! } diff --git a/inc/class.projectmanager_merge.inc.php b/inc/class.projectmanager_merge.inc.php index 9544892b..6955997f 100644 --- a/inc/class.projectmanager_merge.inc.php +++ b/inc/class.projectmanager_merge.inc.php @@ -274,7 +274,7 @@ protected function get_replacements($id,&$content=null) $replacements += $this->projectmanager_replacements($this->pm_id, '', $content); $replacements += $this->get_erole_replacements($content); - + return empty($replacements) ? false : $replacements; } @@ -307,7 +307,7 @@ protected function get_erole_replacements(&$content) } } } - + // Strip unassigned erole tags $matches = array(); preg_match_all('@\$\$erole/([A-Za-z0-9_]+)(/?(?:[^\$])*)?\$\$@s',$content,$matches); @@ -318,7 +318,7 @@ protected function get_erole_replacements(&$content) $replacements[$missing_erole] = ''; } } - + return $replacements; } @@ -487,11 +487,7 @@ public function projectmanager_replacements($project,$prefix='',&$content='') $replacements['$$'.($prefix ? $prefix.'/':'').$name.'$$'] = $value; } // Project links - check content first, finding all the links is expensive - $links = $this->get_all_links('projectmanager', $project['pm_id'], $prefix, $content); - foreach($links as $placeholder => $replacement) - { - $replacements['$$'.$placeholder.'$$'] = $replacement; - } + $replacements += $this->get_all_links('projectmanager', $project['pm_id'], $prefix, $content); return $replacements; diff --git a/inc/class.projectmanager_tracking.inc.php b/inc/class.projectmanager_tracking.inc.php index 1bc10e27..94e3a2c8 100644 --- a/inc/class.projectmanager_tracking.inc.php +++ b/inc/class.projectmanager_tracking.inc.php @@ -92,7 +92,7 @@ function __construct(projectmanager_bo $bo) function get_config($name,$data,$old=null) { $projectmanager = $data['pm_id']; - + unset($old); // not used, but required function signature switch($name) { @@ -164,7 +164,7 @@ function get_subject($data,$old) function get_message($data,$old) { if ($data['message']) return $data['message']; // async notification - + if (!$data['pm_modified'] || !$old) { return lang('New Project submitted by %1 at %2', @@ -185,8 +185,6 @@ function get_message($data,$old) */ function get_details($data,$receiver=null) { - unset($receiver); // not used, but required function signature - $members = array(); if ($data['pm_members']) { @@ -231,7 +229,7 @@ function get_details($data,$receiver=null) ); // add custom fields - $details += $this->get_customfields($data); + $details += $this->get_customfields($data, null, $receiver); return $details; } diff --git a/inc/class.projectmanager_ui.inc.php b/inc/class.projectmanager_ui.inc.php index 2fbc01d4..cef2b2d2 100644 --- a/inc/class.projectmanager_ui.inc.php +++ b/inc/class.projectmanager_ui.inc.php @@ -52,15 +52,26 @@ class projectmanager_ui extends projectmanager_bo */ var $filter_labels; + /** + * Etemplate + */ + var $template; + /** * Constructor, calls the constructor of the extended class * * @return projectmanager_ui */ - function __construct() + function __construct(Etemplate $etemplate = null) { parent::__construct(); + if($etemplate === null) + { + $etemplate = new Etemplate(); + } + $this->template = $etemplate; + static::$status_labels = array( 'active' => lang('Active'), 'nonactive' => lang('Nonactive'), @@ -110,19 +121,20 @@ public function index(array $content = null) $pm_id = $_GET['pm_id'] = $GLOBALS['egw_info']['user']['preferences']['projectmanager']['current_project'] = 0; } - if($this->check_acl(Acl::READ, $pm_id)) + if(!$this->check_acl(Acl::READ, $pm_id)) { - $this->pm_list(); + $this->data = array(); + } + $this->pm_list(); - $element_list = new projectmanager_elements_ui(); - $element_list->index(); + $element_list = new projectmanager_elements_ui(); + $element_list->index(); - $gantt = new projectmanager_gantt(); - $gantt->chart(); + $gantt = new projectmanager_gantt(); + $gantt->chart(); - $prices = new projectmanager_pricelist_ui(); - $prices->index(); - } + $prices = new projectmanager_pricelist_ui(); + $prices->index(); } /** @@ -143,7 +155,7 @@ function edit($content=null,$view=false) { if ((int) $this->debug >= 1 || $this->debug == 'edit') $this->debug_message("projectmanager_ui::edit(,$view) content=".print_r($content,true)); - $tpl = new Etemplate('projectmanager.edit'); + $this->template->read('projectmanager.edit'); if (is_array($content)) { @@ -424,7 +436,7 @@ function edit($content=null,$view=false) 'customfields' => $view, 'general_avail[1]' => !$GLOBALS['egw_info']['user']['apps']['admin'], ); - if ($readonlys['delete']) $tpl->disable_cells('delete_sources'); + if ($readonlys['delete']) $this->template->disable_cells('delete_sources'); if (!$this->check_acl(EGW_ACL_EDIT_BUDGET)) { @@ -530,7 +542,7 @@ function edit($content=null,$view=false) $GLOBALS['egw_info']['flags']['app_header'] = lang('projectmanager') . ' - ' . ($this->data['pm_id'] ? ($view ? lang('View project') : lang('Edit project')) : lang('Add project')); - $tpl->exec('projectmanager.projectmanager_ui.edit',$content,$sel_options,$readonlys,$preserv,2); + $this->template->exec('projectmanager.projectmanager_ui.edit',$content,$sel_options,$readonlys,$preserv,2); } /** @@ -685,7 +697,7 @@ function pm_list($content=null,$msg='') { if ((int) $this->debug >= 1 || $this->debug == 'index') $this->debug_message("projectmanager_ui::index(,$msg) content=".print_r($content,true)); - $tpl = new Etemplate('projectmanager.list'); + $this->template->read('projectmanager.list'); if ($_GET['msg']) $msg = $_GET['msg']; @@ -725,7 +737,7 @@ function pm_list($content=null,$msg='') switch($action) { case 'ganttchart': - $tpl->location(array( + $this->template->location(array( 'menuaction' => 'projectmanager.projectmanager_ganttchart.show', 'pm_id' => $pm_id, )); @@ -805,13 +817,13 @@ function pm_list($content=null,$msg='') $sel_options = array( 'project_tree' => $this->ajax_tree(0, true,$this->prefs['current_project']) ); - $tpl->setElementAttribute('project_tree','actions', projectmanager_ui::project_tree_actions()); + $this->template->setElementAttribute('project_tree','actions', projectmanager_ui::project_tree_actions()); if($this->prefs['current_project']) { $content['project_tree'] = 'projectmanager::'.$this->prefs['current_project']; } $GLOBALS['egw_info']['flags']['app_header'] = lang('projectmanager').' - '.lang('Projectlist'); - $tpl->exec('projectmanager.projectmanager_ui.pm_list',$content,$sel_options); + $this->template->exec('projectmanager.projectmanager_ui.pm_list',$content,$sel_options); } /** diff --git a/inc/class.projectmanager_widget.inc.php b/inc/class.projectmanager_widget.inc.php index 8082087e..312c77ca 100644 --- a/inc/class.projectmanager_widget.inc.php +++ b/inc/class.projectmanager_widget.inc.php @@ -91,6 +91,10 @@ function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) list($rows,$pm_id_var,$price_var) = explode(',',$cell['size']); if (!$pm_id_var) $pm_id_var = 'pm_id'; // where are the pm_id(s) storered $pm_ids = $tmpl->content[$pm_id_var]; + if(is_null($pm_ids)) + { + $pm_ids = false; + } $cell['sel_options'] = array(); foreach((array) $pm_ids as $pm_id) { diff --git a/js/app.js b/js/app.js index cfe54c89..2a96ab7d 100644 --- a/js/app.js +++ b/js/app.js @@ -252,7 +252,10 @@ app.classes.projectmanager = AppJS.extend( } // Show selected sub-template - jQuery(this.views[what].etemplate.DOMContainer).show(); + if(this.views[what].etemplate) + { + jQuery(this.views[what].etemplate.DOMContainer).show(); + } // Set header this.egw.app_header(this.egw.lang(this.views[what].sidemenu),'projectmanager'); @@ -826,12 +829,12 @@ app.classes.projectmanager = AppJS.extend( } egw.openPopup(egw.link('/index.php', extra),600,450,'','filemanager'); }, - + /** * Add a new price to a pricelist - * + * * Used by the add button on the pricelist index - * + * * @param {et2_widget} widget */ add_price: function add_price(widget) diff --git a/js/dhtmlxGantt/codebase/dhtmlxgantt.js b/js/dhtmlxGantt/codebase/dhtmlxgantt.js index 1466f4ac..9c88a9d7 100644 --- a/js/dhtmlxGantt/codebase/dhtmlxgantt.js +++ b/js/dhtmlxGantt/codebase/dhtmlxgantt.js @@ -5,304 +5,304 @@ dhtmlxGantt v.4.0.0 Stardard This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. (c) Dinamenta, UAB. -*/ -gantt={version:"4.0.0"},gantt.event=function(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},gantt.eventRemove=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)},gantt._eventable=function(t){t._silent_mode=!1,t._silentStart=function(){this._silent_mode=!0},t._silentEnd=function(){this._silent_mode=!1},t.attachEvent=function(t,e,n){return t="ev_"+t.toLowerCase(),this[t]||(this[t]=new this._eventCatcher(n||this)), -t+":"+this[t].addEvent(e)},t.callEvent=function(t,e){return this._silent_mode?!0:(t="ev_"+t.toLowerCase(),this[t]?this[t].apply(this,e):!0)},t.checkEvent=function(t){return!!this["ev_"+t.toLowerCase()]},t._eventCatcher=function(t){var e=[],n=function(){for(var n=!0,a=0;athis.config.sensitivity){if(this.config.started=!0,this.config.ignore=!1,this.callEvent("onBeforeDragStart",[t,this.config.original_target])===!1)return this.config.ignore=!0,!0;var r=this.config.marker=document.createElement("div");r.className="gantt_drag_marker", -r.innerHTML="Dragging object",document.body.appendChild(r),this.callEvent("onAfterDragStart",[t,this.config.original_target])}else this.config.ignore=!0}this.config.ignore||(e.pos=this.getPosition(e),this.config.marker.style.left=e.pos.x+"px",this.config.marker.style.top=e.pos.y+"px",this.callEvent("onDragMove",[t,e]))},dragEnd:function(t){this.config.marker&&(this.config.marker.parentNode.removeChild(this.config.marker),this.config.marker=null,this.callEvent("onDragEnd",[])),document.body.className=document.body.className.replace(" gantt_noselect",""); -},getPosition:function(t){var e=0,n=0;return t=t||window.event,t.pageX||t.pageY?(e=t.pageX,n=t.pageY):(t.clientX||t.clientY)&&(e=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,n=t.clientY+document.body.scrollTop+document.documentElement.scrollTop),{x:e,y:n}}},gantt._init_grid=function(){this._click.gantt_close=this.bind(function(t,e,n){return this.close(e),!1},this),this._click.gantt_open=this.bind(function(t,e,n){return this.open(e),!1},this),this._click.gantt_row=this.bind(function(t,e,n){ -if(null!==e){var a=this.getTask(e);this.config.scroll_on_click&&this.showDate(a.start_date),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=this.bind(function(t,e,n){var a=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[a,t])){if("add"==a)return void this._click.gantt_add(t,this.config.root_id);if(this.config.sort){for(var i,s=a,r=0;this.config.columns.length;r++)if(this.config.columns[r].name==a){i=this.config.columns[r];break}if(i&&void 0!==i.sort&&i.sort!==!0&&(s=i.sort, -!s))return;var o=this._sort&&this._sort.direction&&this._sort.name==a?this._sort.direction:"desc";o="desc"==o?"asc":"desc",this._sort={name:a,direction:o},this.sort(s,"desc"==o)}}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=this.bind(function(t,e,n){if(!this.config.readonly){var a={};return this.createTask(a,e?e:this.config.root_id),!1}},this),this._init_resize&&this._init_resize()},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(), -this._render_grid_header())},gantt._calc_grid_width=function(){for(var t=this.getGridColumns(),e=0,n=[],a=[],i=0;i0?n.length:a.length>0?a.length:1);if(n.length>0)for(var o=r/(n.length?n.length:1),i=0;in+_&&(o.width=_=this._get_grid_width()-n),n+=_;var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),g="width:"+(_-(r?1:0))+"px;",h=o.label||a["column_"+o.name]; -h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=i+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("")},gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.getGridColumns(),n=[],a=0;a":(s=o.template?o.template(t):t[o.name], -s instanceof Date&&(s=this.templates.date_grid(s,t)),s="
"+s+"
");var _="gantt_cell"+(r?" gantt_last_cell":""),d="";if(o.tree){for(var l=0;l"+d+s+"", -n.push(i)}var _=t.$index%2===0?"":" odd";if(_+=t.$transparent?" gantt_transparent":"",_+=t.$dataprocessor_class?" "+t.$dataprocessor_class:"",this.templates.grid_row_class){var c=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);c&&(_+=" "+c)}this.getState().selected_task==t.id&&(_+=" gantt_selected");var u=document.createElement("div");return u.className="gantt_row"+_,u.style.height=this.config.row_height+"px",u.style.lineHeight=gantt.config.row_height+"px",u.setAttribute(this.config.task_attribute,t.id), -u.innerHTML=n.join(""),u},gantt.open=function(t){gantt._set_item_state(t,!0),this.callEvent("onTaskOpened",[t])},gantt.close=function(t){gantt._set_item_state(t,!1),this.callEvent("onTaskClosed",[t])},gantt._set_item_state=function(t,e){t&&this._pull[t]&&(this._pull[t].$open=e,gantt._refresh_on_toggle_element(t))},gantt._refresh_on_toggle_element=function(t){this.refreshData()},gantt._is_grid_visible=function(){return this.config.grid_width&&this.config.show_grid},gantt._get_grid_width=function(){ -return this._is_grid_visible()?this._is_chart_visible()?this.config.grid_width:this._x:0},gantt.moveTask=function(t,e,n){var a=arguments[3];if(a){if(a===t)return;n=this.getParent(a),e=this.getTaskIndex(a)}if(t!=n){n=n||this.config.root_id;var i=this.getTask(t),s=this.getParent(i.id),r=(this.getChildren(this.getParent(i.id)),this.getChildren(n));if(-1==e&&(e=r.length+1),s==n){var o=this.getTaskIndex(t);if(o==e)return}if(this.callEvent("onBeforeTaskMove",[t,n,e])!==!1){this._replace_branch_child(s,t), -r=this.getChildren(n);var _=r[e];_?r=r.slice(0,e).concat([t]).concat(r.slice(e)):r.push(t),this.setParent(i,n),this._branches[n]=r,i.$level=this.calculateTaskLevel(i),1*e>0?a?i.$drop_target=(this.getTaskIndex(t)>this.getTaskIndex(a)?"next:":"")+a:i.$drop_target="next:"+gantt.getPrevSibling(t):r[1*e+1]?i.$drop_target=r[1*e+1]:i.$drop_target=n,this.callEvent("onAfterTaskMove",[t,n,e])&&this.refreshData()}}},gantt._init_dnd=function(){var t=new gantt._DnD(this.$grid_data,{updates_per_second:60});this.defined(this.config.dnd_sensitivity)&&(t.config.sensitivity=this.config.dnd_sensitivity), -t.attachEvent("onBeforeDragStart",this.bind(function(e,n){var a=this._locateHTML(n);if(!a)return!1;this.hideQuickInfo&&this._hideQuickInfo();var i=this.locate(n),s=gantt.getTask(i);return gantt._is_readonly(s)?!1:(t.config.initial_open_state=s.$open,this.callEvent("onRowDragStart",[i,n.target||n.srcElement,n])?void 0:!1)},this)),t.attachEvent("onAfterDragStart",this.bind(function(e,n){var a=this._locateHTML(n);t.config.marker.innerHTML=a.outerHTML,t.config.id=this.locate(n);var i=this.getTask(t.config.id); -t.config.index=this.getTaskIndex(t.config.id),t.config.parent=i.parent,i.$open=!1,i.$transparent=!0,this.refreshData()},this)),t.lastTaskOfLevel=function(t){for(var e=gantt._order,n=gantt._pull,a=null,i=0,s=e.length;s>i;i++)n[e[i]].$level==t&&(a=n[e[i]]);return a?a.id:null},t._getGridPos=this.bind(function(t){var e=this._get_position(this.$grid_data),n=e.x,a=t.pos.y-10;return ae.y+this.$grid_data.offsetHeight-this.config.row_height&&(a=e.y+this.$grid_data.offsetHeight-this.config.row_height), -e.x=n,e.y=a,e},this),t.attachEvent("onDragMove",this.bind(function(e,n){function a(t,e){return t.$level==e.$level||gantt.config.order_branch_free}var i=t.config,s=t._getGridPos(n);i.marker.style.left=s.x+10+"px",i.marker.style.top=s.y+"px",s=t._getGridPos(n);var r=(s.x,s.y),o=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.elementFromPoint(s.x-_+1,r-o),l=this.locate(d),g=this.getTask(t.config.id);if(this.isTaskExists(l)||(l=t.lastTaskOfLevel(gantt.config.order_branch_free?g.$level:0), -l==t.config.id&&(l=null)),this.isTaskExists(l)){var h=gantt._get_position(d),c=this.getTask(l);if(h.y+d.offsetHeight/2=0;)p=this._pull[this._order[u-v]],v++;if(g.id==c.id)return;a(c,g)&&g.id!=c.id?this.moveTask(g.id,0,0,c.id):c.$level!=g.$level-1||gantt.getChildren(c.id).length?p&&a(p,g)&&g.id!=p.id&&this.moveTask(g.id,-1,this.getParent(p.id)):this.moveTask(g.id,0,c.id); -}return!0},this)),t.attachEvent("onDragEnd",this.bind(function(){var e=this.getTask(t.config.id);this.callEvent("onBeforeRowDragEnd",[t.config.id,t.config.parent,t.config.index])===!1?(this.moveTask(t.config.id,t.config.index,t.config.parent),e.$drop_target=null):this.callEvent("onRowDragEnd",[t.config.id,e.$drop_target]),e.$transparent=!1,e.$open=t.config.initial_open_state,this.refreshData()},this))},gantt.getGridColumns=function(){return this.config.columns},gantt._has_children=function(t){return this.getChildren(t).length>0; -},gantt._scale_helpers={getSum:function(t,e,n){void 0===n&&(n=t.length-1),void 0===e&&(e=0);for(var a=0,i=e;n>=i;i++)a+=t[i];return a},setSumWidth:function(t,e,n,a){var i=e.width;void 0===a&&(a=i.length-1),void 0===n&&(n=0);var s=a-n+1;if(!(n>i.length-1||0>=s||a>i.length-1)){var r=this.getSum(i,n,a),o=t-r;this.adjustSize(o,i,n,a),this.adjustSize(-o,i,a+1),e.full_width=this.getSum(i)}},splitSize:function(t,e){for(var n=[],a=0;e>a;a++)n[a]=0;return this.adjustSize(t,n),n},adjustSize:function(t,e,n,a){ -n||(n=0),void 0===a&&(a=e.length-1);for(var i=a-n+1,s=this.getSum(e,n,a),r=0,o=n;a>=o;o++){var _=Math.floor(t*(s?e[o]/s:1/i));s-=e[o],t-=_,i--,e[o]+=_,r+=_}e[e.length-1]+=t},sortScales:function(t){function e(t,e){var n=new Date(1970,0,1);return gantt.date.add(n,e,t)-n}t.sort(function(t,n){return e(t.unit,t.step)e(n.unit,n.step)?-1:0})},primaryScale:function(){return gantt._init_template("date_scale"),{unit:gantt.config.scale_unit,step:gantt.config.step,template:gantt.templates.date_scale, -date:gantt.config.date_scale,css:gantt.templates.scale_cell_class}},prepareConfigs:function(t,e,n,a){for(var i=this.splitSize(a,t.length),s=n,r=[],o=t.length-1;o>=0;o--){var _=o==t.length-1,d=this.initScaleConfig(t[o]);_&&this.processIgnores(d),this.initColSizes(d,e,s,i[o]),this.limitVisibleRange(d),_&&(s=d.full_width),r.unshift(d)}for(var o=0;oe;e++)t.left.push((t.width[e-1]||0)+(t.left[e-1]||0)); -},_ignore_time_config:function(t){return this.config.skip_off_time?!this.isWorkTime(t):!1},processIgnores:function(t){t.ignore_x={},t.display_count=t.count},initColSizes:function(t,e,n,a){var i=n;t.height=a;var s=void 0===t.display_count?t.count:t.display_count;s||(s=1),t.col_width=Math.floor(i/s),e&&t.col_width=g;g++)+r[g]!=+s[l]||(i&&i.apply(this,[d,l,o,g]),o=g,d=l)},alineScaleColumns:function(t,e,n,a){this.iterateScales(t,e,n,a,function(n,a,i,s){ -var r=this.getSum(t.width,i,s-1),o=this.getSum(e.width,n,a-1);o!=r&&this.setSumWidth(r,e,n,a-1)})},eachColumn:function(t,e,n){var a=new Date(gantt._min_date),i=new Date(gantt._max_date);gantt.date[t+"_start"]&&(a=gantt.date[t+"_start"](a));var s=new Date(a);for(+s>=+i&&(i=gantt.date.add(s,e,t));+i>+s;){n.call(this,new Date(s));var r=s.getTimezoneOffset();s=gantt.date.add(s,e,t),s=gantt._correct_dst_change(s,r,e,t),gantt.date[t+"_start"]&&(s=gantt.date[t+"_start"](s))}},limitVisibleRange:function(t){ -var e=t.trace_x,n=0,a=t.width.length-1,i=0;if(+e[0]<+gantt._min_date&&n!=a){var s=Math.floor(t.width[0]*((e[1]-gantt._min_date)/(e[1]-e[0])));i+=t.width[0]-s,t.width[0]=s,e[0]=new Date(gantt._min_date)}var r=e.length-1,o=e[r],_=gantt.date.add(o,t.step,t.unit);if(+_>+gantt._max_date&&r>0){var s=t.width[r]-Math.floor(t.width[r]*((_-gantt._max_date)/(_-o)));i+=t.width[r]-s,t.width[r]=s}if(i){for(var d=this.getSum(t.width),l=0,g=0;gt.x?this.dirs.right:e.y>t.y?this.dirs.down:this.dirs.up; -}},gantt._y_from_ind=function(t){return t*gantt.config.row_height},gantt._path_builder={path:[],clear:function(){this.path=[]},current:function(){return this.path[this.path.length-1]},point:function(t){return t?(this.path.push(gantt.copy(t)),t):this.current()},point_to:function(t,e,n){n=n?{x:n.x,y:n.y}:gantt.copy(this.point());var a=gantt._drawer.dirs;switch(t){case a.left:n.x-=e;break;case a.right:n.x+=e;break;case a.up:n.y-=e;break;case a.down:n.y+=e}return this.point(n)},get_points:function(t){ -var e=this.get_endpoint(t),n=gantt.config,a=e.e_y-e.y,i=e.e_x-e.x,s=gantt._drawer.dirs;this.clear(),this.point({x:e.x,y:e.y});var r=2*n.link_arrow_size,o=e.e_x>e.x;if(t.type==gantt.config.links.start_to_start)this.point_to(s.left,r),o?(this.point_to(s.down,a),this.point_to(s.right,i)):(this.point_to(s.right,i),this.point_to(s.down,a)),this.point_to(s.right,r);else if(t.type==gantt.config.links.finish_to_start)if(o=e.e_x>e.x+2*r,this.point_to(s.right,r),o)i-=r,this.point_to(s.down,a),this.point_to(s.right,i);else{ -i-=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)),this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.right,r)}else if(t.type==gantt.config.links.finish_to_finish)this.point_to(s.right,r),o?(this.point_to(s.right,i),this.point_to(s.down,a)):(this.point_to(s.down,a),this.point_to(s.right,i)),this.point_to(s.left,r);else if(t.type==gantt.config.links.start_to_finish)if(o=e.e_x>e.x-2*r,this.point_to(s.left,r),o){i+=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)), -this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.left,r)}else i+=r,this.point_to(s.down,a),this.point_to(s.right,i);return this.path},get_endpoint:function(t){var e=gantt.config.links,n=!1,a=!1;t.type==e.start_to_start?n=a=!0:t.type==e.finish_to_finish?n=a=!1:t.type==e.finish_to_start?(n=!1,a=!0):t.type==e.start_to_finish?(n=!0,a=!1):gantt.assert(!1,"Invalid link type");var i=gantt._get_task_visible_pos(gantt._pull[t.source],n),s=gantt._get_task_visible_pos(gantt._pull[t.target],a); -return{x:i.x,e_x:s.x,y:i.y,e_y:s.y}}},gantt._init_links_dnd=function(){function t(t,e,n){var a=gantt._get_task_pos(t,!!e);return a.y+=gantt._get_task_height()/2,n=n||0,a.x+=(e?-1:1)*n,a}function e(t){var e=a(),n=["gantt_link_tooltip"];e.from&&e.to&&(gantt.isLinkAllowed(e.from,e.to,e.from_start,e.to_start)?n.push("gantt_allowed_link"):n.push("gantt_invalid_link"));var i=gantt.templates.drag_link_class(e.from,e.from_start,e.to,e.to_start);i&&n.push(i);var s="
"+gantt.templates.drag_link(e.from,e.from_start,e.to,e.to_start)+"
"; -t.innerHTML=s}function n(t,e){t.style.left=e.x+5+"px",t.style.top=e.y+5+"px"}function a(){return{from:gantt._link_source_task,to:gantt._link_target_task,from_start:gantt._link_source_task_start,to_start:gantt._link_target_task_start}}function i(){gantt._link_source_task=gantt._link_source_task_start=gantt._link_target_task=null,gantt._link_target_task_start=!0}function s(t,e,n,i){var s=_(),d=a(),l=["gantt_link_direction"];gantt.templates.link_direction_class&&l.push(gantt.templates.link_direction_class(d.from,d.from_start,d.to,d.to_start)); -var g=Math.sqrt(Math.pow(n-t,2)+Math.pow(i-e,2));if(g=Math.max(0,g-3)){s.className=l.join(" ");var h=(i-e)/(n-t),c=Math.atan(h);2==o(t,n,e,i)?c+=Math.PI:3==o(t,n,e,i)&&(c-=Math.PI);var u=Math.sin(c),f=Math.cos(c),p=Math.round(e),v=Math.round(t),m=["-webkit-transform: rotate("+c+"rad)","-moz-transform: rotate("+c+"rad)","-ms-transform: rotate("+c+"rad)","-o-transform: rotate("+c+"rad)","transform: rotate("+c+"rad)","width:"+Math.round(g)+"px"];if(-1!=window.navigator.userAgent.indexOf("MSIE 8.0")){ -m.push('-ms-filter: "'+r(u,f)+'"');var k=Math.abs(Math.round(t-n)),b=Math.abs(Math.round(i-e));switch(o(t,n,e,i)){case 1:p-=b;break;case 2:v-=k,p-=b;break;case 3:v-=k}}m.push("top:"+p+"px"),m.push("left:"+v+"px"),s.style.cssText=m.join(";")}}function r(t,e){return"progid:DXImageTransform.Microsoft.Matrix(M11 = "+e+",M12 = -"+t+",M21 = "+t+",M22 = "+e+",SizingMethod = 'auto expand')"}function o(t,e,n,a){return e>=t?n>=a?1:4:n>=a?2:3}function _(){return l._direction||(l._direction=document.createElement("div"), -gantt.$task_links.appendChild(l._direction)),l._direction}function d(){l._direction&&(l._direction.parentNode&&l._direction.parentNode.removeChild(l._direction),l._direction=null)}var l=new gantt._DnD(this.$task_bars,{sensitivity:0,updates_per_second:60}),g="task_left",h="task_right",c="gantt_link_point",u="gantt_link_control";l.attachEvent("onBeforeDragStart",gantt.bind(function(e,n){var a=n.target||n.srcElement;if(i(),gantt.getState().drag_id)return!1;if(gantt._locate_css(a,c)){gantt._locate_css(a,g)&&(gantt._link_source_task_start=!0); -var s=gantt._link_source_task=this.locate(n),r=gantt.getTask(s);if(gantt._is_readonly(r))return i(),!1;var o=0;return gantt._get_safe_type(r.type)==gantt.config.types.milestone&&(o=(gantt._get_visible_milestone_width()-gantt._get_milestone_width())/2),this._dir_start=t(r,!!gantt._link_source_task_start,o),!0}return!1},this)),l.attachEvent("onAfterDragStart",gantt.bind(function(t,n){e(l.config.marker)},this)),l.attachEvent("onDragMove",gantt.bind(function(a,i){var r=l.config,o=l.getPosition(i);n(r.marker,o); -var _=gantt._is_link_drop_area(i),d=gantt._link_target_task,g=gantt._link_landing,c=gantt._link_target_task_start,f=gantt.locate(i),p=!0;if(_&&(p=!gantt._locate_css(i,h),_=!!f),gantt._link_target_task=f,gantt._link_landing=_,gantt._link_target_task_start=p,_){var v=gantt.getTask(f),m=gantt._locate_css(i,u),k=0;m&&(k=Math.floor(m.offsetWidth/2)),this._dir_end=t(v,!!gantt._link_target_task_start,k)}else this._dir_end=gantt._get_mouse_pos(i);var b=!(g==_&&d==f&&c==p);return b&&(d&&gantt.refreshTask(d,!1), -f&&gantt.refreshTask(f,!1)),b&&e(r.marker),s(this._dir_start.x,this._dir_start.y,this._dir_end.x,this._dir_end.y),!0},this)),l.attachEvent("onDragEnd",gantt.bind(function(){var t=a();if(t.from&&t.to&&t.from!=t.to){var e=gantt._get_link_type(t.from_start,t.to_start),n={source:t.from,target:t.to,type:e};n.type&&gantt.isLinkAllowed(n)&&gantt.addLink(n)}i(),t.from&&gantt.refreshTask(t.from,!1),t.to&&gantt.refreshTask(t.to,!1),d()},this)),gantt._is_link_drop_area=function(t){return!!gantt._locate_css(t,u); -}},gantt._get_link_state=function(){return{link_landing_area:this._link_landing,link_target_id:this._link_target_task,link_target_start:this._link_target_task_start,link_source_id:this._link_source_task,link_source_start:this._link_source_task_start}},gantt._task_renderer=function(t,e,n,a){return this._task_area_pulls||(this._task_area_pulls={}),this._task_area_renderers||(this._task_area_renderers={}),this._task_area_renderers[t]?this._task_area_renderers[t]:(e||this.assert(!1,"Invalid renderer call"), -n&&n.setAttribute(this.config.layer_attribute,!0),this._task_area_renderers[t]={render_item:function(t,i){if(i=i||n,a&&!a(t))return void this.remove_item(t.id);var s=e.call(gantt,t);this.append(t,s,i)},clear:function(e){this.rendered=gantt._task_area_pulls[t]={},this.clear_container(e)},clear_container:function(t){t=t||n,t&&(t.innerHTML="")},render_items:function(t,e){e=e||n;var a=document.createDocumentFragment();this.clear(e);for(var i=0,s=t.length;s>i;i++)this.render_item(t[i],a);e.appendChild(a); -},append:function(t,e,n){e&&(this.rendered[t.id]&&this.rendered[t.id].parentNode?this.replace_item(t.id,e):n.appendChild(e),this.rendered[t.id]=e)},replace_item:function(t,e){var n=this.rendered[t];n&&n.parentNode&&n.parentNode.replaceChild(e,n),this.rendered[t]=e},remove_item:function(t){this.hide(t),delete this.rendered[t]},hide:function(t){var e=this.rendered[t];e&&e.parentNode&&e.parentNode.removeChild(e)},restore:function(t){var e=this.rendered[t.id];e?e.parentNode||this.append(t,e,n):this.render_item(t,n); -},change_id:function(t,e){this.rendered[e]=this.rendered[t],delete this.rendered[t]},rendered:this._task_area_pulls[t],node:n,unload:function(){this.clear(),delete gantt._task_area_renderers[t],delete gantt._task_area_pulls[t]}},this._task_area_renderers[t])},gantt._clear_renderers=function(){for(var t in this._task_area_renderers)this._task_renderer(t).unload()},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt._init_tasks=function(){function t(t,e,n,a){ -for(var i=0;i-1?a.$target[0]:a.$source[0]),i&&this._delete_link_handler(i,t),!1},this),this._tasks_dnd.init(),this._init_links_dnd(),this._link_layers.clear(); -var e=this.addLinkLayer({renderer:this._render_link_element,container:this.$task_links,filter:gantt._create_filter([gantt._filter_link,gantt._is_chart_visible].concat(this._get_link_filters()))});this._linkRenderer=this._link_layers.getRenderer(e),this._task_layers.clear();var n=this.addTaskLayer({renderer:this._render_task_element,container:this.$task_bars,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible].concat(this._get_task_filters()))});this._taskRenderer=this._task_layers.getRenderer(n), -this.addTaskLayer({renderer:this._render_grid_item,container:this.$grid_data,filter:gantt._create_filter([gantt._filter_task,gantt._is_grid_visible].concat(this._get_task_filters()))}),this.addTaskLayer({renderer:this._render_bg_line,container:this.$task_bg,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible,gantt._is_std_background].concat(this._get_task_filters()))}),this._onTaskIdChange&&this.detachEvent(this._onTaskIdChange),this._onTaskIdChange=this.attachEvent("onTaskIdChange",function(e,n){ -var a=this._get_task_renderers();t(a,e,n,this.getTask(n))}),this._onLinkIdChange&&this.detachEvent(this._onLinkIdChange),this._onLinkIdChange=this.attachEvent("onLinkIdChange",function(e,n){var a=this._get_link_renderers();t(a,e,n,this.getLink(n))})},gantt._get_task_filters=function(){return[]},gantt._get_link_filters=function(){return[]},gantt._is_chart_visible=function(){return!!this.config.show_chart},gantt._filter_task=function(t,e){var n=null,a=null;return this.config.start_date&&this.config.end_date&&(n=this.config.start_date.valueOf(), -a=this.config.end_date.valueOf(),+e.start_date>a||+e.end_date<+n)?!1:!0},gantt._filter_link=function(t,e){return this.config.show_links?!gantt.isTaskVisible(e.source)||!gantt.isTaskVisible(e.target)||gantt._isAllowedUnscheduledTask(gantt.getTask(e.source))||gantt._isAllowedUnscheduledTask(gantt.getTask(e.target))?!1:this.callEvent("onBeforeLinkDisplay",[t,e]):!1},gantt._is_std_background=function(){return!this.config.static_background},gantt._delete_link_handler=function(t,e){if(t&&this.callEvent("onLinkDblClick",[t,e])){ -var n=gantt.getLink(t);if(gantt._is_readonly(n))return;var a="",i=gantt.locale.labels.link+" "+this.templates.link_description(this.getLink(t))+" "+gantt.locale.labels.confirm_link_deleting;window.setTimeout(function(){gantt._dhtmlx_confirm(i,a,function(){gantt.deleteLink(t)})},gantt.config.touch?300:1)}},gantt.getTaskNode=function(t){return this._taskRenderer.rendered[t]},gantt.getLinkNode=function(t){return this._linkRenderer.rendered[t]},gantt._get_tasks_data=function(){for(var t=[],e=this._get_data_range(),n=0;nn;n++){var i=e[n];this._is_layer(i)&&i.style&&(i.style.width=t.full_width+"px")}if(this._is_grid_visible()){for(var s=this.getGridColumns(),r=0,n=0;n"+r+"";e.push(g)}}return e.join("")},gantt._get_scales=function(){var t=this._scale_helpers,e=[t.primaryScale()].concat(this.config.subscales);return t.sortScales(e),e},gantt._render_tasks_scales=function(){this._init_tasks_range(),this._scroll_resize(),this._set_sizes();var t="",e=0,n=0,a=0;if(this._is_chart_visible()){var i=this._scale_helpers,s=this._get_scales(); -a=this.config.scale_height-1;for(var r=this._get_resize_options(),o=r.x?Math.max(this.config.autosize_min_width,0):this.$task.offsetWidth,_=i.prepareConfigs(s,this.config.min_column_width,o,a),d=this._tasks=_[_.length-1],l=[],g=this.templates.scale_row_class,h=0;h<_.length;h++){var c="gantt_scale_line",u=g(_[h]);u&&(c+=" "+u),l.push('
'+this._prepare_scale_html(_[h])+"
")}t=l.join(""),e=d.full_width+this.$scroll_ver.offsetWidth+"px", -n=d.full_width+"px",a+="px"}this._is_chart_visible()?this.$task.style.display="":this.$task.style.display="none",this.$task_scale.style.height=a,this.$task_data.style.width=this.$task_scale.style.width=e,this.$task_scale.innerHTML=t},gantt._render_bg_line=function(t){var e=gantt._tasks,n=e.count,a=document.createElement("div");if(gantt.config.show_task_cells)for(var i=0;n>i;i++){var s=e.width[i],r="";if(s>0){var o=document.createElement("div");o.style.width=s+"px",r="gantt_task_cell"+(i==n-1?" gantt_last_cell":""), -d=this.templates.task_cell_class(t,e.trace_x[i]),d&&(r+=" "+d),o.className=r,a.appendChild(o)}}var _=t.$index%2!==0,d=gantt.templates.task_row_class(t.start_date,t.end_date,t),l="gantt_task_row"+(_?" odd":"")+(d?" "+d:"");return this.getState().selected_task==t.id&&(l+=" gantt_selected"),a.className=l,gantt.config.smart_rendering&&(a.style.position="absolute",a.style.top=this.getTaskTop(t.id)+"px",a.style.width="100%"),a.style.height=gantt.config.row_height+"px",a.setAttribute(this.config.task_attribute,t.id), -a},gantt._adjust_scales=function(){if(this.config.fit_tasks){var t=+this._min_date,e=+this._max_date;if(this._init_tasks_range(),+this._min_date!=t||+this._max_date!=e)return this.render(),this.callEvent("onScaleAdjusted",[]),!0}return!1},gantt.refreshTask=function(t,e){if(this._is_render_active()){var n=this._get_task_renderers(),a=this.getTask(t);if(a&&this.isTaskVisible(t)){for(var i=0;i=+i.min_date&&t.appendChild(a(e+" task_left"))},gantt._get_task_height=function(){var t=this.config.task_height;return"full"==t&&(t=this.config.row_height-5), -t=Math.min(t,this.config.row_height),Math.max(t,0)},gantt._get_milestone_width=function(){return this._get_task_height()},gantt._get_visible_milestone_width=function(){var t=gantt._get_task_height();return Math.sqrt(2*t*t)},gantt.getTaskPosition=function(t,e,n){var a=this.posFromDate(e||t.start_date),i=this.posFromDate(n||t.end_date);i=Math.max(a,i);var s=this.getTaskTop(t.id),r=gantt._get_task_height();return{left:a,top:s,height:r,width:Math.max(i-a,0)}},gantt._get_task_width=function(t,e,n){return Math.round(this._get_task_pos(t,!1).x-this._get_task_pos(t,!0).x); -},gantt._is_readonly=function(t){return t&&t[this.config.editable_property]?!1:t&&t[this.config.readonly_property]||this.config.readonly},gantt._task_default_render=function(t){if(!this._isAllowedUnscheduledTask(t)){var e=this._get_task_pos(t),n=this.config,a=this._get_task_height(),i=Math.floor((this.config.row_height-a)/2);this._get_safe_type(t.type)==n.types.milestone&&n.link_line_width>1&&(i+=1);var s=document.createElement("div"),r=gantt._get_task_width(t),o=this._get_safe_type(t.type);s.setAttribute(this.config.task_attribute,t.id), -n.show_progress&&o!=this.config.types.milestone&&this._render_task_progress(t,s,r);var _=gantt._render_task_content(t,r);t.textColor&&(_.style.color=t.textColor),s.appendChild(_);var d=this._combine_item_class("gantt_task_line",this.templates.task_class(t.start_date,t.end_date,t),t.id);(t.color||t.progressColor||t.textColor)&&(d+=" gantt_task_inline_color"),s.className=d;var l=["left:"+e.x+"px","top:"+(i+e.y)+"px","height:"+a+"px","line-height:"+a+"px","width:"+r+"px"];t.color&&l.push("background-color:"+t.color), -t.textColor&&l.push("color:"+t.textColor),s.style.cssText=l.join(";");var g=this._render_leftside_content(t);return g&&s.appendChild(g),g=this._render_rightside_content(t),g&&s.appendChild(g),this._is_readonly(t)||(n.drag_resize&&!this._is_flex_task(t)&&o!=this.config.types.milestone&&gantt._render_pair(s,"gantt_task_drag",t,function(t){var e=document.createElement("div");return e.className=t,e}),n.drag_links&&this.config.show_links&&gantt._render_pair(s,"gantt_link_control",t,function(t){var e=document.createElement("div"); -e.className=t,e.style.cssText=["height:"+a+"px","line-height:"+a+"px"].join(";");var n=document.createElement("div");return n.className="gantt_link_point",e.appendChild(n),e})),s}},gantt._render_task_element=function(t){var e=this.config.type_renderers,n=e[this._get_safe_type(t.type)],a=this._task_default_render;return n||(n=a),n.call(this,t,this.bind(a,this))},gantt._render_side_content=function(t,e,n){if(!e)return null;var a=e(t.start_date,t.end_date,t);if(!a)return null;var i=document.createElement("div"); -return i.className="gantt_side_content "+n,i.innerHTML=a,i},gantt._render_leftside_content=function(t){var e="gantt_left "+gantt._get_link_crossing_css(!0,t);return gantt._render_side_content(t,this.templates.leftside_text,e)},gantt._render_rightside_content=function(t){var e="gantt_right "+gantt._get_link_crossing_css(!1,t);return gantt._render_side_content(t,this.templates.rightside_text,e)},gantt._get_conditions=function(t){return t?{$source:[gantt.config.links.start_to_start],$target:[gantt.config.links.start_to_start,gantt.config.links.finish_to_start] -}:{$source:[gantt.config.links.finish_to_start,gantt.config.links.finish_to_finish],$target:[gantt.config.links.finish_to_finish]}},gantt._get_link_crossing_css=function(t,e){var n=gantt._get_conditions(t);for(var a in n)for(var i=e[a],s=0;st||t>e.full_width||!e.full_width)return null;var n=this._findBinary(this._tasks.left,t),a=this._tasks.left[n],i=e.width[n]||e.col_width,s=0;i&&(s=(t-a)/i);var r=0;s&&(r=gantt._get_coll_duration(e,e.trace_x[n]));var o=new Date(e.trace_x[n].valueOf()+Math.round(s*r)); -return o},gantt.posFromDate=function(t){var e=gantt._day_index_by_date(t);this.assert(e>=0,"Invalid day index");var n=Math.floor(e),a=e%1,i=gantt._tasks.left[Math.min(n,gantt._tasks.width.length-1)];return n==gantt._tasks.width.length&&(i+=gantt._tasks.width[gantt._tasks.width.length-1]),a&&(i+=n=this._max_date)return n.length; -for(var i=gantt._findBinary(n,e),s=+gantt._tasks.trace_x[i];a[s];)s=gantt._tasks.trace_x[++i];return s?i+(t-n[i])/gantt._get_coll_duration(gantt._tasks,n[i]):0},gantt._findBinary=function(t,e){for(var n,a,i,s=0,r=t.length-1;r>=s;)if(n=Math.floor((s+r)/2),a=+t[n],i=+t[n-1],e>a)s=n+1;else{if(!(a>e))return n;if(!isNaN(i)&&e>i)return n-1;r=n-1}return t.length-1},gantt._get_coll_duration=function(t,e){return gantt.date.add(e,t.step,t.unit)-e},gantt._get_x_pos=function(t,e){e=e!==!1;gantt.posFromDate(e?t.start_date:t.end_date); -},gantt.getTaskTop=function(t){return this._y_from_ind(this.getGlobalTaskIndex(t))},gantt._get_task_coord=function(t,e,n){e=e!==!1,n=n||0;var a=this._get_safe_type(t.type)==this.config.types.milestone,i=null;i=e||a?t.start_date||this._default_task_date(t):t.end_date||this.calculateEndDate(this._default_task_date(t));var s=this.posFromDate(i),r=this.getTaskTop(t.id);return a&&(e?s-=n:s+=n),{x:s,y:r}},gantt._get_task_pos=function(t,e){e=e!==!1;var n=gantt._get_milestone_width()/2;return this._get_task_coord(t,e,n); -},gantt._get_task_visible_pos=function(t,e){e=e!==!1;var n=gantt._get_visible_milestone_width()/2;return this._get_task_coord(t,e,n)},gantt._correct_shift=function(t,e){return t-=6e4*(new Date(gantt._min_date).getTimezoneOffset()-new Date(t).getTimezoneOffset())*(e?-1:1)},gantt._get_mouse_pos=function(t){if(t.pageX||t.pageY)var e={x:t.pageX,y:t.pageY};var n=gantt.env.isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},a=gantt._get_position(gantt.$task_data); -return e.x=e.x-a.x+gantt.$task_data.scrollLeft,e.y=e.y-a.y+gantt.$task_data.scrollTop,e},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt.attachEvent("onGanttReady",function(){gantt._task_layers.add(),gantt._link_layers.add()}),gantt._layers={prepareConfig:function(t){"function"==typeof t&&(t={renderer:t});t.id=gantt.uid();return t.container||(t.container=document.createElement("div")),t},create:function(t,e){return{tempCollection:[],renderers:{}, -container:t,getRenderers:function(){var t=[];for(var e in this.renderers)t.push(this.renderers[e]);return t},getRenderer:function(t){return this.renderers[t]},add:function(t){if(t&&this.tempCollection.push(t),this.container())for(var n=this.container(),a=this.tempCollection,i=0;ia;a++){var s=t[a];s&&(n=n&&s.apply(gantt,[e.id,e])!==!1)}return n}},gantt._add_generic_layer=function(t,e){return function(n){return void 0===n.filter&&(n.filter=gantt._create_filter(e)), -n=gantt._layers.prepareConfig(n),t.add(n),n.id}},gantt._task_layers=gantt._layers.create(function(){return gantt.$task_data},function(){return gantt.$task_links}),gantt._link_layers=gantt._layers.create(function(){return gantt.$task_data}),gantt.addTaskLayer=gantt._add_generic_layer(gantt._task_layers,[gantt._filter_task,gantt._is_chart_visible].concat(gantt._get_task_filters())),gantt.removeTaskLayer=function(t){gantt._task_layers.remove(t)},gantt.addLinkLayer=gantt._add_generic_layer(gantt._link_layers,[gantt._filter_link,gantt._is_chart_visible].concat(gantt._get_link_filters())), -gantt.removeLinkLayer=function(t){gantt._link_layers.remove(t)},gantt._get_task_renderers=function(){return this._task_layers.getRenderers()},gantt._get_link_renderers=function(){return this._link_layers.getRenderers()},gantt._pull={},gantt._branches={},gantt._order=[],gantt._lpull={},gantt._links=[],gantt._order_full=[],gantt.load=function(t,e,n){this._load_url=t,this.assert(arguments.length,"Invalid load arguments"),this.callEvent("onLoadStart",[]);var a="json",i=null;arguments.length>=3?(a=e,i=n):"string"==typeof arguments[1]?a=arguments[1]:"function"==typeof arguments[1]&&(i=arguments[1]), -this._load_type=a,this.ajax.get(t,gantt.bind(function(t){this.on_load(t,a),this.callEvent("onLoadEnd",[]),"function"==typeof i&&i.call(this)},this))},gantt.parse=function(t,e){this.on_load({xmlDoc:{responseText:t}},e)},gantt.serialize=function(t){return t=t||"json",this[t].serialize()},gantt.on_load=function(t,e){this.callEvent("onBeforeParse",[]),e||(e="json"),this.assert(this[e],"Invalid data type:'"+e+"'");var n=t.xmlDoc.responseText,a=this[e].parse(n,t);this._process_loading(a)},gantt._load_task=function(t){ -return this._init_task(t),this.callEvent("onTaskLoading",[t])?(this._pull[t.id]=t,!0):!1},gantt._build_pull=function(t){for(var e=null,n=[],a=0,i=t.length;i>a;a++)e=t[a],this._load_task(e)&&n.push(e);return n},gantt._build_hierarchy=function(t){for(var e=null,n=0,a=t.length;a>n;n++)e=t[n],this.setParent(e,this.getParent(e)||this.config.root_id);for(var n=0,a=t.length;a>n;n++)e=t[n],this._add_branch(e),e.$level=this.calculateTaskLevel(e)},gantt._process_loading=function(t){t.collections&&this._load_collections(t.collections); -var e=this._build_pull(t.data);if(this._build_hierarchy(e),this._sync_order(),this._order_synced=!0,this._init_links(t.links||(t.collections?t.collections.links:[])),this.callEvent("onParse",[]),this.render(),this.config.initial_scroll){var n=this._order[0]||this.config.root_id;n&&this.showTask(n)}},gantt._init_links=function(t){if(t)for(var e=0;e"},_copyObject:function(t){return""; -},serialize:function(){for(var t=[],e=[],n=gantt.json.serialize(),a=0,i=n.data.length;i>a;a++)t.push(this._copyObject(n.data[a]));for(var a=0,i=n.links.length;i>a;a++)e.push(this._copyLink(n.links[a]));return""+t.join("")+""+e.join("")+""}},gantt.oldxml={parse:function(t,e){e=gantt.xml._getXML(t,e,"projects");for(var n={collections:{links:[]}},a=n.data=[],i=gantt.ajax.xpath("//task",e),s=0;se;e++)if(this.units[e]==t)return e;gantt.assert(!1,"Incorrect duration unit")},_timestamp:function(t){var e=null;return t.day||0===t.day?e=t.day:t.date&&(e=gantt.date.date_part(new Date(t.date)).valueOf()),e},set_time:function(t){var e=void 0!==t.hours?t.hours:!0,n=this._timestamp(t); -null!==n?this.dates[n]=e:this.hours=e,this._working_units_cache.clear()},unset_time:function(t){if(t){var e=this._timestamp(t);null!==e&&delete this.dates[e]}else this.hours=[];this._working_units_cache.clear()},is_working_unit:function(t,e,n){if(!gantt.config.work_time)return!0;var a=this._working_units_cache.get(e,t);return-1==a&&(a=this._check_is_working_unit(t,e,n),this._working_units_cache.put(e,t,a)),a},_check_is_working_unit:function(t,e,n){return void 0===n&&(n=this._get_unit_order(e)),void 0===n?!1:n&&!this.is_working_unit(t,this.units[n-1],n-1)?!1:this["is_work_"+e]?this["is_work_"+e](t):!0; -},is_work_day:function(t){var e=this.get_working_hours(t);return e instanceof Array?e.length>0:!1},is_work_hour:function(t){for(var e=this.get_working_hours(t),n=t.getHours(),a=0;a=e[a]&&ns;){var r=this.next_date(i,n,a);this.is_working_unit(a>0?new Date(r.valueOf()-1):new Date(r.valueOf()+1),n)&&s++,i=r}return i}return gantt.date.add(i,a*e,n)},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date;var e=t.unit,n=gantt.date[e+"_start"](t.date),a=new Date(n),i=new Date(n),s=!0,r=3e3,o=0,_="any"==t.dir||!t.dir,d=1;for("past"==t.dir&&(d=-1);!this.is_working_unit(n,e);){ -_&&(n=s?a:i,d=-1*d);var l=n.getTimezoneOffset();if(n=gantt.date.add(n,d,e),n=gantt._correct_dst_change(n,l,d,e),gantt.date[e+"_start"]&&(n=gantt.date[e+"_start"](n)),_&&(s?a=n:i=n),s=!s,o++,o>r)return gantt.assert(!1,"Invalid working time check"),!1}return(n==i||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){gantt.assert(t,"Invalid argument for gantt.getTask");var e=this._pull[t];return gantt.assert(e,"Task not found id="+t),e},gantt.getTaskByTime=function(t,e){var n=this._pull,a=[]; -if(t||e){t=+t||-(1/0),e=+e||1/0;for(var i in n){var s=n[i];+s.start_datet&&a.push(s)}}else for(var i in n)a.push(n[i]);return a},gantt.isTaskExists=function(t){return gantt.defined(this._pull[t])},gantt.isUnscheduledTask=function(t){return!!t.unscheduled||!t.start_date},gantt._isAllowedUnscheduledTask=function(t){return t.unscheduled&&gantt.config.show_unscheduled},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;var e=this._pull[t];return(+e.start_date<+this._max_date&&+e.end_date>+this._min_date||gantt._isAllowedUnscheduledTask(e))&&void 0!==this._order_search[t]?!0:!1; -},gantt.updateTask=function(t,e){return gantt.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._isAllowedUnscheduledTask(e)&&(this._init_task(e),this._sync_links()),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t,e){var n=this.getParent(t);this.hasChild(n)||(this._branches[n]=[]); -for(var a=this.getChildren(n),i=!1,s=0,r=a.length;r>s;s++)if(a[s]==t.id){i=!0;break}i||(1*e==e?a.splice(e,0,t.id):a.push(t.id)),this._sync_parent(t)},gantt._move_branch=function(t,e,n){this.setParent(t,n),this._sync_parent(t),this._replace_branch_child(e,t.id),this.isTaskExists(n)||n==this.config.root_id?this._add_branch(t):delete this._branches[t.id],t.$level=this.calculateTaskLevel(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,this.getParent(t))}, -gantt._sync_parent=function(t){t.$rendered_parent=this.getParent(t)},gantt._is_parent_sync=function(t){return t.$rendered_parent==this.getParent(t)},gantt._replace_branch_child=function(t,e,n){var a=this.getChildren(t);if(a){for(var i=[],s=0;s=0?1:-1;return a.add_worktime(t,Math.abs(e),n||this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date?!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)):t.end_date&&void 0!==t.duration&&(t.start_date=this.calculateEndDate(t.end_date,-t.duration)), -this._isAllowedUnscheduledTask(t)&&this._set_default_task_timing(t),gantt._init_task_timing(t),t.start_date&&t.end_date&&gantt.correctTaskWorkTime(t),t.$source=[],t.$target=[],void 0===t.parent&&this.setParent(t,this.config.root_id),gantt.defined(t.$open)||(t.$open=gantt.defined(t.open)?t.open:this.config.open_tree_initially),t.$level=this.calculateTaskLevel(t),t},gantt._init_task_timing=function(t){var e=this._get_safe_type(t.type);void 0===t.$rendered_type?t.$rendered_type=e:t.$rendered_type!=e&&(delete t.$no_end, -delete t.$no_start,t.$rendered_type=e),void 0!==t.$no_end&&void 0!==t.$no_start||e==this.config.types.milestone||(e==this.config.types.project?(t.$no_end=t.$no_start=!0,this._set_default_task_timing(t)):(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date,this._isAllowedUnscheduledTask(t)&&(t.$no_end=t.$no_start=!1))),e==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0}, -gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt.resetProjectDates=function(t){if(t.$no_end||t.$no_start){var e=this.getSubtaskDates(t.id);this._assign_project_dates(t,e.start_date,e.end_date)}},gantt.getSubtaskDates=function(t){var e=null,n=null,a=void 0!==t?t:gantt.config.root_id;return this.eachTask(function(t){this._get_safe_type(t.type)==gantt.config.types.project||this.isUnscheduledTask(t)||(t.start_date&&!t.$no_start&&(!e||e>t.start_date.valueOf())&&(e=t.start_date.valueOf()), -t.end_date&&!t.$no_end&&(!n||n=+gantt._min_date&&+i<=+gantt._max_date)a=Math.floor(gantt._day_index_by_date(i)),gantt._tasks.trace_x[a]||(a-=1),n=new Date(gantt._tasks.trace_x[a]),e=new Date(n),e=gantt._tasks.trace_x[a+1]?new Date(gantt._tasks.trace_x[a+1]):gantt.date.add(n,s,r);else{for(a=Math.floor(gantt._day_index_by_date(i)), -e=gantt.date[r+"_start"](new Date(this._min_date)),gantt._tasks.trace_x[a]&&(e=gantt.date[r+"_start"](gantt._tasks.trace_x[a]));+i>+e;){e=gantt.date[r+"_start"](gantt.date.add(e,s,r));var o=e.getTimezoneOffset();e=gantt.date.add(e,s,r),e=gantt._correct_dst_change(e,o,e,r),gantt.date[r+"_start"]&&(e=gantt.date[r+"_start"](e))}n=gantt.date.add(e,-1*s,r)}return t.dir&&"future"==t.dir?e:t.dir&&"past"==t.dir?n:Math.abs(i-n)n[t];return a?1:-1}:t;if(e){var r=s;s=function(t,e){return r(e,t)}}var o=this.getChildren(n); -if(o){for(var _=[],d=o.length-1;d>=0;d--)_[d]=this._pull[o[d]];_.sort(s);for(var d=0;d<_.length;d++)o[d]=_[d].id,this.sort(t,e,o[d],!0)}i&&this.render()},gantt.getNext=function(t){for(var e=0;en;n++)if(e[n]==t)return e[n+1]||null;return null},gantt.getPrevSibling=function(t){for(var e=this.getSiblings(t),n=0,a=e.length;a>n;n++)if(e[n]==t)return e[n-1]||null;return null},gantt._dp_init=function(t){ -t.setTransactionMode("POST",!0),t.serverProcessor+=(-1!=t.serverProcessor.indexOf("?")?"&":"?")+"editing=true",t._serverProcessor=t.serverProcessor,t.styles={updated:"gantt_updated",order:"gantt_updated",inserted:"gantt_inserted",deleted:"gantt_deleted",invalid:"gantt_invalid",error:"gantt_error",clear:""},t._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"],t.setGanttMode=function(e){var n=t.modes||{};t._ganttMode&&(n[t._ganttMode]={_in_progress:t._in_progress,_invalid:t._invalid, -updatedRows:t.updatedRows});var a=n[e];a||(a=n[e]={_in_progress:{},_invalid:{},updatedRows:[]}),t._in_progress=a._in_progress,t._invalid=a._invalid,t.updatedRows=a.updatedRows,t.modes=n,t._ganttMode=e},this._sendTaskOrder=function(e,n){n.$drop_target&&(t.setGanttMode("tasks"),this.getTask(e).target=n.$drop_target,t.setUpdated(e,!0,"order"),delete this.getTask(e).$drop_target)},this.attachEvent("onAfterTaskAdd",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterTaskUpdate",function(e,n){ -t.setGanttMode("tasks"),t.setUpdated(e,!0),gantt._sendTaskOrder(e,n)}),this.attachEvent("onAfterTaskDelete",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"deleted"),"off"==t.updateMode||t._tSend||t.sendAllData()}),this.attachEvent("onAfterLinkUpdate",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0)}),this.attachEvent("onAfterLinkAdd",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterLinkDelete",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"deleted"); -}),this.attachEvent("onRowDragEnd",function(t,e){gantt._sendTaskOrder(t,gantt.getTask(t))});var e=null,n=null;this.attachEvent("onTaskIdChange",function(a,i){if(t._waitMode){var s=gantt.getChildren(i);if(s.length){e=e||{};for(var r=0;r-1?t.indexOf("?"):t.length),this.serverProcessor=t+("/"==t.slice(-1)?"":"/")+e}else this.serverProcessor=t+gantt._urlSeparator(t)+"gantt_mode="+this._ganttMode; -return!0}),this._init_dp_live_update_hooks(t);var a=t.afterUpdate;t.afterUpdate=function(){var e;e=3==arguments.length?arguments[1]:arguments[4];var n=t._ganttMode,i=e.filePath;n="REST"!=this._tMode?-1!=i.indexOf("gantt_mode=links")?"links":"tasks":i.indexOf("/link")>i.indexOf("/task")?"links":"tasks",t.setGanttMode(n);var s=a.apply(t,arguments);return t.setGanttMode(n),s},t._getRowData=gantt.bind(function(e,n){var a;a="tasks"==t._ganttMode?this.isTaskExists(e)?this.getTask(e):{id:e}:this.isLinkExists(e)?this.getLink(e):{ -id:e},a=gantt.copy(a);var i={};for(var s in a)if("$"!=s.substr(0,1)){var r=a[s];r instanceof Date?i[s]=this.templates.xml_format(r):null===r?i[s]="":i[s]=r}return a.$no_start&&(a.start_date="",a.duration=""),a.$no_end&&(a.end_date="",a.duration=""),i[t.action_param]=this.getUserData(e,t.action_param),i},this),this._change_id=gantt.bind(function(e,n){"tasks"!=t._ganttMode?this.changeLinkId(e,n):this.changeTaskId(e,n)},this),this._row_style=function(e,n){if("tasks"==t._ganttMode&&gantt.isTaskExists(e)){ -var a=gantt.getTask(e);a.$dataprocessor_class=n,gantt.refreshTask(e)}},this._delete_task=function(t,e){},this._dp=t},gantt.getUserData=function(t,e){return this.userdata||(this.userdata={}),this.userdata[t]&&this.userdata[t][e]?this.userdata[t][e]:""},gantt.setUserData=function(t,e,n){this.userdata||(this.userdata={}),this.userdata[t]||(this.userdata[t]={}),this.userdata[t][e]=n},gantt._init_link=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t},gantt._sync_links=function(){for(var t=null,e=0,n=this._order_full.length;n>e;e++)t=this._pull[this._order_full[e]], -t.$source=[],t.$target=[];this._links=[];for(var a in this._lpull){var i=this._lpull[a];this._links.push(i),this._pull[i.source]&&this._pull[i.source].$source.push(a),this._pull[i.target]&&this._pull[i.target].$target.push(a)}},gantt.getLink=function(t){return gantt.assert(this._lpull[t],"Link doesn't exist"),this._lpull[t]},gantt.getLinks=function(){var t=[];for(var e in gantt._lpull)t.push(gantt._lpull[e]);return t},gantt.isLinkExists=function(t){return gantt.defined(this._lpull[t])},gantt.addLink=function(t){ -return t=this._init_link(t),this.callEvent("onBeforeLinkAdd",[t.id,t])===!1?!1:(this._lpull[t.id]=t,this._sync_links(),this._render_link(t.id),this.callEvent("onAfterLinkAdd",[t.id,t]),t.id)},gantt.updateLink=function(t,e){return gantt.defined(e)||(e=this.getLink(t)),this.callEvent("onBeforeLinkUpdate",[t,e])===!1?!1:(this._lpull[t]=e,this._sync_links(),this._render_link(t),this.callEvent("onAfterLinkUpdate",[t,e]),!0)},gantt.deleteLink=function(t){return this._deleteLink(t)},gantt._deleteLink=function(t,e){ -var n=this.getLink(t);return e||this.callEvent("onBeforeLinkDelete",[t,n])!==!1?(delete this._lpull[t],this._sync_links(),this.refreshLink(t),e||this.callEvent("onAfterLinkDelete",[t,n]),!0):!1},gantt.changeLinkId=function(t,e){this._lpull[t]&&(this._lpull[e]=this._lpull[t],this._lpull[e].id=e,delete this._lpull[t],this._sync_links(),this.callEvent("onLinkIdChange",[t,e]))},gantt.getChildren=function(t){return gantt.defined(this._branches[t])?this._branches[t]:[]},gantt.hasChild=function(t){return gantt.defined(this._branches[t])&&this._branches[t].length; -},gantt.refreshData=function(){this._render_data()},gantt._isTask=function(t){return!(t.type&&t.type==gantt.config.types.project||t.$no_start||t.$no_end)},gantt._isProject=function(t){return!this._isTask(t)},gantt._configure=function(t,e,n){for(var a in e)("undefined"==typeof t[a]||n)&&(t[a]=e[a])},gantt._init_skin=function(){gantt._get_skin(!1),gantt._init_skin=function(){}},gantt._get_skin=function(t){if(!gantt.skin||t)for(var e=document.getElementsByTagName("link"),n=0;n=1440||!this._is_chart_visible())&&(e=this.config.time_step),e}return this.config.time_step},gantt.getLabel=function(t,e){for(var n=this._get_typed_lightbox_config(),a=0;a
"+this.locale.labels[r]+"
"}i=this.config.buttons_right;for(var s=0;s
"+this.locale.labels[r]+"
"; -}a+="",e.innerHTML=a,gantt.config.drag_lightbox&&(e.firstChild.onmousedown=gantt._ready_to_dnd,e.firstChild.onselectstart=function(){return!1},e.firstChild.style.cursor="pointer",gantt._init_dnd_events()),document.body.insertBefore(e,document.body.firstChild),this._lightbox=e;var o=this._get_typed_lightbox_config(t);a=this._render_sections(o);for(var _=e.getElementsByTagName("div"),s=0;s<_.length;s++){var d=_[s];if("gantt_cal_larea"==d.className){d.innerHTML=a;break}}this.resizeLightbox(),this._init_lightbox_events(this), -e.style.display="none",e.style.visibility="visible"}return this._lightbox},gantt._render_sections=function(t){for(var e="",n=0;n
"+this.locale.labels["button_"+t[n].button]+"
"),this.config.wide_form&&(e+="
"), -e+="
"+s+this.locale.labels["section_"+t[n].name]+"
"+a.render.call(this,t[n]),e+="
"}}return e},gantt.resizeLightbox=function(){var t=this._lightbox;if(t){var e=t.childNodes[1];e.style.height="0px",e.style.height=e.scrollHeight+"px",t.style.height=e.scrollHeight+this.config.lightbox_additional_height+"px",e.style.height=e.scrollHeight+"px"}},gantt._center_lightbox=function(t){if(t){t.style.display="block";var e=window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop,n=window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft,a=window.innerHeight||document.documentElement.clientHeight; -e?t.style.top=Math.round(e+Math.max((a-t.offsetHeight)/2,0))+"px":t.style.top=Math.round(Math.max((a-t.offsetHeight)/2,0)+9)+"px",document.documentElement.scrollWidth>document.body.offsetWidth?t.style.left=Math.round(n+(document.body.offsetWidth-t.offsetWidth)/2)+"px":t.style.left=Math.round((document.body.offsetWidth-t.offsetWidth)/2)+"px"}},gantt.showCover=function(){if(!this._cover){this._cover=document.createElement("DIV"),this._cover.className="gantt_cal_cover";var t=void 0!==document.height?document.height:document.body.offsetHeight,e=document.documentElement?document.documentElement.scrollHeight:0; -this._cover.style.height=Math.max(t,e)+"px",document.body.appendChild(this._cover)}},gantt._init_lightbox_events=function(){gantt.lightbox_events={},gantt.lightbox_events.gantt_save_btn=function(t){gantt._save_lightbox()},gantt.lightbox_events.gantt_delete_btn=function(t){gantt.callEvent("onLightboxDelete",[gantt._lightbox_id])&&(gantt.isTaskExists(gantt._lightbox_id)?gantt.$click.buttons["delete"](gantt._lightbox_id):gantt.hideLightbox())},gantt.lightbox_events.gantt_cancel_btn=function(t){gantt._cancel_lightbox(); -},gantt.lightbox_events["default"]=function(t,e){if(e.getAttribute("dhx_button"))gantt.callEvent("onLightboxButton",[e.className,e,t]);else{var n,a,i,s=gantt._getClassName(e);-1!=s.indexOf("gantt_custom_button")&&(-1!=s.indexOf("gantt_custom_button_")?(n=e.parentNode.getAttribute("index"),i=e.parentNode.parentNode):(n=e.getAttribute("index"),i=e.parentNode,e=e.firstChild));var r=gantt._get_typed_lightbox_config();n&&(a=gantt.form_blocks[r[n].type],a.button_click(n,e,i,i.nextSibling))}},this.event(gantt.getLightbox(),"click",function(t){ -t=t||window.event;var e=t.target?t.target:t.srcElement,n=gantt._getClassName(e);if(n||(e=e.previousSibling,n=gantt._getClassName(e)),e&&n&&0===n.indexOf("gantt_btn_set")&&(e=e.firstChild,n=gantt._getClassName(e)),e&&n){var a=gantt.defined(gantt.lightbox_events[e.className])?gantt.lightbox_events[e.className]:gantt.lightbox_events["default"];return a(t,e)}return!1}),gantt.getLightbox().onkeydown=function(t){switch((t||event).keyCode){case gantt.keys.edit_save:if((t||event).shiftKey)return;gantt._save_lightbox(); -break;case gantt.keys.edit_cancel:gantt._cancel_lightbox()}}},gantt._cancel_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxCancel",[this._lightbox_id,t.$new]),gantt.isTaskExists(t.id)&&t.$new&&this._deleteTask(t.id,!0),this.refreshData(),this.hideLightbox()},gantt._save_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxSave",[this._lightbox_id,t,!!t.$new])&&(t.$new?(delete t.$new,this._replace_branch_child(this.getParent(t.id),t.id),this.addTask(t)):this.isTaskExists(t.id)&&(this.mixin(this.getTask(t.id),t,!0), -this.updateTask(t.id)),this.refreshData(),this.hideLightbox())},gantt._resolve_default_mapping=function(t){var e=t.map_to,n={time:!0,time_optional:!0,duration:!0,duration_optional:!0};return n[t.type]&&("auto"==t.map_to?e={start_date:"start_date",end_date:"end_date",duration:"duration"}:"string"==typeof t.map_to&&(e={start_date:t.map_to})),e},gantt.getLightboxValues=function(){var t={};gantt.isTaskExists(this._lightbox_id)&&(t=this.mixin({},this.getTask(this._lightbox_id)));for(var e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var l="";switch(d){case"%Y":t._time_format_order[2]=_,t._time_format_order.size++;var g,h,c,u;t.year_range&&(isNaN(t.year_range)?t.year_range.push&&(c=t.year_range[0],u=t.year_range[1]):g=t.year_range),g=g||10,h=h||Math.floor(g/2), -c=c||i.getFullYear()-h,u=u||c+g;for(var f=c;u>f;f++)l+="";break;case"%m":t._time_format_order[1]=_,t._time_format_order.size++;for(var f=0;12>f;f++)l+="";break;case"%d":t._time_format_order[0]=_,t._time_format_order.size++;for(var f=1;32>f;f++)l+="";break;case"%H:%i":t._time_format_order[3]=_,t._time_format_order.size++;var f=r,p=i.getDate();for(t._time_values=[];s>f;){ -var v=this.templates.time_picker(i);l+="",t._time_values.push(f),i.setTime(i.valueOf()+60*this._get_timepicker_step()*1e3);var m=i.getDate()!=p?1:0;f=24*m*60+60*i.getHours()+i.getMinutes()}}if(l){var k=t.readonly?"disabled='disabled'":"",b=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,a,i){if(t[e+a[0]].value=n.getDate(),t[e+a[1]].value=n.getMonth(),t[e+a[2]].value=n.getFullYear(),gantt.defined(a[3])){ -var s=60*n.getHours()+n.getMinutes();s=Math.round(s/gantt._get_timepicker_step())*gantt._get_timepicker_step();var r=t[e+a[3]];r.value=s,r.setAttribute("data-value",s)}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e,n,a){t.innerHTML=e||""},get_value:function(t,e,n){return t.innerHTML||""},focus:function(t){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"; -},set_value:function(t,e,n){t.firstChild.value=e||""},get_value:function(t,e){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},select:{render:function(t){for(var e=(t.height||"23")+"px",n="
"},set_value:function(t,e,n,a){var i=t.firstChild;!i._dhx_onchange&&a.onchange&&(i.onchange=a.onchange, -i._dhx_onchange=!0),"undefined"==typeof e&&(e=(i.options[0]||{}).value),i.value=e||""},get_value:function(t,e){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},time:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t),n=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "), -n.push(e),n.push("
"),n.join("")},set_value:function(t,e,n,a){var i=a,s=t.getElementsByTagName("select"),r=a._time_format_order;a._time_format_size;if(i.auto_end_date)for(var o=function(){l=new Date(s[r[2]].value,s[r[1]].value,s[r[0]].value,0,0),g=gantt.calculateEndDate(l,1),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},_=0;4>_;_++)s[_].onchange=o;var d=gantt._resolve_default_mapping(a);"string"==typeof d&&(d={start_date:d});var l=n[d.start_date]||new Date,g=n[d.end_date]||gantt.calculateEndDate(l,1); -this.form_blocks._fill_lightbox_select(s,0,l,r,i),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},get_value:function(t,e,n){var a=t.getElementsByTagName("select"),i=n._time_format_order,s=0,r=0;if(gantt.defined(i[3])){var o=parseInt(a[i[3]].value,10);s=Math.floor(o/60),r=o%60}var _=new Date(a[i[2]].value,a[i[1]].value,a[i[0]].value,s,r);if(s=r=0,gantt.defined(i[3])){var o=parseInt(a[i.size+i[3]].value,10);s=Math.floor(o/60),r=o%60}var d=new Date(a[i[2]+i.size].value,a[i[1]+i.size].value,a[i[0]+i.size].value,s,r); -_>=d&&(d=gantt.date.add(_,gantt._get_timepicker_step(),"minute"));var l=gantt._resolve_default_mapping(n),g={start_date:new Date(_),end_date:new Date(d)};return"string"==typeof l?g.start_date:g},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},duration:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t);e="
"+e+"
";var n=this.locale.labels[this.config.duration_unit+"s"],a=t.single_date?' style="display:none"':"",i=t.readonly?" disabled='disabled'":"",s="
"+n+"
",r="
"+e+" "+s+"
"; -return r},set_value:function(t,e,n,a){function i(){var e=gantt.form_blocks.duration._get_start_date.call(gantt,t,a),n=gantt.form_blocks.duration._get_duration.call(gantt,t,a),i=gantt.calculateEndDate(e,n);g.innerHTML=gantt.templates.task_date(i)}function s(t){var e=d.value;e=parseInt(e,10),window.isNaN(e)&&(e=0),e+=t,1>e&&(e=1),d.value=e,i()}var r=a,o=t.getElementsByTagName("select"),_=t.getElementsByTagName("input"),d=_[1],l=[_[0],_[2]],g=t.getElementsByTagName("span")[0],h=a._time_format_order;l[0].onclick=gantt.bind(function(){ -s(-1*this.config.duration_step)},this),l[1].onclick=gantt.bind(function(){s(1*this.config.duration_step)},this),o[0].onchange=i,o[1].onchange=i,o[2].onchange=i,o[3]&&(o[3].onchange=i),d.onkeydown=gantt.bind(function(t){t=t||window.event;var e=t.charCode||t.keyCode||t.which;return 40==e?(s(-1*this.config.duration_step),!1):38==e?(s(1*this.config.duration_step),!1):void window.setTimeout(function(t){i()},1)},this),d.onchange=gantt.bind(function(t){i()},this);var c=gantt._resolve_default_mapping(a);"string"==typeof c&&(c={ -start_date:c});var u=n[c.start_date]||new Date,f=n[c.end_date]||gantt.calculateEndDate(u,1),p=Math.round(n[c.duration])||gantt.calculateDuration(u,f);gantt.form_blocks._fill_lightbox_select(o,0,u,h,r),d.value=p,i()},_get_start_date:function(t,e){var n=t.getElementsByTagName("select"),a=e._time_format_order,i=0,s=0;if(gantt.defined(a[3])){var r=n[a[3]],o=parseInt(r.value,10);isNaN(o)&&r.hasAttribute("data-value")&&(o=parseInt(r.getAttribute("data-value"),10)),i=Math.floor(o/60),s=o%60}return new Date(n[a[2]].value,n[a[1]].value,n[a[0]].value,i,s); -},_get_duration:function(t,e){var n=t.getElementsByTagName("input")[1];return n=parseInt(n.value,10),(!n||window.isNaN(n))&&(n=1),0>n&&(n*=-1),n},get_value:function(t,e,n){var a=gantt.form_blocks.duration._get_start_date(t,n),i=gantt.form_blocks.duration._get_duration(t,n),s=gantt.calculateEndDate(a,i),r=gantt._resolve_default_mapping(n),o={start_date:new Date(a),end_date:new Date(s),duration:i};return"string"==typeof r?o.start_date:o},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0]); -}},parent:{_filter:function(t,e,n){var a=e.filter||function(){return!0};t=t.slice(0);for(var i=0;i
",this.$grid_scale=this.$grid.childNodes[0], -this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",this.$task_scale=this.$task.childNodes[0],this.$task_data=this.$task.childNodes[1],this.$task_bg=this.$task_data.childNodes[0],this.$task_links=this.$task_data.childNodes[1],this.$task_bars=this.$task_data.childNodes[2]},gantt.$click={buttons:{edit:function(t){ -gantt.showLightbox(t)},"delete":function(t){var e=gantt.locale.labels.confirm_deleting,n=gantt.locale.labels.confirm_deleting_title;gantt._dhtmlx_confirm(e,n,function(){if(!gantt.isTaskExists(t))return void gantt.hideLightbox();var e=gantt.getTask(t);e.$new?(gantt._deleteTask(t,!0),gantt.refreshData()):gantt.deleteTask(t),gantt.hideLightbox()})}}},gantt._calculate_content_height=function(){var t=this.config.scale_height,e=this._order.length*this.config.row_height,n=this._scroll_hor?this.config.scroll_size+1:0; -return this._is_grid_visible()||this._is_chart_visible()?t+e+2+n:0},gantt._calculate_content_width=function(){var t=this._get_grid_width(),e=this._tasks?this._tasks.full_width:0;this._scroll_ver?this.config.scroll_size+1:0;return this._is_chart_visible()||(e=0),this._is_grid_visible()||(t=0),t+e+1},gantt._get_resize_options=function(){var t={x:!1,y:!1};return"xy"==this.config.autosize?t.x=t.y=!0:"y"==this.config.autosize||this.config.autosize===!0?t.y=!0:"x"==this.config.autosize&&(t.x=!0),t},gantt._clean_el_size=function(t){ -return 1*(t||"").toString().replace("px","")||0},gantt._get_box_styles=function(){var t=null;t=window.getComputedStyle?window.getComputedStyle(this._obj,null):{width:this._obj.clientWidth,height:this._obj.clientHeight};var e=["width","height","paddingTop","paddingBottom","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],n={boxSizing:"border-box"==t.boxSizing};t.MozBoxSizing&&(n.boxSizing="border-box"==t.MozBoxSizing);for(var a=0;aMath.abs(i)){if(n.x)return!0;if(!gantt.$scroll_hor||!gantt.$scroll_hor.offsetWidth)return!0; -var s=a/-40,r=gantt.$task.scrollLeft,o=r+30*s;if(gantt.scrollTo(o,null),gantt.$scroll_hor.scrollLeft=o,r==gantt.$task.scrollLeft)return!0}else{if(n.y)return!0;if(!gantt.$scroll_ver||!gantt.$scroll_ver.offsetHeight)return!0;var s=i/-40;"undefined"==typeof i&&(s=t.detail);var _=gantt.$scroll_ver.scrollTop,d=gantt.$scroll_ver.scrollTop+30*s;if(!gantt.config.prevent_default_scroll&&gantt._cached_scroll_pos&&(gantt._cached_scroll_pos.y==d||gantt._cached_scroll_pos.y<=0&&0>=d))return!0;if(gantt.scrollTo(null,d), -gantt.$scroll_ver.scrollTop=d,_==gantt.$scroll_ver.scrollTop)return!0}return t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1}this.event(this.$scroll_hor,"scroll",function(){if(new Date-(gantt._wheel_time||0)<100)return!0;if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),this.event(this.$scroll_ver,"scroll",function(){if(!gantt._touch_scroll_active){var t=gantt.$scroll_ver.scrollTop;gantt.$grid_data.scrollTop=t,gantt.scrollTo(null,t)}}),this.event(this.$task,"scroll",function(){ -var t=gantt.$task.scrollLeft,e=gantt.$scroll_hor.scrollLeft;e!=t&&(gantt.$scroll_hor.scrollLeft=t)}),this.event(this.$task_data,"scroll",function(){var t=gantt.$task_data.scrollTop,e=gantt.$scroll_ver.scrollTop;e!=t&&(gantt.$scroll_ver.scrollTop=t)});var e=gantt.env.isFF;e?this.event(gantt.$container,"wheel",t):this.event(gantt.$container,"mousewheel",t)},gantt._scroll_resize=function(){if(!(this._x<20||this._y<20)){var t=this._scroll_sizes();t.x?(this.$scroll_hor.style.display="block",this.$scroll_hor.style.height=t.scroll_size+"px", -this.$scroll_hor.style.width=t.x+"px",this.$scroll_hor.firstChild.style.width=t.x_inner+"px"):(this.$scroll_hor.style.display="none",this.$scroll_hor.style.height=this.$scroll_hor.style.width="0px"),t.y?(this.$scroll_ver.style.display="block",this.$scroll_ver.style.width=t.scroll_size+"px",this.$scroll_ver.style.height=t.y+"px",this.$scroll_ver.style.top=this.config.scale_height+"px",this.$scroll_ver.firstChild.style.height=t.y_inner+"px"):(this.$scroll_ver.style.display="none",this.$scroll_ver.style.width=this.$scroll_ver.style.height="0px"); -}},gantt._scroll_sizes=function(){var t=this._get_grid_width(),e=Math.max(this._x-t,0),n=Math.max(this._y-this.config.scale_height,0),a=this.config.scroll_size+1,i=Math.max(this.$task_data.offsetWidth-a,0),s=this.config.row_height*this._order.length,r=this._get_resize_options(),o=this._scroll_hor=r.x?!1:i>e,_=this._scroll_ver=r.y?!1:s>n,d={x:!1,y:!1,scroll_size:a,x_inner:i+t+a+2,y_inner:this.config.scale_height+s};return o&&(d.x=Math.max(this._x-(_?a:2),0)),_&&(d.y=Math.max(this._y-(o?a:0)-this.config.scale_height,0)), -d},gantt._getClassName=function(t){if(!t)return"";var e=t.className||"";return e.baseVal&&(e=e.baseVal),e.indexOf||(e=""),gantt._trim(e)},gantt.locate=function(t){var e=gantt._get_target_node(t),n=gantt._getClassName(e);if((n||"").indexOf("gantt_task_cell")>=0)return null;for(var a=arguments[1]||this.config.task_attribute;e;){if(e.getAttribute){var i=e.getAttribute(a);if(i)return i}e=e.parentNode}return null},gantt._get_target_node=function(t){var e;return t.tagName?e=t:(t=t||window.event,e=t.target||t.srcElement), -e},gantt._trim=function(t){var e=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")};return e.apply(t)},gantt._locate_css=function(t,e,n){void 0===n&&(n=!0);for(var a=gantt._get_target_node(t),i="";a;){if(i=gantt._getClassName(a)){var s=i.indexOf(e);if(s>=0){if(!n)return a;var r=0===s||!gantt._trim(i.charAt(s-1)),o=s+e.length>=i.length||!gantt._trim(i.charAt(s+e.length));if(r&&o)return a}}a=a.parentNode}return null},gantt._locateHTML=function(t,e){var n=gantt._get_target_node(t); -for(e=e||this.config.task_attribute;n;){if(n.getAttribute){var a=n.getAttribute(e);if(a)return n}n=n.parentNode}return null},gantt.getTaskRowNode=function(t){for(var e=this.$grid_data.childNodes,n=this.config.task_attribute,a=0;an?!0:t._on_timeout?!1:(setTimeout(function(){delete t._on_timeout},n),t._on_timeout=!0,!0)},gantt.selectTask=function(t){if(!this.config.select_task)return!1;if(t){if(this._selected_task==t)return this._selected_task;if(!this.callEvent("onBeforeTaskSelected",[t]))return!1;this.unselectTask(),this._selected_task=t, -this.refreshTask(t),this.callEvent("onTaskSelected",[t])}return this._selected_task},gantt.unselectTask=function(t){var t=t||this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){return this.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t)},gantt._is_render_active=function(){return!this._skip_render; -},gantt._correct_dst_change=function(t,e,n,a){var i=gantt._get_line(a)*n;if(i>3600&&86400>i){var s=t.getTimezoneOffset()-e;s&&(t=gantt.date.add(t,s,"minute"))}return t},gantt.batchUpdate=function(t,e){var n,a=this._dp&&"off"!=this._dp.updateMode;a&&(n=this._dp.updateMode,this._dp.setUpdateMode("off"));var i=this._sync_order;this._sync_order=function(){};var s=this._sync_links;this._sync_links=function(){};var r=this._adjust_scales;this._adjust_scales=function(){};var o={},_=this.resetProjectDates; -this.resetProjectDates=function(t){o[t.id]=t},this._skip_render=!0,this.callEvent("onBeforeBatchUpdate",[]);try{t()}catch(d){}this.callEvent("onAfterBatchUpdate",[]),this._sync_order=i,this._sync_order(),this._sync_links=s,this._sync_links(),this.resetProjectDates=_;for(var l in o)this.resetProjectDates(o[l]);this._adjust_scales=r,this._adjust_scales(),this._skip_render=!1,e||this.render(),a&&(this._dp.setUpdateMode(n),this._dp.setGanttMode("tasks"),this._dp.sendData(),this._dp.setGanttMode("links"), -this._dp.sendData())},gantt.env={isIE:navigator.userAgent.indexOf("MSIE")>=0||navigator.userAgent.indexOf("Trident")>=0,isIE6:!window.XMLHttpRequest&&navigator.userAgent.indexOf("MSIE")>=0,isIE7:navigator.userAgent.indexOf("MSIE 7.0")>=0&&navigator.userAgent.indexOf("Trident")<0,isIE8:navigator.userAgent.indexOf("MSIE 8.0")>=0&&navigator.userAgent.indexOf("Trident")>=0,isOpera:navigator.userAgent.indexOf("Opera")>=0,isChrome:navigator.userAgent.indexOf("Chrome")>=0,isKHTML:navigator.userAgent.indexOf("Safari")>=0||navigator.userAgent.indexOf("Konqueror")>=0, -isFF:navigator.userAgent.indexOf("Firefox")>=0,isIPad:navigator.userAgent.search(/iPad/gi)>=0,isEdge:-1!=navigator.userAgent.indexOf("Edge")},gantt.ajax={cache:!0,method:"get",parse:function(t){if("string"!=typeof t)return t;var e;return t=t.replace(/^[\s]+/,""),window.DOMParser&&!gantt.env.isIE?e=(new window.DOMParser).parseFromString(t,"text/xml"):window.ActiveXObject!==window.undefined&&(e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async="false",e.loadXML(t)),e},xmltop:function(t,e,n){if("undefined"==typeof e.status||e.status<400){ -var a=e.responseXML?e.responseXML||e:gantt.ajax.parse(e.responseText||e);if(a&&null!==a.documentElement&&!a.getElementsByTagName("parsererror").length)return a.getElementsByTagName(t)[0]}return-1!==n&&gantt.callEvent("onLoadXMLError",["Incorrect XML",arguments[1],n]),document.createElement("DIV")},xpath:function(t,e){if(e.nodeName||(e=e.responseXML||e),gantt.env.isIE)return e.selectNodes(t)||[];for(var n,a=[],i=(e.ownerDocument||e).evaluate(t,e,null,XPathResult.ANY_TYPE,null);;){if(n=i.iterateNext(), -!n)break;a.push(n)}return a},query:function(t){gantt.ajax._call(t.method||"GET",t.url,t.data||"",t.async||!0,t.callback,null,t.headers)},get:function(t,e){this._call("GET",t,null,!0,e)},getSync:function(t){return this._call("GET",t,null,!1)},put:function(t,e,n){this._call("PUT",t,e,!0,n)},del:function(t,e,n){this._call("DELETE",t,e,!0,n)},post:function(t,e,n){1==arguments.length?e="":2!=arguments.length||"function"!=typeof e&&"function"!=typeof window[e]?e=String(e):(n=e,e=""),this._call("POST",t,e,!0,n); -},postSync:function(t,e){return e=null===e?"":String(e),this._call("POST",t,e,!1)},getLong:function(t,e){this._call("GET",t,null,!0,e,{url:t})},postLong:function(t,e,n){2==arguments.length&&(n=e,e=""),this._call("POST",t,e,!0,n,{url:t,postData:e})},_call:function(t,e,n,a,i,s,r){var o=window.XMLHttpRequest&&!gantt.env.isIE?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),_=null!==navigator.userAgent.match(/AppleWebKit/)&&null!==navigator.userAgent.match(/Qt/)&&null!==navigator.userAgent.match(/Safari/); -if(a&&(o.onreadystatechange=function(){if(4==o.readyState||_&&3==o.readyState){if((200!=o.status||""===o.responseText)&&!gantt.callEvent("onAjaxError",[o]))return;window.setTimeout(function(){"function"==typeof i&&i.apply(window,[{xmlDoc:o,filePath:e}]),s&&("undefined"!=typeof s.postData?gantt.ajax.postLong(s.url,s.postData,i):gantt.ajax.getLong(s.url,i)),i=null,o=null},1)}}),"GET"!=t||this.cache||(e+=(e.indexOf("?")>=0?"&":"?")+"dhxr"+(new Date).getTime()+"=1"),o.open(t,e,a),r)for(var d in r)o.setRequestHeader(d,r[d]);else"POST"==t.toUpperCase()||"PUT"==t||"DELETE"==t?o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"):"GET"==t&&(n=null); -return o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.send(n),a?void 0:{xmlDoc:o,filePath:e}}},gantt._urlSeparator=function(t){return-1!=t.indexOf("?")?"&":"?"},function(){function t(t,e){var a=t.callback;n(!1),t.box.parentNode.removeChild(t.box),h=t.box=null,a&&a(e)}function e(e){if(h){e=e||event;var n=e.which||event.keyCode;return gantt.message.keyboard&&((13==n||32==n)&&t(h,!0),27==n&&t(h,!1)),e.preventDefault&&e.preventDefault(),!(e.cancelBubble=!0)}}function n(t){n.cover||(n.cover=document.createElement("DIV"), -n.cover.onkeydown=e,n.cover.className="dhx_modal_cover",document.body.appendChild(n.cover));document.body.scrollHeight;n.cover.style.display=t?"inline-block":"none"}function a(t,e){var n="gantt_"+t.toLowerCase().replace(/ /g,"_")+"_button dhtmlx_"+t.toLowerCase().replace(/ /g,"_")+"_button";return"
"+t+"
"}function i(t){c.area||(c.area=document.createElement("DIV"),c.area.className="gantt_message_area dhtmlx_message_area", -c.area.style[c.position]="5px",document.body.appendChild(c.area)),c.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
"+t.text+"
",e.className="gantt-info dhtmlx-info gantt-"+t.type+" dhtmlx-"+t.type,e.onclick=function(){c.hide(t.id),t=null},"bottom"==c.position&&c.area.firstChild?c.area.insertBefore(e,c.area.firstChild):c.area.appendChild(e),t.expire>0&&(c.timers[t.id]=window.setTimeout(function(){c.hide(t.id)},t.expire)),c.pull[t.id]=e,e=null,t.id}function s(e,n,i){var s=document.createElement("DIV"); -s.className=" gantt_modal_box dhtmlx_modal_box gantt-"+e.type+" dhtmlx-"+e.type,s.setAttribute("dhxbox",1);var r="";if(e.width&&(s.style.width=e.width),e.height&&(s.style.height=e.height),e.title&&(r+='
'+e.title+"
"),r+='
'+(e.content?"":e.text)+'
',n&&(r+=a(e.ok||"OK",!0)),i&&(r+=a(e.cancel||"Cancel",!1)),e.buttons)for(var o=0;o=0&&!t.getHours()&&n.getHours()&&(n.getDate()<=t.getDate()||n.getMonth()t?"0"+t:t},copy:function(t){return new Date(t.valueOf())},date_to_str:function(t,e){ -return t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+gantt.date.to_fixed(date.getDate())+"';case"%m":return'"+gantt.date.to_fixed((date.getMonth()+1))+"';case"%j":return'"+date.getDate()+"';case"%n":return'"+(date.getMonth()+1)+"';case"%y":return'"+gantt.date.to_fixed(date.getFullYear()%100)+"';case"%Y":return'"+date.getFullYear()+"';case"%D":return'"+gantt.locale.date.day_short[date.getDay()]+"';case"%l":return'"+gantt.locale.date.day_full[date.getDay()]+"';case"%M":return'"+gantt.locale.date.month_short[date.getMonth()]+"'; -case"%F":return'"+gantt.locale.date.month_full[date.getMonth()]+"';case"%h":return'"+gantt.date.to_fixed((date.getHours()+11)%12+1)+"';case"%g":return'"+((date.getHours()+11)%12+1)+"';case"%G":return'"+date.getHours()+"';case"%H":return'"+gantt.date.to_fixed(date.getHours())+"';case"%i":return'"+gantt.date.to_fixed(date.getMinutes())+"';case"%a":return'"+(date.getHours()>11?"pm":"am")+"';case"%A":return'"+(date.getHours()>11?"PM":"AM")+"';case"%s":return'"+gantt.date.to_fixed(date.getSeconds())+"'; -case"%W":return'"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+"';default:return t}}),e&&(t=t.replace(/date\.get/g,"date.getUTC")),new Function("date",'return "'+t+'";')},str_to_date:function(t,e){for(var n="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);",a=t.match(/%[a-zA-Z]/g),i=0;i50?1900:2000);";break;case"%g":case"%G": -case"%h":case"%H":n+="set[3]=temp["+i+"]||0;";break;case"%i":n+="set[4]=temp["+i+"]||0;";break;case"%Y":n+="set[0]=temp["+i+"]||0;";break;case"%a":case"%A":n+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":n+="set[5]=temp["+i+"]||0;";break;case"%M":n+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;";break;case"%F":n+="set[1]=gantt.locale.date.month_full_hash[temp["+i+"]]||0;"}var s="set[0],set[1],set[2],set[3],set[4],set[5]";return e&&(s=" Date.UTC("+s+")"), -new Function("date","var set=[0,0,1,0,0,0]; "+n+" return new Date("+s+");")},getISOWeek:function(t){if(!t)return!1;var e=t.getDay();0===e&&(e=7);var n=new Date(t.valueOf());n.setDate(t.getDate()+(4-e));var a=n.getFullYear(),i=Math.round((n.getTime()-new Date(a,0,1).getTime())/864e5),s=1+Math.floor(i/7);return s},getUTCISOWeek:function(t){return this.getISOWeek(t)},convert_to_utc:function(t){return new Date(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds()); -},parseDate:function(t,e){return"string"==typeof t&&(gantt.defined(e)&&(e="string"==typeof e?gantt.defined(gantt.templates[e])?gantt.templates[e]:gantt.date.str_to_date(e):gantt.templates.xml_date),t=t?e(t):null),t}},gantt.date.quarter_start=function(t){gantt.date.month_start(t);var e,n=t.getMonth();return e=n>=9?9:n>=6?6:n>=3?3:0,t.setMonth(e),t},gantt.date.add_quarter=function(t,e){return gantt.date.add(t,3*e,"month")},gantt.config||(gantt.config={}),gantt.config||(gantt.config={}),gantt.templates||(gantt.templates={}), -function(){gantt.mixin(gantt.config,{links:{finish_to_start:"0",start_to_start:"1",finish_to_finish:"2",start_to_finish:"3"},types:{task:"task",project:"project",milestone:"milestone"},duration_unit:"day",work_time:!1,correct_work_time:!1,skip_off_time:!1,autosize:!1,autosize_min_width:0,show_links:!0,show_task_cells:!0,static_background:!1,branch_loading:!1,show_loading:!1,show_chart:!0,show_grid:!0,min_duration:36e5,xml_date:"%d-%m-%Y %H:%i",api_date:"%d-%m-%Y %H:%i",start_on_monday:!0,server_utc:!1, -show_progress:!0,fit_tasks:!1,select_task:!0,scroll_on_click:!0,preserve_scroll:!0,readonly:!1,date_grid:"%Y-%m-%d",drag_links:!0,drag_progress:!0,drag_resize:!0,drag_move:!0,drag_mode:{resize:"resize",progress:"progress",move:"move",ignore:"ignore"},round_dnd_dates:!0,link_wrapper_width:20,root_id:0,autofit:!1,columns:[{name:"text",tree:!0,width:"*",resize:!0},{name:"start_date",align:"center",resize:!0},{name:"duration",align:"center"},{name:"add",width:"44"}],step:1,scale_unit:"day",scale_offset_minimal:!0, -subscales:[],inherit_scale_class:!1,time_step:60,duration_step:1,date_scale:"%d %M",task_date:"%d %F %Y",time_picker:"%H:%i",task_attribute:"task_id",link_attribute:"link_id",layer_attribute:"data-layer",buttons_left:["gantt_save_btn","gantt_cancel_btn"],_migrate_buttons:{dhx_save_btn:"gantt_save_btn",dhx_cancel_btn:"gantt_cancel_btn",dhx_delete_btn:"gantt_delete_btn"},buttons_right:["gantt_delete_btn"],lightbox:{sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"time", -type:"duration",map_to:"auto"}],project_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect",map_to:"type"},{name:"time",type:"duration",readonly:!0,map_to:"auto"}],milestone_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect",map_to:"type"},{name:"time",type:"duration",single_date:!0,map_to:"auto"}]},drag_lightbox:!0,sort:!1,details_on_create:!0,details_on_dblclick:!0,initial_scroll:!0, -task_scroll_offset:100,order_branch:!1,order_branch_free:!1,task_height:"full",min_column_width:70,min_grid_column_width:70,grid_resizer_column_attribute:"column_index",grid_resizer_attribute:"grid_resizer",keep_grid_width:!1,grid_resize:!1,show_unscheduled:!0,readonly_property:"readonly",editable_property:"editable",type_renderers:{},open_tree_initially:!1,optimize_render:!0,prevent_default_scroll:!1,show_errors:!0}),gantt.keys={edit_save:13,edit_cancel:27},gantt._init_template=function(t,e,n){var a=this._reg_templates||{}; -n=n||t,this.config[t]&&a[n]!=this.config[t]&&(e&&this.templates[n]||(this.templates[n]=this.date.date_to_str(this.config[t]),a[n]=this.config[t])),this._reg_templates=a},gantt._init_templates=function(){var t=gantt.locale.labels;t.gantt_save_btn=t.icon_save,t.gantt_cancel_btn=t.icon_cancel,t.gantt_delete_btn=t.icon_delete;var e=this.date.date_to_str,n=this.config;gantt._init_template("date_scale",!0),gantt._init_template("date_grid",!0,"grid_date_format"),gantt._init_template("task_date",!0),gantt.mixin(this.templates,{ -xml_date:this.date.str_to_date(n.xml_date,n.server_utc),xml_format:e(n.xml_date,n.server_utc),api_date:this.date.str_to_date(n.api_date),progress_text:function(t,e,n){return""},grid_header_class:function(t,e){return""},task_text:function(t,e,n){return n.text},task_class:function(t,e,n){return""},grid_row_class:function(t,e,n){return""},task_row_class:function(t,e,n){return""},task_cell_class:function(t,e){return""},scale_cell_class:function(t){return""},scale_row_class:function(t){return""},grid_indent:function(t){ -return"
"},grid_folder:function(t){return"
"},grid_file:function(t){return"
"},grid_open:function(t){return"
"},grid_blank:function(t){return"
"},date_grid:function(t,e){return e&&gantt.isUnscheduledTask(e)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(e):gantt.templates.grid_date_format(t); -},task_time:function(t,e,n){return gantt.isUnscheduledTask(n)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(n):gantt.templates.task_date(t)+" - "+gantt.templates.task_date(e)},task_unscheduled_time:function(t){return""},time_picker:e(n.time_picker),link_class:function(t){return""},link_description:function(t){var e=gantt.getTask(t.source),n=gantt.getTask(t.target);return""+e.text+""+n.text+""},drag_link:function(t,e,n,a){t=gantt.getTask(t);var i=gantt.locale.labels,s=""+t.text+" "+(e?i.link_start:i.link_end)+"
"; -return n&&(n=gantt.getTask(n),s+=" "+n.text+" "+(a?i.link_start:i.link_end)+"
"),s},drag_link_class:function(t,e,n,a){var i="";if(t&&n){var s=gantt.isLinkAllowed(t,n,e,a);i=" "+(s?"gantt_link_allow":"gantt_link_deny")}return"gantt_link_tooltip"+i}}),this.callEvent("onTemplatesReady",[])}}(),window.jQuery&&!function(t){var e=[];t.fn.dhx_gantt=function(n){if(n=n||{},"string"!=typeof n){var a=[];return this.each(function(){if(this&&this.getAttribute&&!this.getAttribute("dhxgantt")){for(var t in n)"data"!=t&&(gantt.config[t]=n[t]); -gantt.init(this),n.data&&gantt.parse(n.data),a.push(gantt)}}),1===a.length?a[0]:a}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.dhx_gantt")}}(jQuery),gantt.locale={date:{month_full:["January","February","March","April","May","June","July","August","September","October","November","December"],month_short:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],day_full:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],day_short:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"] -},labels:{new_task:"New task",icon_save:"Save",icon_cancel:"Cancel",icon_details:"Details",icon_edit:"Edit",icon_delete:"Delete",confirm_closing:"",confirm_deleting:"Task will be deleted permanently, are you sure?",section_description:"Description",section_time:"Time period",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task", -type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}},gantt.skins.skyblue={config:{grid_width:350,row_height:27,scale_height:27,link_line_width:1,link_arrow_size:8,lightbox_additional_height:75},_second_column_width:95,_third_column_width:80},gantt.skins.meadow={config:{grid_width:350,row_height:27,scale_height:30,link_line_width:2,link_arrow_size:6,lightbox_additional_height:72},_second_column_width:95,_third_column_width:80 -},gantt.skins.terrace={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:2,link_arrow_size:6,lightbox_additional_height:75},_second_column_width:90,_third_column_width:70},gantt.skins.broadway={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:1,link_arrow_size:7,lightbox_additional_height:86},_second_column_width:90,_third_column_width:80,_lightbox_template:"
 
", -_config_buttons_left:{},_config_buttons_right:{gantt_delete_btn:"icon_delete",gantt_save_btn:"icon_save"}},gantt.config.touch_drag=500,gantt.config.touch=!0,gantt.config.touch_feedback=!0,gantt._touch_feedback=function(){gantt.config.touch_feedback&&navigator.vibrate&&navigator.vibrate(1)},gantt._init_touch_events=function(){"force"!=this.config.touch&&(this.config.touch=this.config.touch&&(-1!=navigator.userAgent.indexOf("Mobile")||-1!=navigator.userAgent.indexOf("iPad")||-1!=navigator.userAgent.indexOf("Android")||-1!=navigator.userAgent.indexOf("Touch"))), -this.config.touch&&(window.navigator.msPointerEnabled?this._touch_events(["MSPointerMove","MSPointerDown","MSPointerUp"],function(t){return t.pointerType==t.MSPOINTER_TYPE_MOUSE?null:t},function(t){return!t||t.pointerType==t.MSPOINTER_TYPE_MOUSE}):this._touch_events(["touchmove","touchstart","touchend"],function(t){return t.touches&&t.touches.length>1?null:t.touches[0]?{target:t.target,pageX:t.touches[0].pageX,pageY:t.touches[0].pageY,clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}:t},function(){ -return!1}))},gantt._touch_events=function(t,e,n){function a(t){return t&&t.preventDefault&&t.preventDefault(),(t||event).cancelBubble=!0,!1}function i(t){var e=gantt._task_area_pulls,n=gantt.getTask(t);if(n&&gantt.isTaskVisible(t))for(var a in e)if(n=e[a][t],n&&n.getAttribute("task_id")&&n.getAttribute("task_id")==t){var i=n.cloneNode(!0);return g=n,e[a][t]=i,n.style.display="none",i.className+=" gantt_drag_move ",n.parentNode.appendChild(i),i}}var s,r=0,o=!1,_=!1,d=null,l=null,g=null;this._gantt_touch_event_ready||(this._gantt_touch_event_ready=1, -gantt.event(gantt.$container,t[0],function(t){if(!n(t)&&o){l&&clearTimeout(l);var i=e(t);if(gantt._tasks_dnd.drag.id||gantt._tasks_dnd.drag.start_drag)return gantt._tasks_dnd.on_mouse_move(i),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1;if(i&&d){var g=d.pageX-i.pageX,h=d.pageY-i.pageY;if(!_&&(Math.abs(g)>5||Math.abs(h)>5)&&(gantt._touch_scroll_active=_=!0,r=0,s=gantt.getScrollState()),_){gantt.scrollTo(s.x+g,s.y+h);var c=gantt.getScrollState();if(s.x!=c.x&&h>2*g||s.y!=c.y&&g>2*h)return a(t); -}}return a(t)}})),gantt.event(this.$container,"contextmenu",function(t){return o?a(t):void 0}),gantt.event(this.$container,t[1],function(t){if(!n(t)){if(t.touches&&t.touches.length>1)return void(o=!1);if(o=!0,d=e(t),d&&r){var s=new Date;500>s-r?(gantt._on_dblclick(d),a(t)):r=s}else r=new Date;l=setTimeout(function(){var t=gantt.locate(d);!t||gantt._locate_css(d,"gantt_link_control")||gantt._locate_css(d,"gantt_grid_data")||(gantt._tasks_dnd.on_mouse_down(d),gantt._tasks_dnd.drag&&gantt._tasks_dnd.drag.start_drag&&(i(t), -gantt._tasks_dnd._start_dnd(d),gantt._touch_drag=!0,gantt.refreshTask(t),gantt._touch_feedback())),l=null},gantt.config.touch_drag)}}),gantt.event(this.$container,t[2],function(t){if(!n(t)){l&&clearTimeout(l),gantt._touch_drag=!1,o=!1;var a=e(t);gantt._tasks_dnd.on_mouse_up(a),g&&(gantt.refreshTask(gantt.locate(g)),g.parentNode&&(g.parentNode.removeChild(g),gantt._touch_feedback())),gantt._touch_scroll_active=o=_=!1,g=null}})},function(){function t(t,e){var n=gantt.env.isIE?"":"%c",a=[n,'"',t,'"',n," has been deprecated in dhtmlxGantt v4.0 and will stop working in v5.0. Use ",n,'"',e,'"',n," instead. \nSee more details at http://docs.dhtmlx.com/gantt/migrating.html "].join(""),i=window.console.warn||window.console.log,s=[a]; -gantt.env.isIE||(s=s.concat(["font-weight:bold","font-weight:normal","font-weight:bold","font-weight:normal"])),i.apply(window.console,s)}function e(e){return function(){return t("dhtmlx."+e,"gantt."+e),gantt[e].apply(gantt,arguments)}}window.dhtmlx||(window.dhtmlx={});for(var n=["message","alert","confirm","modalbox","uid","copy","mixin","defined","bind","assert"],a=0;athis.config.sensitivity){if(this.config.started=!0,this.config.ignore=!1,this.callEvent("onBeforeDragStart",[t,this.config.original_target])===!1)return this.config.ignore=!0,!0;var r=this.config.marker=document.createElement("div");r.className="gantt_drag_marker", +r.innerHTML="Dragging object",document.body.appendChild(r),this.callEvent("onAfterDragStart",[t,this.config.original_target])}else this.config.ignore=!0}this.config.ignore||(e.pos=this.getPosition(e),this.config.marker.style.left=e.pos.x+"px",this.config.marker.style.top=e.pos.y+"px",this.callEvent("onDragMove",[t,e]))},dragEnd:function(t){this.config.marker&&(this.config.marker.parentNode.removeChild(this.config.marker),this.config.marker=null,this.callEvent("onDragEnd",[])),document.body.className=document.body.className.replace(" gantt_noselect",""); +},getPosition:function(t){var e=0,n=0;return t=t||window.event,t.pageX||t.pageY?(e=t.pageX,n=t.pageY):(t.clientX||t.clientY)&&(e=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,n=t.clientY+document.body.scrollTop+document.documentElement.scrollTop),{x:e,y:n}}},gantt._init_grid=function(){this._click.gantt_close=this.bind(function(t,e,n){return this.close(e),!1},this),this._click.gantt_open=this.bind(function(t,e,n){return this.open(e),!1},this),this._click.gantt_row=this.bind(function(t,e,n){ +if(null!==e){var a=this.getTask(e);this.config.scroll_on_click&&this.showDate(a.start_date),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=this.bind(function(t,e,n){var a=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[a,t])){if("add"==a)return void this._click.gantt_add(t,this.config.root_id);if(this.config.sort){for(var i,s=a,r=0;this.config.columns.length;r++)if(this.config.columns[r].name==a){i=this.config.columns[r];break}if(i&&void 0!==i.sort&&i.sort!==!0&&(s=i.sort, +!s))return;var o=this._sort&&this._sort.direction&&this._sort.name==a?this._sort.direction:"desc";o="desc"==o?"asc":"desc",this._sort={name:a,direction:o},this.sort(s,"desc"==o)}}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=this.bind(function(t,e,n){if(!this.config.readonly){var a={};return this.createTask(a,e?e:this.config.root_id),!1}},this),this._init_resize&&this._init_resize()},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(), +this._render_grid_header())},gantt._calc_grid_width=function(){for(var t=this.getGridColumns(),e=0,n=[],a=[],i=0;i0?n.length:a.length>0?a.length:1);if(n.length>0)for(var o=r/(n.length?n.length:1),i=0;in+_&&(o.width=_=this._get_grid_width()-n),n+=_;var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),g="width:"+(_-(r?1:0))+"px;",h=o.label||a["column_"+o.name]; +h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=i+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("")},gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.getGridColumns(),n=[],a=0;a
":(s=o.template?o.template(t):t[o.name], +s instanceof Date&&(s=this.templates.date_grid(s,t)),s="
"+s+"
");var _="gantt_cell"+(r?" gantt_last_cell":""),d="";if(o.tree){for(var l=0;l"+d+s+"", +n.push(i)}var _=t.$index%2===0?"":" odd";if(_+=t.$transparent?" gantt_transparent":"",_+=t.$dataprocessor_class?" "+t.$dataprocessor_class:"",this.templates.grid_row_class){var c=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);c&&(_+=" "+c)}this.getState().selected_task==t.id&&(_+=" gantt_selected");var u=document.createElement("div");return u.className="gantt_row"+_,u.style.height=this.config.row_height+"px",u.style.lineHeight=gantt.config.row_height+"px",u.setAttribute(this.config.task_attribute,t.id), +u.innerHTML=n.join(""),u},gantt.open=function(t){gantt._set_item_state(t,!0),this.callEvent("onTaskOpened",[t])},gantt.close=function(t){gantt._set_item_state(t,!1),this.callEvent("onTaskClosed",[t])},gantt._set_item_state=function(t,e){t&&this._pull[t]&&(this._pull[t].$open=e,gantt._refresh_on_toggle_element(t))},gantt._refresh_on_toggle_element=function(t){this.refreshData()},gantt._is_grid_visible=function(){return this.config.grid_width&&this.config.show_grid},gantt._get_grid_width=function(){ +return this._is_grid_visible()?this._is_chart_visible()?this.config.grid_width:this._x:0},gantt.moveTask=function(t,e,n){var a=arguments[3];if(a){if(a===t)return;n=this.getParent(a),e=this.getTaskIndex(a)}if(t!=n){n=n||this.config.root_id;var i=this.getTask(t),s=this.getParent(i.id),r=(this.getChildren(this.getParent(i.id)),this.getChildren(n));if(-1==e&&(e=r.length+1),s==n){var o=this.getTaskIndex(t);if(o==e)return}if(this.callEvent("onBeforeTaskMove",[t,n,e])!==!1){this._replace_branch_child(s,t), +r=this.getChildren(n);var _=r[e];_?r=r.slice(0,e).concat([t]).concat(r.slice(e)):r.push(t),this.setParent(i,n),this._branches[n]=r,i.$level=this.calculateTaskLevel(i),1*e>0?a?i.$drop_target=(this.getTaskIndex(t)>this.getTaskIndex(a)?"next:":"")+a:i.$drop_target="next:"+gantt.getPrevSibling(t):r[1*e+1]?i.$drop_target=r[1*e+1]:i.$drop_target=n,this.callEvent("onAfterTaskMove",[t,n,e])&&this.refreshData()}}},gantt._init_dnd=function(){var t=new gantt._DnD(this.$grid_data,{updates_per_second:60});this.defined(this.config.dnd_sensitivity)&&(t.config.sensitivity=this.config.dnd_sensitivity), +t.attachEvent("onBeforeDragStart",this.bind(function(e,n){var a=this._locateHTML(n);if(!a)return!1;this.hideQuickInfo&&this._hideQuickInfo();var i=this.locate(n),s=gantt.getTask(i);return gantt._is_readonly(s)?!1:(t.config.initial_open_state=s.$open,this.callEvent("onRowDragStart",[i,n.target||n.srcElement,n])?void 0:!1)},this)),t.attachEvent("onAfterDragStart",this.bind(function(e,n){var a=this._locateHTML(n);t.config.marker.innerHTML=a.outerHTML,t.config.id=this.locate(n);var i=this.getTask(t.config.id); +t.config.index=this.getTaskIndex(t.config.id),t.config.parent=i.parent,i.$open=!1,i.$transparent=!0,this.refreshData()},this)),t.lastTaskOfLevel=function(t){for(var e=gantt._order,n=gantt._pull,a=null,i=0,s=e.length;s>i;i++)n[e[i]].$level==t&&(a=n[e[i]]);return a?a.id:null},t._getGridPos=this.bind(function(t){var e=this._get_position(this.$grid_data),n=e.x,a=t.pos.y-10;return ae.y+this.$grid_data.offsetHeight-this.config.row_height&&(a=e.y+this.$grid_data.offsetHeight-this.config.row_height), +e.x=n,e.y=a,e},this),t.attachEvent("onDragMove",this.bind(function(e,n){function a(t,e){return t.$level==e.$level||gantt.config.order_branch_free}var i=t.config,s=t._getGridPos(n);i.marker.style.left=s.x+10+"px",i.marker.style.top=s.y+"px",s=t._getGridPos(n);var r=(s.x,s.y),o=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.elementFromPoint(s.x-_+1,r-o),l=this.locate(d),g=this.getTask(t.config.id);if(this.isTaskExists(l)||(l=t.lastTaskOfLevel(gantt.config.order_branch_free?g.$level:0), +l==t.config.id&&(l=null)),this.isTaskExists(l)){var h=gantt._get_position(d),c=this.getTask(l);if(h.y+d.offsetHeight/2=0;)p=this._pull[this._order[u-v]],v++;if(g.id==c.id)return;a(c,g)&&g.id!=c.id?this.moveTask(g.id,0,0,c.id):c.$level!=g.$level-1||gantt.getChildren(c.id).length?p&&a(p,g)&&g.id!=p.id&&this.moveTask(g.id,-1,this.getParent(p.id)):this.moveTask(g.id,0,c.id); +}return!0},this)),t.attachEvent("onDragEnd",this.bind(function(){var e=this.getTask(t.config.id);this.callEvent("onBeforeRowDragEnd",[t.config.id,t.config.parent,t.config.index])===!1?(this.moveTask(t.config.id,t.config.index,t.config.parent),e.$drop_target=null):this.callEvent("onRowDragEnd",[t.config.id,e.$drop_target]),e.$transparent=!1,e.$open=t.config.initial_open_state,this.refreshData()},this))},gantt.getGridColumns=function(){return this.config.columns},gantt._has_children=function(t){return this.getChildren(t).length>0; +},gantt._scale_helpers={getSum:function(t,e,n){void 0===n&&(n=t.length-1),void 0===e&&(e=0);for(var a=0,i=e;n>=i;i++)a+=t[i];return a},setSumWidth:function(t,e,n,a){var i=e.width;void 0===a&&(a=i.length-1),void 0===n&&(n=0);var s=a-n+1;if(!(n>i.length-1||0>=s||a>i.length-1)){var r=this.getSum(i,n,a),o=t-r;this.adjustSize(o,i,n,a),this.adjustSize(-o,i,a+1),e.full_width=this.getSum(i)}},splitSize:function(t,e){for(var n=[],a=0;e>a;a++)n[a]=0;return this.adjustSize(t,n),n},adjustSize:function(t,e,n,a){ +n||(n=0),void 0===a&&(a=e.length-1);for(var i=a-n+1,s=this.getSum(e,n,a),r=0,o=n;a>=o;o++){var _=Math.floor(t*(s?e[o]/s:1/i));s-=e[o],t-=_,i--,e[o]+=_,r+=_}e[e.length-1]+=t},sortScales:function(t){function e(t,e){var n=new Date(1970,0,1);return gantt.date.add(n,e,t)-n}t.sort(function(t,n){return e(t.unit,t.step)e(n.unit,n.step)?-1:0})},primaryScale:function(){return gantt._init_template("date_scale"),{unit:gantt.config.scale_unit,step:gantt.config.step,template:gantt.templates.date_scale, +date:gantt.config.date_scale,css:gantt.templates.scale_cell_class}},prepareConfigs:function(t,e,n,a){for(var i=this.splitSize(a,t.length),s=n,r=[],o=t.length-1;o>=0;o--){var _=o==t.length-1,d=this.initScaleConfig(t[o]);_&&this.processIgnores(d),this.initColSizes(d,e,s,i[o]),this.limitVisibleRange(d),_&&(s=d.full_width),r.unshift(d)}for(var o=0;oe;e++)t.left.push((t.width[e-1]||0)+(t.left[e-1]||0)); +},_ignore_time_config:function(t){return this.config.skip_off_time?!this.isWorkTime(t):!1},processIgnores:function(t){t.ignore_x={},t.display_count=t.count},initColSizes:function(t,e,n,a){var i=n;t.height=a;var s=void 0===t.display_count?t.count:t.display_count;s||(s=1),t.col_width=Math.floor(i/s),e&&t.col_width=g;g++)+r[g]!=+s[l]||(i&&i.apply(this,[d,l,o,g]),o=g,d=l)},alineScaleColumns:function(t,e,n,a){this.iterateScales(t,e,n,a,function(n,a,i,s){ +var r=this.getSum(t.width,i,s-1),o=this.getSum(e.width,n,a-1);o!=r&&this.setSumWidth(r,e,n,a-1)})},eachColumn:function(t,e,n){var a=new Date(gantt._min_date),i=new Date(gantt._max_date);gantt.date[t+"_start"]&&(a=gantt.date[t+"_start"](a));var s=new Date(a);for(+s>=+i&&(i=gantt.date.add(s,e,t));+i>+s;){n.call(this,new Date(s));var r=s.getTimezoneOffset();s=gantt.date.add(s,e,t),s=gantt._correct_dst_change(s,r,e,t),gantt.date[t+"_start"]&&(s=gantt.date[t+"_start"](s))}},limitVisibleRange:function(t){ +var e=t.trace_x,n=0,a=t.width.length-1,i=0;if(+e[0]<+gantt._min_date&&n!=a){var s=Math.floor(t.width[0]*((e[1]-gantt._min_date)/(e[1]-e[0])));i+=t.width[0]-s,t.width[0]=s,e[0]=new Date(gantt._min_date)}var r=e.length-1,o=e[r],_=gantt.date.add(o,t.step,t.unit);if(+_>+gantt._max_date&&r>0){var s=t.width[r]-Math.floor(t.width[r]*((_-gantt._max_date)/(_-o)));i+=t.width[r]-s,t.width[r]=s}if(i){for(var d=this.getSum(t.width),l=0,g=0;gt.x?this.dirs.right:e.y>t.y?this.dirs.down:this.dirs.up; +}},gantt._y_from_ind=function(t){return t*gantt.config.row_height},gantt._path_builder={path:[],clear:function(){this.path=[]},current:function(){return this.path[this.path.length-1]},point:function(t){return t?(this.path.push(gantt.copy(t)),t):this.current()},point_to:function(t,e,n){n=n?{x:n.x,y:n.y}:gantt.copy(this.point());var a=gantt._drawer.dirs;switch(t){case a.left:n.x-=e;break;case a.right:n.x+=e;break;case a.up:n.y-=e;break;case a.down:n.y+=e}return this.point(n)},get_points:function(t){ +var e=this.get_endpoint(t),n=gantt.config,a=e.e_y-e.y,i=e.e_x-e.x,s=gantt._drawer.dirs;this.clear(),this.point({x:e.x,y:e.y});var r=2*n.link_arrow_size,o=e.e_x>e.x;if(t.type==gantt.config.links.start_to_start)this.point_to(s.left,r),o?(this.point_to(s.down,a),this.point_to(s.right,i)):(this.point_to(s.right,i),this.point_to(s.down,a)),this.point_to(s.right,r);else if(t.type==gantt.config.links.finish_to_start)if(o=e.e_x>e.x+2*r,this.point_to(s.right,r),o)i-=r,this.point_to(s.down,a),this.point_to(s.right,i);else{ +i-=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)),this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.right,r)}else if(t.type==gantt.config.links.finish_to_finish)this.point_to(s.right,r),o?(this.point_to(s.right,i),this.point_to(s.down,a)):(this.point_to(s.down,a),this.point_to(s.right,i)),this.point_to(s.left,r);else if(t.type==gantt.config.links.start_to_finish)if(o=e.e_x>e.x-2*r,this.point_to(s.left,r),o){i+=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)), +this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.left,r)}else i+=r,this.point_to(s.down,a),this.point_to(s.right,i);return this.path},get_endpoint:function(t){var e=gantt.config.links,n=!1,a=!1;t.type==e.start_to_start?n=a=!0:t.type==e.finish_to_finish?n=a=!1:t.type==e.finish_to_start?(n=!1,a=!0):t.type==e.start_to_finish?(n=!0,a=!1):gantt.assert(!1,"Invalid link type");var i=gantt._get_task_visible_pos(gantt._pull[t.source],n),s=gantt._get_task_visible_pos(gantt._pull[t.target],a); +return{x:i.x,e_x:s.x,y:i.y,e_y:s.y}}},gantt._init_links_dnd=function(){function t(t,e,n){var a=gantt._get_task_pos(t,!!e);return a.y+=gantt._get_task_height()/2,n=n||0,a.x+=(e?-1:1)*n,a}function e(t){var e=a(),n=["gantt_link_tooltip"];e.from&&e.to&&(gantt.isLinkAllowed(e.from,e.to,e.from_start,e.to_start)?n.push("gantt_allowed_link"):n.push("gantt_invalid_link"));var i=gantt.templates.drag_link_class(e.from,e.from_start,e.to,e.to_start);i&&n.push(i);var s="
"+gantt.templates.drag_link(e.from,e.from_start,e.to,e.to_start)+"
"; +t.innerHTML=s}function n(t,e){t.style.left=e.x+5+"px",t.style.top=e.y+5+"px"}function a(){return{from:gantt._link_source_task,to:gantt._link_target_task,from_start:gantt._link_source_task_start,to_start:gantt._link_target_task_start}}function i(){gantt._link_source_task=gantt._link_source_task_start=gantt._link_target_task=null,gantt._link_target_task_start=!0}function s(t,e,n,i){var s=_(),d=a(),l=["gantt_link_direction"];gantt.templates.link_direction_class&&l.push(gantt.templates.link_direction_class(d.from,d.from_start,d.to,d.to_start)); +var g=Math.sqrt(Math.pow(n-t,2)+Math.pow(i-e,2));if(g=Math.max(0,g-3)){s.className=l.join(" ");var h=(i-e)/(n-t),c=Math.atan(h);2==o(t,n,e,i)?c+=Math.PI:3==o(t,n,e,i)&&(c-=Math.PI);var u=Math.sin(c),f=Math.cos(c),p=Math.round(e),v=Math.round(t),m=["-webkit-transform: rotate("+c+"rad)","-moz-transform: rotate("+c+"rad)","-ms-transform: rotate("+c+"rad)","-o-transform: rotate("+c+"rad)","transform: rotate("+c+"rad)","width:"+Math.round(g)+"px"];if(-1!=window.navigator.userAgent.indexOf("MSIE 8.0")){ +m.push('-ms-filter: "'+r(u,f)+'"');var k=Math.abs(Math.round(t-n)),b=Math.abs(Math.round(i-e));switch(o(t,n,e,i)){case 1:p-=b;break;case 2:v-=k,p-=b;break;case 3:v-=k}}m.push("top:"+p+"px"),m.push("left:"+v+"px"),s.style.cssText=m.join(";")}}function r(t,e){return"progid:DXImageTransform.Microsoft.Matrix(M11 = "+e+",M12 = -"+t+",M21 = "+t+",M22 = "+e+",SizingMethod = 'auto expand')"}function o(t,e,n,a){return e>=t?n>=a?1:4:n>=a?2:3}function _(){return l._direction||(l._direction=document.createElement("div"), +gantt.$task_links.appendChild(l._direction)),l._direction}function d(){l._direction&&(l._direction.parentNode&&l._direction.parentNode.removeChild(l._direction),l._direction=null)}var l=new gantt._DnD(this.$task_bars,{sensitivity:0,updates_per_second:60}),g="task_left",h="task_right",c="gantt_link_point",u="gantt_link_control";l.attachEvent("onBeforeDragStart",gantt.bind(function(e,n){var a=n.target||n.srcElement;if(i(),gantt.getState().drag_id)return!1;if(gantt._locate_css(a,c)){gantt._locate_css(a,g)&&(gantt._link_source_task_start=!0); +var s=gantt._link_source_task=this.locate(n),r=gantt.getTask(s);if(gantt._is_readonly(r))return i(),!1;var o=0;return gantt._get_safe_type(r.type)==gantt.config.types.milestone&&(o=(gantt._get_visible_milestone_width()-gantt._get_milestone_width())/2),this._dir_start=t(r,!!gantt._link_source_task_start,o),!0}return!1},this)),l.attachEvent("onAfterDragStart",gantt.bind(function(t,n){e(l.config.marker)},this)),l.attachEvent("onDragMove",gantt.bind(function(a,i){var r=l.config,o=l.getPosition(i);n(r.marker,o); +var _=gantt._is_link_drop_area(i),d=gantt._link_target_task,g=gantt._link_landing,c=gantt._link_target_task_start,f=gantt.locate(i),p=!0;if(_&&(p=!gantt._locate_css(i,h),_=!!f),gantt._link_target_task=f,gantt._link_landing=_,gantt._link_target_task_start=p,_){var v=gantt.getTask(f),m=gantt._locate_css(i,u),k=0;m&&(k=Math.floor(m.offsetWidth/2)),this._dir_end=t(v,!!gantt._link_target_task_start,k)}else this._dir_end=gantt._get_mouse_pos(i);var b=!(g==_&&d==f&&c==p);return b&&(d&&gantt.refreshTask(d,!1), +f&&gantt.refreshTask(f,!1)),b&&e(r.marker),s(this._dir_start.x,this._dir_start.y,this._dir_end.x,this._dir_end.y),!0},this)),l.attachEvent("onDragEnd",gantt.bind(function(){var t=a();if(t.from&&t.to&&t.from!=t.to){var e=gantt._get_link_type(t.from_start,t.to_start),n={source:t.from,target:t.to,type:e};n.type&&gantt.isLinkAllowed(n)&&gantt.addLink(n)}i(),t.from&&gantt.refreshTask(t.from,!1),t.to&&gantt.refreshTask(t.to,!1),d()},this)),gantt._is_link_drop_area=function(t){return!!gantt._locate_css(t,u); +}},gantt._get_link_state=function(){return{link_landing_area:this._link_landing,link_target_id:this._link_target_task,link_target_start:this._link_target_task_start,link_source_id:this._link_source_task,link_source_start:this._link_source_task_start}},gantt._task_renderer=function(t,e,n,a){return this._task_area_pulls||(this._task_area_pulls={}),this._task_area_renderers||(this._task_area_renderers={}),this._task_area_renderers[t]?this._task_area_renderers[t]:(e||this.assert(!1,"Invalid renderer call"), +n&&n.setAttribute(this.config.layer_attribute,!0),this._task_area_renderers[t]={render_item:function(t,i){if(i=i||n,a&&!a(t))return void this.remove_item(t.id);var s=e.call(gantt,t);this.append(t,s,i)},clear:function(e){this.rendered=gantt._task_area_pulls[t]={},this.clear_container(e)},clear_container:function(t){t=t||n,t&&(t.innerHTML="")},render_items:function(t,e){e=e||n;var a=document.createDocumentFragment();this.clear(e);for(var i=0,s=t.length;s>i;i++)this.render_item(t[i],a);e.appendChild(a); +},append:function(t,e,n){e&&(this.rendered[t.id]&&this.rendered[t.id].parentNode?this.replace_item(t.id,e):n.appendChild(e),this.rendered[t.id]=e)},replace_item:function(t,e){var n=this.rendered[t];n&&n.parentNode&&n.parentNode.replaceChild(e,n),this.rendered[t]=e},remove_item:function(t){this.hide(t),delete this.rendered[t]},hide:function(t){var e=this.rendered[t];e&&e.parentNode&&e.parentNode.removeChild(e)},restore:function(t){var e=this.rendered[t.id];e?e.parentNode||this.append(t,e,n):this.render_item(t,n); +},change_id:function(t,e){this.rendered[e]=this.rendered[t],delete this.rendered[t]},rendered:this._task_area_pulls[t],node:n,unload:function(){this.clear(),delete gantt._task_area_renderers[t],delete gantt._task_area_pulls[t]}},this._task_area_renderers[t])},gantt._clear_renderers=function(){for(var t in this._task_area_renderers)this._task_renderer(t).unload()},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt._init_tasks=function(){function t(t,e,n,a){ +for(var i=0;i-1?a.$target[0]:a.$source[0]),i&&this._delete_link_handler(i,t),!1},this),this._tasks_dnd.init(),this._init_links_dnd(),this._link_layers.clear(); +var e=this.addLinkLayer({renderer:this._render_link_element,container:this.$task_links,filter:gantt._create_filter([gantt._filter_link,gantt._is_chart_visible].concat(this._get_link_filters()))});this._linkRenderer=this._link_layers.getRenderer(e),this._task_layers.clear();var n=this.addTaskLayer({renderer:this._render_task_element,container:this.$task_bars,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible].concat(this._get_task_filters()))});this._taskRenderer=this._task_layers.getRenderer(n), +this.addTaskLayer({renderer:this._render_grid_item,container:this.$grid_data,filter:gantt._create_filter([gantt._filter_task,gantt._is_grid_visible].concat(this._get_task_filters()))}),this.addTaskLayer({renderer:this._render_bg_line,container:this.$task_bg,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible,gantt._is_std_background].concat(this._get_task_filters()))}),this._onTaskIdChange&&this.detachEvent(this._onTaskIdChange),this._onTaskIdChange=this.attachEvent("onTaskIdChange",function(e,n){ +var a=this._get_task_renderers();t(a,e,n,this.getTask(n))}),this._onLinkIdChange&&this.detachEvent(this._onLinkIdChange),this._onLinkIdChange=this.attachEvent("onLinkIdChange",function(e,n){var a=this._get_link_renderers();t(a,e,n,this.getLink(n))})},gantt._get_task_filters=function(){return[]},gantt._get_link_filters=function(){return[]},gantt._is_chart_visible=function(){return!!this.config.show_chart},gantt._filter_task=function(t,e){var n=null,a=null;return this.config.start_date&&this.config.end_date&&(n=this.config.start_date.valueOf(), +a=this.config.end_date.valueOf(),+e.start_date>a||+e.end_date<+n)?!1:!0},gantt._filter_link=function(t,e){return this.config.show_links?!gantt.isTaskVisible(e.source)||!gantt.isTaskVisible(e.target)||gantt._isAllowedUnscheduledTask(gantt.getTask(e.source))||gantt._isAllowedUnscheduledTask(gantt.getTask(e.target))?!1:this.callEvent("onBeforeLinkDisplay",[t,e]):!1},gantt._is_std_background=function(){return!this.config.static_background},gantt._delete_link_handler=function(t,e){if(t&&this.callEvent("onLinkDblClick",[t,e])){ +var n=gantt.getLink(t);if(gantt._is_readonly(n))return;var a="",i=gantt.locale.labels.link+" "+this.templates.link_description(this.getLink(t))+" "+gantt.locale.labels.confirm_link_deleting;window.setTimeout(function(){gantt._dhtmlx_confirm(i,a,function(){gantt.deleteLink(t)})},gantt.config.touch?300:1)}},gantt.getTaskNode=function(t){return this._taskRenderer.rendered[t]},gantt.getLinkNode=function(t){return this._linkRenderer.rendered[t]},gantt._get_tasks_data=function(){for(var t=[],e=this._get_data_range(),n=0;nn;n++){var i=e[n];this._is_layer(i)&&i.style&&(i.style.width=t.full_width+"px")}if(this._is_grid_visible()){for(var s=this.getGridColumns(),r=0,n=0;n"+r+"";e.push(g)}}return e.join("")},gantt._get_scales=function(){var t=this._scale_helpers,e=[t.primaryScale()].concat(this.config.subscales);return t.sortScales(e),e},gantt._render_tasks_scales=function(){this._init_tasks_range(),this._scroll_resize(),this._set_sizes();var t="",e=0,n=0,a=0;if(this._is_chart_visible()){var i=this._scale_helpers,s=this._get_scales(); +a=this.config.scale_height-1;for(var r=this._get_resize_options(),o=r.x?Math.max(this.config.autosize_min_width,0):this.$task.offsetWidth,_=i.prepareConfigs(s,this.config.min_column_width,o,a),d=this._tasks=_[_.length-1],l=[],g=this.templates.scale_row_class,h=0;h<_.length;h++){var c="gantt_scale_line",u=g(_[h]);u&&(c+=" "+u),l.push('
'+this._prepare_scale_html(_[h])+"
")}t=l.join(""),e=d.full_width+this.$scroll_ver.offsetWidth+"px", +n=d.full_width+"px",a+="px"}this._is_chart_visible()?this.$task.style.display="":this.$task.style.display="none",this.$task_scale.style.height=a,this.$task_data.style.width=this.$task_scale.style.width=e,this.$task_scale.innerHTML=t},gantt._render_bg_line=function(t){var e=gantt._tasks,n=e.count,a=document.createElement("div");if(gantt.config.show_task_cells)for(var i=0;n>i;i++){var s=e.width[i],r="";if(s>0){var o=document.createElement("div");o.style.width=s+"px",r="gantt_task_cell"+(i==n-1?" gantt_last_cell":""), +d=this.templates.task_cell_class(t,e.trace_x[i]),d&&(r+=" "+d),o.className=r,a.appendChild(o)}}var _=t.$index%2!==0,d=gantt.templates.task_row_class(t.start_date,t.end_date,t),l="gantt_task_row"+(_?" odd":"")+(d?" "+d:"");return this.getState().selected_task==t.id&&(l+=" gantt_selected"),a.className=l,gantt.config.smart_rendering&&(a.style.position="absolute",a.style.top=this.getTaskTop(t.id)+"px",a.style.width="100%"),a.style.height=gantt.config.row_height+"px",a.setAttribute(this.config.task_attribute,t.id), +a},gantt._adjust_scales=function(){if(this.config.fit_tasks){var t=+this._min_date,e=+this._max_date;if(this._init_tasks_range(),+this._min_date!=t||+this._max_date!=e)return this.render(),this.callEvent("onScaleAdjusted",[]),!0}return!1},gantt.refreshTask=function(t,e){if(this._is_render_active()){var n=this._get_task_renderers(),a=this.getTask(t);if(a&&this.isTaskVisible(t)){for(var i=0;i=+i.min_date&&t.appendChild(a(e+" task_left"))},gantt._get_task_height=function(){var t=this.config.task_height;return"full"==t&&(t=this.config.row_height-5), +t=Math.min(t,this.config.row_height),Math.max(t,0)},gantt._get_milestone_width=function(){return this._get_task_height()},gantt._get_visible_milestone_width=function(){var t=gantt._get_task_height();return Math.sqrt(2*t*t)},gantt.getTaskPosition=function(t,e,n){var a=this.posFromDate(e||t.start_date),i=this.posFromDate(n||t.end_date);i=Math.max(a,i);var s=this.getTaskTop(t.id),r=gantt._get_task_height();return{left:a,top:s,height:r,width:Math.max(i-a,0)}},gantt._get_task_width=function(t,e,n){return Math.round(this._get_task_pos(t,!1).x-this._get_task_pos(t,!0).x); +},gantt._is_readonly=function(t){return t&&t[this.config.editable_property]?!1:t&&t[this.config.readonly_property]||this.config.readonly},gantt._task_default_render=function(t){if(!this._isAllowedUnscheduledTask(t)){var e=this._get_task_pos(t),n=this.config,a=this._get_task_height(),i=Math.floor((this.config.row_height-a)/2);this._get_safe_type(t.type)==n.types.milestone&&n.link_line_width>1&&(i+=1);var s=document.createElement("div"),r=gantt._get_task_width(t),o=this._get_safe_type(t.type);s.setAttribute(this.config.task_attribute,t.id), +n.show_progress&&o!=this.config.types.milestone&&this._render_task_progress(t,s,r);var _=gantt._render_task_content(t,r);t.textColor&&(_.style.color=t.textColor),s.appendChild(_);var d=this._combine_item_class("gantt_task_line",this.templates.task_class(t.start_date,t.end_date,t),t.id);(t.color||t.progressColor||t.textColor)&&(d+=" gantt_task_inline_color"),s.className=d;var l=["left:"+e.x+"px","top:"+(i+e.y)+"px","height:"+a+"px","line-height:"+a+"px","width:"+r+"px"];t.color&&l.push("background-color:"+t.color), +t.textColor&&l.push("color:"+t.textColor),s.style.cssText=l.join(";");var g=this._render_leftside_content(t);return g&&s.appendChild(g),g=this._render_rightside_content(t),g&&s.appendChild(g),this._is_readonly(t)||(n.drag_resize&&!this._is_flex_task(t)&&o!=this.config.types.milestone&&gantt._render_pair(s,"gantt_task_drag",t,function(t){var e=document.createElement("div");return e.className=t,e}),n.drag_links&&this.config.show_links&&gantt._render_pair(s,"gantt_link_control",t,function(t){var e=document.createElement("div"); +e.className=t,e.style.cssText=["height:"+a+"px","line-height:"+a+"px"].join(";");var n=document.createElement("div");return n.className="gantt_link_point",e.appendChild(n),e})),s}},gantt._render_task_element=function(t){var e=this.config.type_renderers,n=e[this._get_safe_type(t.type)],a=this._task_default_render;return n||(n=a),n.call(this,t,this.bind(a,this))},gantt._render_side_content=function(t,e,n){if(!e)return null;var a=e(t.start_date,t.end_date,t);if(!a)return null;var i=document.createElement("div"); +return i.className="gantt_side_content "+n,i.innerHTML=a,i},gantt._render_leftside_content=function(t){var e="gantt_left "+gantt._get_link_crossing_css(!0,t);return gantt._render_side_content(t,this.templates.leftside_text,e)},gantt._render_rightside_content=function(t){var e="gantt_right "+gantt._get_link_crossing_css(!1,t);return gantt._render_side_content(t,this.templates.rightside_text,e)},gantt._get_conditions=function(t){return t?{$source:[gantt.config.links.start_to_start],$target:[gantt.config.links.start_to_start,gantt.config.links.finish_to_start] +}:{$source:[gantt.config.links.finish_to_start,gantt.config.links.finish_to_finish],$target:[gantt.config.links.finish_to_finish]}},gantt._get_link_crossing_css=function(t,e){var n=gantt._get_conditions(t);for(var a in n)for(var i=e[a],s=0;st||t>e.full_width||!e.full_width)return null;var n=this._findBinary(this._tasks.left,t),a=this._tasks.left[n],i=e.width[n]||e.col_width,s=0;i&&(s=(t-a)/i);var r=0;s&&(r=gantt._get_coll_duration(e,e.trace_x[n]));var o=new Date(e.trace_x[n].valueOf()+Math.round(s*r)); +return o},gantt.posFromDate=function(t){var e=gantt._day_index_by_date(t);this.assert(e>=0,"Invalid day index");var n=Math.floor(e),a=e%1,i=gantt._tasks.left[Math.min(n,gantt._tasks.width.length-1)];return n==gantt._tasks.width.length&&(i+=gantt._tasks.width[gantt._tasks.width.length-1]),a&&(i+=n=this._max_date)return n.length; +for(var i=gantt._findBinary(n,e),s=+gantt._tasks.trace_x[i];a[s];)s=gantt._tasks.trace_x[++i];return s?i+(t-n[i])/gantt._get_coll_duration(gantt._tasks,n[i]):0},gantt._findBinary=function(t,e){for(var n,a,i,s=0,r=t.length-1;r>=s;)if(n=Math.floor((s+r)/2),a=+t[n],i=+t[n-1],e>a)s=n+1;else{if(!(a>e))return n;if(!isNaN(i)&&e>i)return n-1;r=n-1}return t.length-1},gantt._get_coll_duration=function(t,e){return gantt.date.add(e,t.step,t.unit)-e},gantt._get_x_pos=function(t,e){e=e!==!1;gantt.posFromDate(e?t.start_date:t.end_date); +},gantt.getTaskTop=function(t){return this._y_from_ind(this.getGlobalTaskIndex(t))},gantt._get_task_coord=function(t,e,n){e=e!==!1,n=n||0;var a=this._get_safe_type(t.type)==this.config.types.milestone,i=null;i=e||a?t.start_date||this._default_task_date(t):t.end_date||this.calculateEndDate(this._default_task_date(t));var s=this.posFromDate(i),r=this.getTaskTop(t.id);return a&&(e?s-=n:s+=n),{x:s,y:r}},gantt._get_task_pos=function(t,e){e=e!==!1;var n=gantt._get_milestone_width()/2;return this._get_task_coord(t,e,n); +},gantt._get_task_visible_pos=function(t,e){e=e!==!1;var n=gantt._get_visible_milestone_width()/2;return this._get_task_coord(t,e,n)},gantt._correct_shift=function(t,e){return t-=6e4*(new Date(gantt._min_date).getTimezoneOffset()-new Date(t).getTimezoneOffset())*(e?-1:1)},gantt._get_mouse_pos=function(t){if(t.pageX||t.pageY)var e={x:t.pageX,y:t.pageY};var n=gantt.env.isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},a=gantt._get_position(gantt.$task_data); +return e.x=e.x-a.x+gantt.$task_data.scrollLeft,e.y=e.y-a.y+gantt.$task_data.scrollTop,e},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt.attachEvent("onGanttReady",function(){gantt._task_layers.add(),gantt._link_layers.add()}),gantt._layers={prepareConfig:function(t){"function"==typeof t&&(t={renderer:t});t.id=gantt.uid();return t.container||(t.container=document.createElement("div")),t},create:function(t,e){return{tempCollection:[],renderers:{}, +container:t,getRenderers:function(){var t=[];for(var e in this.renderers)t.push(this.renderers[e]);return t},getRenderer:function(t){return this.renderers[t]},add:function(t){if(t&&this.tempCollection.push(t),this.container())for(var n=this.container(),a=this.tempCollection,i=0;ia;a++){var s=t[a];s&&(n=n&&s.apply(gantt,[e.id,e])!==!1)}return n}},gantt._add_generic_layer=function(t,e){return function(n){return void 0===n.filter&&(n.filter=gantt._create_filter(e)), +n=gantt._layers.prepareConfig(n),t.add(n),n.id}},gantt._task_layers=gantt._layers.create(function(){return gantt.$task_data},function(){return gantt.$task_links}),gantt._link_layers=gantt._layers.create(function(){return gantt.$task_data}),gantt.addTaskLayer=gantt._add_generic_layer(gantt._task_layers,[gantt._filter_task,gantt._is_chart_visible].concat(gantt._get_task_filters())),gantt.removeTaskLayer=function(t){gantt._task_layers.remove(t)},gantt.addLinkLayer=gantt._add_generic_layer(gantt._link_layers,[gantt._filter_link,gantt._is_chart_visible].concat(gantt._get_link_filters())), +gantt.removeLinkLayer=function(t){gantt._link_layers.remove(t)},gantt._get_task_renderers=function(){return this._task_layers.getRenderers()},gantt._get_link_renderers=function(){return this._link_layers.getRenderers()},gantt._pull={},gantt._branches={},gantt._order=[],gantt._lpull={},gantt._links=[],gantt._order_full=[],gantt.load=function(t,e,n){this._load_url=t,this.assert(arguments.length,"Invalid load arguments"),this.callEvent("onLoadStart",[]);var a="json",i=null;arguments.length>=3?(a=e,i=n):"string"==typeof arguments[1]?a=arguments[1]:"function"==typeof arguments[1]&&(i=arguments[1]), +this._load_type=a,this.ajax.get(t,gantt.bind(function(t){this.on_load(t,a),this.callEvent("onLoadEnd",[]),"function"==typeof i&&i.call(this)},this))},gantt.parse=function(t,e){this.on_load({xmlDoc:{responseText:t}},e)},gantt.serialize=function(t){return t=t||"json",this[t].serialize()},gantt.on_load=function(t,e){this.callEvent("onBeforeParse",[]),e||(e="json"),this.assert(this[e],"Invalid data type:'"+e+"'");var n=t.xmlDoc.responseText,a=this[e].parse(n,t);this._process_loading(a)},gantt._load_task=function(t){ +return this._init_task(t),this.callEvent("onTaskLoading",[t])?(this._pull[t.id]=t,!0):!1},gantt._build_pull=function(t){for(var e=null,n=[],a=0,i=t.length;i>a;a++)e=t[a],this._load_task(e)&&n.push(e);return n},gantt._build_hierarchy=function(t){for(var e=null,n=0,a=t.length;a>n;n++)e=t[n],this.setParent(e,this.getParent(e)||this.config.root_id);for(var n=0,a=t.length;a>n;n++)e=t[n],this._add_branch(e),e.$level=this.calculateTaskLevel(e)},gantt._process_loading=function(t){t.collections&&this._load_collections(t.collections); +var e=this._build_pull(t.data);if(this._build_hierarchy(e),this._sync_order(),this._order_synced=!0,this._init_links(t.links||(t.collections?t.collections.links:[])),this.callEvent("onParse",[]),this.render(),this.config.initial_scroll){var n=this._order[0]||this.config.root_id;n&&this.showTask(n)}},gantt._init_links=function(t){if(t)for(var e=0;e"},_copyObject:function(t){return""; +},serialize:function(){for(var t=[],e=[],n=gantt.json.serialize(),a=0,i=n.data.length;i>a;a++)t.push(this._copyObject(n.data[a]));for(var a=0,i=n.links.length;i>a;a++)e.push(this._copyLink(n.links[a]));return""+t.join("")+""+e.join("")+""}},gantt.oldxml={parse:function(t,e){e=gantt.xml._getXML(t,e,"projects");for(var n={collections:{links:[]}},a=n.data=[],i=gantt.ajax.xpath("//task",e),s=0;se;e++)if(this.units[e]==t)return e;gantt.assert(!1,"Incorrect duration unit")},_timestamp:function(t){var e=null;return t.day||0===t.day?e=t.day:t.date&&(e=gantt.date.date_part(new Date(t.date)).valueOf()),e},set_time:function(t){var e=void 0!==t.hours?t.hours:!0,n=this._timestamp(t); +null!==n?this.dates[n]=e:this.hours=e,this._working_units_cache.clear()},unset_time:function(t){if(t){var e=this._timestamp(t);null!==e&&delete this.dates[e]}else this.hours=[];this._working_units_cache.clear()},is_working_unit:function(t,e,n){if(!gantt.config.work_time)return!0;var a=this._working_units_cache.get(e,t);return-1==a&&(a=this._check_is_working_unit(t,e,n),this._working_units_cache.put(e,t,a)),a},_check_is_working_unit:function(t,e,n){return void 0===n&&(n=this._get_unit_order(e)),void 0===n?!1:n&&!this.is_working_unit(t,this.units[n-1],n-1)?!1:this["is_work_"+e]?this["is_work_"+e](t):!0; +},is_work_day:function(t){var e=this.get_working_hours(t);return e instanceof Array?e.length>0:!1},is_work_hour:function(t){for(var e=this.get_working_hours(t),n=t.getHours(),a=0;a=e[a]&&ns;){var r=this.next_date(i,n,a);this.is_working_unit(a>0?new Date(r.valueOf()-1):new Date(r.valueOf()+1),n)&&s++,i=r}return i}return gantt.date.add(i,a*e,n)},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date;var e=t.unit,n=gantt.date[e+"_start"](t.date),a=new Date(n),i=new Date(n),s=!0,r=3e3,o=0,_="any"==t.dir||!t.dir,d=1;for("past"==t.dir&&(d=-1);!this.is_working_unit(n,e);){ +_&&(n=s?a:i,d=-1*d);var l=n.getTimezoneOffset();if(n=gantt.date.add(n,d,e),n=gantt._correct_dst_change(n,l,d,e),gantt.date[e+"_start"]&&(n=gantt.date[e+"_start"](n)),_&&(s?a=n:i=n),s=!s,o++,o>r)return gantt.assert(!1,"Invalid working time check"),!1}return(n==i||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){gantt.assert(t,"Invalid argument for gantt.getTask");var e=this._pull[t];return gantt.assert(e,"Task not found id="+t),e},gantt.getTaskByTime=function(t,e){var n=this._pull,a=[]; +if(t||e){t=+t||-(1/0),e=+e||1/0;for(var i in n){var s=n[i];+s.start_datet&&a.push(s)}}else for(var i in n)a.push(n[i]);return a},gantt.isTaskExists=function(t){return gantt.defined(this._pull[t])},gantt.isUnscheduledTask=function(t){return!!t.unscheduled||!t.start_date},gantt._isAllowedUnscheduledTask=function(t){return t.unscheduled&&gantt.config.show_unscheduled},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;var e=this._pull[t];return(+e.start_date<+this._max_date&&+e.end_date>+this._min_date||gantt._isAllowedUnscheduledTask(e))&&void 0!==this._order_search[t]?!0:!1; +},gantt.updateTask=function(t,e){return gantt.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._isAllowedUnscheduledTask(e)&&(this._init_task(e),this._sync_links()),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t,e){var n=this.getParent(t);this.hasChild(n)||(this._branches[n]=[]); +for(var a=this.getChildren(n),i=!1,s=0,r=a.length;r>s;s++)if(a[s]==t.id){i=!0;break}i||(1*e==e?a.splice(e,0,t.id):a.push(t.id)),this._sync_parent(t)},gantt._move_branch=function(t,e,n){this.setParent(t,n),this._sync_parent(t),this._replace_branch_child(e,t.id),this.isTaskExists(n)||n==this.config.root_id?this._add_branch(t):delete this._branches[t.id],t.$level=this.calculateTaskLevel(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,this.getParent(t))}, +gantt._sync_parent=function(t){t.$rendered_parent=this.getParent(t)},gantt._is_parent_sync=function(t){return t.$rendered_parent==this.getParent(t)},gantt._replace_branch_child=function(t,e,n){var a=this.getChildren(t);if(a){for(var i=[],s=0;s=0?1:-1;return a.add_worktime(t,Math.abs(e),n||this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date?!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)):t.end_date&&void 0!==t.duration&&(t.start_date=this.calculateEndDate(t.end_date,-t.duration)), +this._isAllowedUnscheduledTask(t)&&this._set_default_task_timing(t),gantt._init_task_timing(t),t.start_date&&t.end_date&&gantt.correctTaskWorkTime(t),t.$source=[],t.$target=[],void 0===t.parent&&this.setParent(t,this.config.root_id),gantt.defined(t.$open)||(t.$open=gantt.defined(t.open)?t.open:this.config.open_tree_initially),t.$level=this.calculateTaskLevel(t),t},gantt._init_task_timing=function(t){var e=this._get_safe_type(t.type);void 0===t.$rendered_type?t.$rendered_type=e:t.$rendered_type!=e&&(delete t.$no_end, +delete t.$no_start,t.$rendered_type=e),void 0!==t.$no_end&&void 0!==t.$no_start||e==this.config.types.milestone||(e==this.config.types.project?(t.$no_end=t.$no_start=!0,this._set_default_task_timing(t)):(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date,this._isAllowedUnscheduledTask(t)&&(t.$no_end=t.$no_start=!1))),e==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0}, +gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt.resetProjectDates=function(t){if(t.$no_end||t.$no_start){var e=this.getSubtaskDates(t.id);this._assign_project_dates(t,e.start_date,e.end_date)}},gantt.getSubtaskDates=function(t){var e=null,n=null,a=void 0!==t?t:gantt.config.root_id;return this.eachTask(function(t){this._get_safe_type(t.type)==gantt.config.types.project||this.isUnscheduledTask(t)||(t.start_date&&!t.$no_start&&(!e||e>t.start_date.valueOf())&&(e=t.start_date.valueOf()), +t.end_date&&!t.$no_end&&(!n||n=+gantt._min_date&&+i<=+gantt._max_date)a=Math.floor(gantt._day_index_by_date(i)),gantt._tasks.trace_x[a]||(a-=1),n=new Date(gantt._tasks.trace_x[a]),e=new Date(n),e=gantt._tasks.trace_x[a+1]?new Date(gantt._tasks.trace_x[a+1]):gantt.date.add(n,s,r);else{for(a=Math.floor(gantt._day_index_by_date(i)), +e=gantt.date[r+"_start"](new Date(this._min_date)),gantt._tasks.trace_x[a]&&(e=gantt.date[r+"_start"](gantt._tasks.trace_x[a]));+i>+e;){e=gantt.date[r+"_start"](gantt.date.add(e,s,r));var o=e.getTimezoneOffset();e=gantt.date.add(e,s,r),e=gantt._correct_dst_change(e,o,e,r),gantt.date[r+"_start"]&&(e=gantt.date[r+"_start"](e))}n=gantt.date.add(e,-1*s,r)}return t.dir&&"future"==t.dir?e:t.dir&&"past"==t.dir?n:Math.abs(i-n)n[t];return a?1:-1}:t;if(e){var r=s;s=function(t,e){return r(e,t)}}var o=this.getChildren(n); +if(o){for(var _=[],d=o.length-1;d>=0;d--)_[d]=this._pull[o[d]];_.sort(s);for(var d=0;d<_.length;d++)o[d]=_[d].id,this.sort(t,e,o[d],!0)}i&&this.render()},gantt.getNext=function(t){for(var e=0;en;n++)if(e[n]==t)return e[n+1]||null;return null},gantt.getPrevSibling=function(t){for(var e=this.getSiblings(t),n=0,a=e.length;a>n;n++)if(e[n]==t)return e[n-1]||null;return null},gantt._dp_init=function(t){ +t.setTransactionMode("POST",!0),t.serverProcessor+=(-1!=t.serverProcessor.indexOf("?")?"&":"?")+"editing=true",t._serverProcessor=t.serverProcessor,t.styles={updated:"gantt_updated",order:"gantt_updated",inserted:"gantt_inserted",deleted:"gantt_deleted",invalid:"gantt_invalid",error:"gantt_error",clear:""},t._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"],t.setGanttMode=function(e){var n=t.modes||{};t._ganttMode&&(n[t._ganttMode]={_in_progress:t._in_progress,_invalid:t._invalid, +updatedRows:t.updatedRows});var a=n[e];a||(a=n[e]={_in_progress:{},_invalid:{},updatedRows:[]}),t._in_progress=a._in_progress,t._invalid=a._invalid,t.updatedRows=a.updatedRows,t.modes=n,t._ganttMode=e},this._sendTaskOrder=function(e,n){n.$drop_target&&(t.setGanttMode("tasks"),this.getTask(e).target=n.$drop_target,t.setUpdated(e,!0,"order"),delete this.getTask(e).$drop_target)},this.attachEvent("onAfterTaskAdd",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterTaskUpdate",function(e,n){ +t.setGanttMode("tasks"),t.setUpdated(e,!0),gantt._sendTaskOrder(e,n)}),this.attachEvent("onAfterTaskDelete",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"deleted"),"off"==t.updateMode||t._tSend||t.sendAllData()}),this.attachEvent("onAfterLinkUpdate",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0)}),this.attachEvent("onAfterLinkAdd",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterLinkDelete",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"deleted"); +}),this.attachEvent("onRowDragEnd",function(t,e){gantt._sendTaskOrder(t,gantt.getTask(t))});var e=null,n=null;this.attachEvent("onTaskIdChange",function(a,i){if(t._waitMode){var s=gantt.getChildren(i);if(s.length){e=e||{};for(var r=0;r-1?t.indexOf("?"):t.length),this.serverProcessor=t+("/"==t.slice(-1)?"":"/")+e}else this.serverProcessor=t+gantt._urlSeparator(t)+"gantt_mode="+this._ganttMode; +return!0}),this._init_dp_live_update_hooks(t);var a=t.afterUpdate;t.afterUpdate=function(){var e;e=3==arguments.length?arguments[1]:arguments[4];var n=t._ganttMode,i=e.filePath;n="REST"!=this._tMode?-1!=i.indexOf("gantt_mode=links")?"links":"tasks":i.indexOf("/link")>i.indexOf("/task")?"links":"tasks",t.setGanttMode(n);var s=a.apply(t,arguments);return t.setGanttMode(n),s},t._getRowData=gantt.bind(function(e,n){var a;a="tasks"==t._ganttMode?this.isTaskExists(e)?this.getTask(e):{id:e}:this.isLinkExists(e)?this.getLink(e):{ +id:e},a=gantt.copy(a);var i={};for(var s in a)if("$"!=s.substr(0,1)){var r=a[s];r instanceof Date?i[s]=this.templates.xml_format(r):null===r?i[s]="":i[s]=r}return a.$no_start&&(a.start_date="",a.duration=""),a.$no_end&&(a.end_date="",a.duration=""),i[t.action_param]=this.getUserData(e,t.action_param),i},this),this._change_id=gantt.bind(function(e,n){"tasks"!=t._ganttMode?this.changeLinkId(e,n):this.changeTaskId(e,n)},this),this._row_style=function(e,n){if("tasks"==t._ganttMode&&gantt.isTaskExists(e)){ +var a=gantt.getTask(e);a.$dataprocessor_class=n,gantt.refreshTask(e)}},this._delete_task=function(t,e){},this._dp=t},gantt.getUserData=function(t,e){return this.userdata||(this.userdata={}),this.userdata[t]&&this.userdata[t][e]?this.userdata[t][e]:""},gantt.setUserData=function(t,e,n){this.userdata||(this.userdata={}),this.userdata[t]||(this.userdata[t]={}),this.userdata[t][e]=n},gantt._init_link=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t},gantt._sync_links=function(){for(var t=null,e=0,n=this._order_full.length;n>e;e++)t=this._pull[this._order_full[e]], +t.$source=[],t.$target=[];this._links=[];for(var a in this._lpull){var i=this._lpull[a];this._links.push(i),this._pull[i.source]&&this._pull[i.source].$source.push(a),this._pull[i.target]&&this._pull[i.target].$target.push(a)}},gantt.getLink=function(t){return gantt.assert(this._lpull[t],"Link doesn't exist"),this._lpull[t]},gantt.getLinks=function(){var t=[];for(var e in gantt._lpull)t.push(gantt._lpull[e]);return t},gantt.isLinkExists=function(t){return gantt.defined(this._lpull[t])},gantt.addLink=function(t){ +return t=this._init_link(t),this.callEvent("onBeforeLinkAdd",[t.id,t])===!1?!1:(this._lpull[t.id]=t,this._sync_links(),this._render_link(t.id),this.callEvent("onAfterLinkAdd",[t.id,t]),t.id)},gantt.updateLink=function(t,e){return gantt.defined(e)||(e=this.getLink(t)),this.callEvent("onBeforeLinkUpdate",[t,e])===!1?!1:(this._lpull[t]=e,this._sync_links(),this._render_link(t),this.callEvent("onAfterLinkUpdate",[t,e]),!0)},gantt.deleteLink=function(t){return this._deleteLink(t)},gantt._deleteLink=function(t,e){ +var n=this.getLink(t);return e||this.callEvent("onBeforeLinkDelete",[t,n])!==!1?(delete this._lpull[t],this._sync_links(),this.refreshLink(t),e||this.callEvent("onAfterLinkDelete",[t,n]),!0):!1},gantt.changeLinkId=function(t,e){this._lpull[t]&&(this._lpull[e]=this._lpull[t],this._lpull[e].id=e,delete this._lpull[t],this._sync_links(),this.callEvent("onLinkIdChange",[t,e]))},gantt.getChildren=function(t){return gantt.defined(this._branches[t])?this._branches[t]:[]},gantt.hasChild=function(t){return gantt.defined(this._branches[t])&&this._branches[t].length; +},gantt.refreshData=function(){this._render_data()},gantt._isTask=function(t){return!(t.type&&t.type==gantt.config.types.project||t.$no_start||t.$no_end)},gantt._isProject=function(t){return!this._isTask(t)},gantt._configure=function(t,e,n){for(var a in e)("undefined"==typeof t[a]||n)&&(t[a]=e[a])},gantt._init_skin=function(){gantt._get_skin(!1),gantt._init_skin=function(){}},gantt._get_skin=function(t){if(!gantt.skin||t)for(var e=document.getElementsByTagName("link"),n=0;n=1440||!this._is_chart_visible())&&(e=this.config.time_step),e}return this.config.time_step},gantt.getLabel=function(t,e){for(var n=this._get_typed_lightbox_config(),a=0;a
"+this.locale.labels[r]+"
"}i=this.config.buttons_right;for(var s=0;s
"+this.locale.labels[r]+"
"; +}a+="",e.innerHTML=a,gantt.config.drag_lightbox&&(e.firstChild.onmousedown=gantt._ready_to_dnd,e.firstChild.onselectstart=function(){return!1},e.firstChild.style.cursor="pointer",gantt._init_dnd_events()),document.body.insertBefore(e,document.body.firstChild),this._lightbox=e;var o=this._get_typed_lightbox_config(t);a=this._render_sections(o);for(var _=e.getElementsByTagName("div"),s=0;s<_.length;s++){var d=_[s];if("gantt_cal_larea"==d.className){d.innerHTML=a;break}}this.resizeLightbox(),this._init_lightbox_events(this), +e.style.display="none",e.style.visibility="visible"}return this._lightbox},gantt._render_sections=function(t){for(var e="",n=0;n
"+this.locale.labels["button_"+t[n].button]+"
"),this.config.wide_form&&(e+="
"), +e+="
"+s+this.locale.labels["section_"+t[n].name]+"
"+a.render.call(this,t[n]),e+="
"}}return e},gantt.resizeLightbox=function(){var t=this._lightbox;if(t){var e=t.childNodes[1];e.style.height="0px",e.style.height=e.scrollHeight+"px",t.style.height=e.scrollHeight+this.config.lightbox_additional_height+"px",e.style.height=e.scrollHeight+"px"}},gantt._center_lightbox=function(t){if(t){t.style.display="block";var e=window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop,n=window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft,a=window.innerHeight||document.documentElement.clientHeight; +e?t.style.top=Math.round(e+Math.max((a-t.offsetHeight)/2,0))+"px":t.style.top=Math.round(Math.max((a-t.offsetHeight)/2,0)+9)+"px",document.documentElement.scrollWidth>document.body.offsetWidth?t.style.left=Math.round(n+(document.body.offsetWidth-t.offsetWidth)/2)+"px":t.style.left=Math.round((document.body.offsetWidth-t.offsetWidth)/2)+"px"}},gantt.showCover=function(){if(!this._cover){this._cover=document.createElement("DIV"),this._cover.className="gantt_cal_cover";var t=void 0!==document.height?document.height:document.body.offsetHeight,e=document.documentElement?document.documentElement.scrollHeight:0; +this._cover.style.height=Math.max(t,e)+"px",document.body.appendChild(this._cover)}},gantt._init_lightbox_events=function(){gantt.lightbox_events={},gantt.lightbox_events.gantt_save_btn=function(t){gantt._save_lightbox()},gantt.lightbox_events.gantt_delete_btn=function(t){gantt.callEvent("onLightboxDelete",[gantt._lightbox_id])&&(gantt.isTaskExists(gantt._lightbox_id)?gantt.$click.buttons["delete"](gantt._lightbox_id):gantt.hideLightbox())},gantt.lightbox_events.gantt_cancel_btn=function(t){gantt._cancel_lightbox(); +},gantt.lightbox_events["default"]=function(t,e){if(e.getAttribute("dhx_button"))gantt.callEvent("onLightboxButton",[e.className,e,t]);else{var n,a,i,s=gantt._getClassName(e);-1!=s.indexOf("gantt_custom_button")&&(-1!=s.indexOf("gantt_custom_button_")?(n=e.parentNode.getAttribute("index"),i=e.parentNode.parentNode):(n=e.getAttribute("index"),i=e.parentNode,e=e.firstChild));var r=gantt._get_typed_lightbox_config();n&&(a=gantt.form_blocks[r[n].type],a.button_click(n,e,i,i.nextSibling))}},this.event(gantt.getLightbox(),"click",function(t){ +t=t||window.event;var e=t.target?t.target:t.srcElement,n=gantt._getClassName(e);if(n||(e=e.previousSibling,n=gantt._getClassName(e)),e&&n&&0===n.indexOf("gantt_btn_set")&&(e=e.firstChild,n=gantt._getClassName(e)),e&&n){var a=gantt.defined(gantt.lightbox_events[e.className])?gantt.lightbox_events[e.className]:gantt.lightbox_events["default"];return a(t,e)}return!1}),gantt.getLightbox().onkeydown=function(t){switch((t||event).keyCode){case gantt.keys.edit_save:if((t||event).shiftKey)return;gantt._save_lightbox(); +break;case gantt.keys.edit_cancel:gantt._cancel_lightbox()}}},gantt._cancel_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxCancel",[this._lightbox_id,t.$new]),gantt.isTaskExists(t.id)&&t.$new&&this._deleteTask(t.id,!0),this.refreshData(),this.hideLightbox()},gantt._save_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxSave",[this._lightbox_id,t,!!t.$new])&&(t.$new?(delete t.$new,this._replace_branch_child(this.getParent(t.id),t.id),this.addTask(t)):this.isTaskExists(t.id)&&(this.mixin(this.getTask(t.id),t,!0), +this.updateTask(t.id)),this.refreshData(),this.hideLightbox())},gantt._resolve_default_mapping=function(t){var e=t.map_to,n={time:!0,time_optional:!0,duration:!0,duration_optional:!0};return n[t.type]&&("auto"==t.map_to?e={start_date:"start_date",end_date:"end_date",duration:"duration"}:"string"==typeof t.map_to&&(e={start_date:t.map_to})),e},gantt.getLightboxValues=function(){var t={};gantt.isTaskExists(this._lightbox_id)&&(t=this.mixin({},this.getTask(this._lightbox_id)));for(var e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var l="";switch(d){case"%Y":t._time_format_order[2]=_,t._time_format_order.size++;var g,h,c,u;t.year_range&&(isNaN(t.year_range)?t.year_range.push&&(c=t.year_range[0],u=t.year_range[1]):g=t.year_range),g=g||10,h=h||Math.floor(g/2), +c=c||i.getFullYear()-h,u=u||c+g;for(var f=c;u>f;f++)l+="";break;case"%m":t._time_format_order[1]=_,t._time_format_order.size++;for(var f=0;12>f;f++)l+="";break;case"%d":t._time_format_order[0]=_,t._time_format_order.size++;for(var f=1;32>f;f++)l+="";break;case"%H:%i":t._time_format_order[3]=_,t._time_format_order.size++;var f=r,p=i.getDate();for(t._time_values=[];s>f;){ +var v=this.templates.time_picker(i);l+="",t._time_values.push(f),i.setTime(i.valueOf()+60*this._get_timepicker_step()*1e3);var m=i.getDate()!=p?1:0;f=24*m*60+60*i.getHours()+i.getMinutes()}}if(l){var k=t.readonly?"disabled='disabled'":"",b=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,a,i){if(t[e+a[0]].value=n.getDate(),t[e+a[1]].value=n.getMonth(),t[e+a[2]].value=n.getFullYear(),gantt.defined(a[3])){ +var s=60*n.getHours()+n.getMinutes();s=Math.round(s/gantt._get_timepicker_step())*gantt._get_timepicker_step();var r=t[e+a[3]];r.value=s,r.setAttribute("data-value",s)}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e,n,a){t.innerHTML=e||""},get_value:function(t,e,n){return t.innerHTML||""},focus:function(t){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"; +},set_value:function(t,e,n){t.firstChild.value=e||""},get_value:function(t,e){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},select:{render:function(t){for(var e=(t.height||"23")+"px",n="
"},set_value:function(t,e,n,a){var i=t.firstChild;!i._dhx_onchange&&a.onchange&&(i.onchange=a.onchange, +i._dhx_onchange=!0),"undefined"==typeof e&&(e=(i.options[0]||{}).value),i.value=e||""},get_value:function(t,e){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},time:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t),n=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "), +n.push(e),n.push("
"),n.join("")},set_value:function(t,e,n,a){var i=a,s=t.getElementsByTagName("select"),r=a._time_format_order;a._time_format_size;if(i.auto_end_date)for(var o=function(){l=new Date(s[r[2]].value,s[r[1]].value,s[r[0]].value,0,0),g=gantt.calculateEndDate(l,1),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},_=0;4>_;_++)s[_].onchange=o;var d=gantt._resolve_default_mapping(a);"string"==typeof d&&(d={start_date:d});var l=n[d.start_date]||new Date,g=n[d.end_date]||gantt.calculateEndDate(l,1); +this.form_blocks._fill_lightbox_select(s,0,l,r,i),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},get_value:function(t,e,n){var a=t.getElementsByTagName("select"),i=n._time_format_order,s=0,r=0;if(gantt.defined(i[3])){var o=parseInt(a[i[3]].value,10);s=Math.floor(o/60),r=o%60}var _=new Date(a[i[2]].value,a[i[1]].value,a[i[0]].value,s,r);if(s=r=0,gantt.defined(i[3])){var o=parseInt(a[i.size+i[3]].value,10);s=Math.floor(o/60),r=o%60}var d=new Date(a[i[2]+i.size].value,a[i[1]+i.size].value,a[i[0]+i.size].value,s,r); +_>=d&&(d=gantt.date.add(_,gantt._get_timepicker_step(),"minute"));var l=gantt._resolve_default_mapping(n),g={start_date:new Date(_),end_date:new Date(d)};return"string"==typeof l?g.start_date:g},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},duration:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t);e="
"+e+"
";var n=this.locale.labels[this.config.duration_unit+"s"],a=t.single_date?' style="display:none"':"",i=t.readonly?" disabled='disabled'":"",s="
"+n+"
",r="
"+e+" "+s+"
"; +return r},set_value:function(t,e,n,a){function i(){var e=gantt.form_blocks.duration._get_start_date.call(gantt,t,a),n=gantt.form_blocks.duration._get_duration.call(gantt,t,a),i=gantt.calculateEndDate(e,n);g.innerHTML=gantt.templates.task_date(i)}function s(t){var e=d.value;e=parseInt(e,10),window.isNaN(e)&&(e=0),e+=t,1>e&&(e=1),d.value=e,i()}var r=a,o=t.getElementsByTagName("select"),_=t.getElementsByTagName("input"),d=_[1],l=[_[0],_[2]],g=t.getElementsByTagName("span")[0],h=a._time_format_order;l[0].onclick=gantt.bind(function(){ +s(-1*this.config.duration_step)},this),l[1].onclick=gantt.bind(function(){s(1*this.config.duration_step)},this),o[0].onchange=i,o[1].onchange=i,o[2].onchange=i,o[3]&&(o[3].onchange=i),d.onkeydown=gantt.bind(function(t){t=t||window.event;var e=t.charCode||t.keyCode||t.which;return 40==e?(s(-1*this.config.duration_step),!1):38==e?(s(1*this.config.duration_step),!1):void window.setTimeout(function(t){i()},1)},this),d.onchange=gantt.bind(function(t){i()},this);var c=gantt._resolve_default_mapping(a);"string"==typeof c&&(c={ +start_date:c});var u=n[c.start_date]||new Date,f=n[c.end_date]||gantt.calculateEndDate(u,1),p=Math.round(n[c.duration])||gantt.calculateDuration(u,f);gantt.form_blocks._fill_lightbox_select(o,0,u,h,r),d.value=p,i()},_get_start_date:function(t,e){var n=t.getElementsByTagName("select"),a=e._time_format_order,i=0,s=0;if(gantt.defined(a[3])){var r=n[a[3]],o=parseInt(r.value,10);isNaN(o)&&r.hasAttribute("data-value")&&(o=parseInt(r.getAttribute("data-value"),10)),i=Math.floor(o/60),s=o%60}return new Date(n[a[2]].value,n[a[1]].value,n[a[0]].value,i,s); +},_get_duration:function(t,e){var n=t.getElementsByTagName("input")[1];return n=parseInt(n.value,10),(!n||window.isNaN(n))&&(n=1),0>n&&(n*=-1),n},get_value:function(t,e,n){var a=gantt.form_blocks.duration._get_start_date(t,n),i=gantt.form_blocks.duration._get_duration(t,n),s=gantt.calculateEndDate(a,i),r=gantt._resolve_default_mapping(n),o={start_date:new Date(a),end_date:new Date(s),duration:i};return"string"==typeof r?o.start_date:o},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0]); +}},parent:{_filter:function(t,e,n){var a=e.filter||function(){return!0};t=t.slice(0);for(var i=0;i
",this.$grid_scale=this.$grid.childNodes[0], +this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",this.$task_scale=this.$task.childNodes[0],this.$task_data=this.$task.childNodes[1],this.$task_bg=this.$task_data.childNodes[0],this.$task_links=this.$task_data.childNodes[1],this.$task_bars=this.$task_data.childNodes[2]},gantt.$click={buttons:{edit:function(t){ +gantt.showLightbox(t)},"delete":function(t){var e=gantt.locale.labels.confirm_deleting,n=gantt.locale.labels.confirm_deleting_title;gantt._dhtmlx_confirm(e,n,function(){if(!gantt.isTaskExists(t))return void gantt.hideLightbox();var e=gantt.getTask(t);e.$new?(gantt._deleteTask(t,!0),gantt.refreshData()):gantt.deleteTask(t),gantt.hideLightbox()})}}},gantt._calculate_content_height=function(){var t=this.config.scale_height,e=this._order.length*this.config.row_height,n=this._scroll_hor?this.config.scroll_size+1:0; +return this._is_grid_visible()||this._is_chart_visible()?t+e+2+n:0},gantt._calculate_content_width=function(){var t=this._get_grid_width(),e=this._tasks?this._tasks.full_width:0;this._scroll_ver?this.config.scroll_size+1:0;return this._is_chart_visible()||(e=0),this._is_grid_visible()||(t=0),t+e+1},gantt._get_resize_options=function(){var t={x:!1,y:!1};return"xy"==this.config.autosize?t.x=t.y=!0:"y"==this.config.autosize||this.config.autosize===!0?t.y=!0:"x"==this.config.autosize&&(t.x=!0),t},gantt._clean_el_size=function(t){ +return 1*(t||"").toString().replace("px","")||0},gantt._get_box_styles=function(){var t=null;t=window.getComputedStyle?window.getComputedStyle(this._obj,null):{width:this._obj.clientWidth,height:this._obj.clientHeight};var e=["width","height","paddingTop","paddingBottom","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],n={boxSizing:"border-box"==t.boxSizing};t.MozBoxSizing&&(n.boxSizing="border-box"==t.MozBoxSizing);for(var a=0;aMath.abs(i)){if(n.x)return!0;if(!gantt.$scroll_hor||!gantt.$scroll_hor.offsetWidth)return!0; +var s=a/-40,r=gantt.$task.scrollLeft,o=r+30*s;if(gantt.scrollTo(o,null),gantt.$scroll_hor.scrollLeft=o,r==gantt.$task.scrollLeft)return!0}else{if(n.y)return!0;if(!gantt.$scroll_ver||!gantt.$scroll_ver.offsetHeight)return!0;var s=i/-40;"undefined"==typeof i&&(s=t.detail);var _=gantt.$scroll_ver.scrollTop,d=gantt.$scroll_ver.scrollTop+30*s;if(!gantt.config.prevent_default_scroll&&gantt._cached_scroll_pos&&(gantt._cached_scroll_pos.y==d||gantt._cached_scroll_pos.y<=0&&0>=d))return!0;if(gantt.scrollTo(null,d), +gantt.$scroll_ver.scrollTop=d,_==gantt.$scroll_ver.scrollTop)return!0}return t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1}this.event(this.$scroll_hor,"scroll",function(){if(new Date-(gantt._wheel_time||0)<100)return!0;if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),this.event(this.$scroll_ver,"scroll",function(){if(!gantt._touch_scroll_active){var t=gantt.$scroll_ver.scrollTop;gantt.$grid_data.scrollTop=t,gantt.scrollTo(null,t)}}),this.event(this.$task,"scroll",function(){ +var t=gantt.$task.scrollLeft,e=gantt.$scroll_hor.scrollLeft;e!=t&&(gantt.$scroll_hor.scrollLeft=t)}),this.event(this.$task_data,"scroll",function(){var t=gantt.$task_data.scrollTop,e=gantt.$scroll_ver.scrollTop;e!=t&&(gantt.$scroll_ver.scrollTop=t)});var e=gantt.env.isFF;e?this.event(gantt.$container,"wheel",t):this.event(gantt.$container,"mousewheel",t)},gantt._scroll_resize=function(){if(!(this._x<20||this._y<20)){var t=this._scroll_sizes();t.x?(this.$scroll_hor.style.display="block",this.$scroll_hor.style.height=t.scroll_size+"px", +this.$scroll_hor.style.width=t.x+"px",this.$scroll_hor.firstChild.style.width=t.x_inner+"px"):(this.$scroll_hor.style.display="none",this.$scroll_hor.style.height=this.$scroll_hor.style.width="0px"),t.y?(this.$scroll_ver.style.display="block",this.$scroll_ver.style.width=t.scroll_size+"px",this.$scroll_ver.style.height=t.y+"px",this.$scroll_ver.style.top=this.config.scale_height+"px",this.$scroll_ver.firstChild.style.height=t.y_inner+"px"):(this.$scroll_ver.style.display="none",this.$scroll_ver.style.width=this.$scroll_ver.style.height="0px"); +}},gantt._scroll_sizes=function(){var t=this._get_grid_width(),e=Math.max(this._x-t,0),n=Math.max(this._y-this.config.scale_height,0),a=this.config.scroll_size+1,i=Math.max(this.$task_data.offsetWidth-a,0),s=this.config.row_height*this._order.length,r=this._get_resize_options(),o=this._scroll_hor=r.x?!1:i>e,_=this._scroll_ver=r.y?!1:s>n,d={x:!1,y:!1,scroll_size:a,x_inner:i+t+a+2,y_inner:this.config.scale_height+s};return o&&(d.x=Math.max(this._x-(_?a:2),0)),_&&(d.y=Math.max(this._y-(o?a:0)-this.config.scale_height,0)), +d},gantt._getClassName=function(t){if(!t)return"";var e=t.className||"";return e.baseVal&&(e=e.baseVal),e.indexOf||(e=""),gantt._trim(e)},gantt.locate=function(t){var e=gantt._get_target_node(t),n=gantt._getClassName(e);if((n||"").indexOf("gantt_task_cell")>=0)return null;for(var a=arguments[1]||this.config.task_attribute;e;){if(e.getAttribute){var i=e.getAttribute(a);if(i)return i}e=e.parentNode}return null},gantt._get_target_node=function(t){var e;return t.tagName?e=t:(t=t||window.event,e=t.target||t.srcElement), +e},gantt._trim=function(t){var e=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")};return e.apply(t)},gantt._locate_css=function(t,e,n){void 0===n&&(n=!0);for(var a=gantt._get_target_node(t),i="";a;){if(i=gantt._getClassName(a)){var s=i.indexOf(e);if(s>=0){if(!n)return a;var r=0===s||!gantt._trim(i.charAt(s-1)),o=s+e.length>=i.length||!gantt._trim(i.charAt(s+e.length));if(r&&o)return a}}a=a.parentNode}return null},gantt._locateHTML=function(t,e){var n=gantt._get_target_node(t); +for(e=e||this.config.task_attribute;n;){if(n.getAttribute){var a=n.getAttribute(e);if(a)return n}n=n.parentNode}return null},gantt.getTaskRowNode=function(t){for(var e=this.$grid_data.childNodes,n=this.config.task_attribute,a=0;an?!0:t._on_timeout?!1:(setTimeout(function(){delete t._on_timeout},n),t._on_timeout=!0,!0)},gantt.selectTask=function(t){if(!this.config.select_task)return!1;if(t){if(this._selected_task==t)return this._selected_task;if(!this.callEvent("onBeforeTaskSelected",[t]))return!1;this.unselectTask(),this._selected_task=t, +this.refreshTask(t),this.callEvent("onTaskSelected",[t])}return this._selected_task},gantt.unselectTask=function(t){var t=t||this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){return this.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t)},gantt._is_render_active=function(){return!this._skip_render; +},gantt._correct_dst_change=function(t,e,n,a){var i=gantt._get_line(a)*n;if(i>3600&&86400>i){var s=t.getTimezoneOffset()-e;s&&(t=gantt.date.add(t,s,"minute"))}return t},gantt.batchUpdate=function(t,e){var n,a=this._dp&&"off"!=this._dp.updateMode;a&&(n=this._dp.updateMode,this._dp.setUpdateMode("off"));var i=this._sync_order;this._sync_order=function(){};var s=this._sync_links;this._sync_links=function(){};var r=this._adjust_scales;this._adjust_scales=function(){};var o={},_=this.resetProjectDates; +this.resetProjectDates=function(t){o[t.id]=t},this._skip_render=!0,this.callEvent("onBeforeBatchUpdate",[]);try{t()}catch(d){}this.callEvent("onAfterBatchUpdate",[]),this._sync_order=i,this._sync_order(),this._sync_links=s,this._sync_links(),this.resetProjectDates=_;for(var l in o)this.resetProjectDates(o[l]);this._adjust_scales=r,this._adjust_scales(),this._skip_render=!1,e||this.render(),a&&(this._dp.setUpdateMode(n),this._dp.setGanttMode("tasks"),this._dp.sendData(),this._dp.setGanttMode("links"), +this._dp.sendData())},gantt.env={isIE:navigator.userAgent.indexOf("MSIE")>=0||navigator.userAgent.indexOf("Trident")>=0,isIE6:!window.XMLHttpRequest&&navigator.userAgent.indexOf("MSIE")>=0,isIE7:navigator.userAgent.indexOf("MSIE 7.0")>=0&&navigator.userAgent.indexOf("Trident")<0,isIE8:navigator.userAgent.indexOf("MSIE 8.0")>=0&&navigator.userAgent.indexOf("Trident")>=0,isOpera:navigator.userAgent.indexOf("Opera")>=0,isChrome:navigator.userAgent.indexOf("Chrome")>=0,isKHTML:navigator.userAgent.indexOf("Safari")>=0||navigator.userAgent.indexOf("Konqueror")>=0, +isFF:navigator.userAgent.indexOf("Firefox")>=0,isIPad:navigator.userAgent.search(/iPad/gi)>=0,isEdge:-1!=navigator.userAgent.indexOf("Edge")},gantt.ajax={cache:!0,method:"get",parse:function(t){if("string"!=typeof t)return t;var e;return t=t.replace(/^[\s]+/,""),window.DOMParser&&!gantt.env.isIE?e=(new window.DOMParser).parseFromString(t,"text/xml"):window.ActiveXObject!==window.undefined&&(e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async="false",e.loadXML(t)),e},xmltop:function(t,e,n){if("undefined"==typeof e.status||e.status<400){ +var a=e.responseXML?e.responseXML||e:gantt.ajax.parse(e.responseText||e);if(a&&null!==a.documentElement&&!a.getElementsByTagName("parsererror").length)return a.getElementsByTagName(t)[0]}return-1!==n&&gantt.callEvent("onLoadXMLError",["Incorrect XML",arguments[1],n]),document.createElement("DIV")},xpath:function(t,e){if(e.nodeName||(e=e.responseXML||e),gantt.env.isIE)return e.selectNodes(t)||[];for(var n,a=[],i=(e.ownerDocument||e).evaluate(t,e,null,XPathResult.ANY_TYPE,null);;){if(n=i.iterateNext(), +!n)break;a.push(n)}return a},query:function(t){gantt.ajax._call(t.method||"GET",t.url,t.data||"",t.async||!0,t.callback,null,t.headers)},get:function(t,e){this._call("GET",t,null,!0,e)},getSync:function(t){return this._call("GET",t,null,!1)},put:function(t,e,n){this._call("PUT",t,e,!0,n)},del:function(t,e,n){this._call("DELETE",t,e,!0,n)},post:function(t,e,n){1==arguments.length?e="":2!=arguments.length||"function"!=typeof e&&"function"!=typeof window[e]?e=String(e):(n=e,e=""),this._call("POST",t,e,!0,n); +},postSync:function(t,e){return e=null===e?"":String(e),this._call("POST",t,e,!1)},getLong:function(t,e){this._call("GET",t,null,!0,e,{url:t})},postLong:function(t,e,n){2==arguments.length&&(n=e,e=""),this._call("POST",t,e,!0,n,{url:t,postData:e})},_call:function(t,e,n,a,i,s,r){var o=window.XMLHttpRequest&&!gantt.env.isIE?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),_=null!==navigator.userAgent.match(/AppleWebKit/)&&null!==navigator.userAgent.match(/Qt/)&&null!==navigator.userAgent.match(/Safari/); +if(a&&(o.onreadystatechange=function(){if(4==o.readyState||_&&3==o.readyState){if((200!=o.status||""===o.responseText)&&!gantt.callEvent("onAjaxError",[o]))return;window.setTimeout(function(){"function"==typeof i&&i.apply(window,[{xmlDoc:o,filePath:e}]),s&&("undefined"!=typeof s.postData?gantt.ajax.postLong(s.url,s.postData,i):gantt.ajax.getLong(s.url,i)),i=null,o=null},1)}}),"GET"!=t||this.cache||(e+=(e.indexOf("?")>=0?"&":"?")+"dhxr"+(new Date).getTime()+"=1"),o.open(t,e,a),r)for(var d in r)o.setRequestHeader(d,r[d]);else"POST"==t.toUpperCase()||"PUT"==t||"DELETE"==t?o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"):"GET"==t&&(n=null); +return o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.send(n),a?void 0:{xmlDoc:o,filePath:e}}},gantt._urlSeparator=function(t){return-1!=t.indexOf("?")?"&":"?"},function(){function t(t,e){var a=t.callback;n(!1),t.box.parentNode.removeChild(t.box),h=t.box=null,a&&a(e)}function e(e){if(h){e=e||event;var n=e.which||event.keyCode;return gantt.message.keyboard&&((13==n||32==n)&&t(h,!0),27==n&&t(h,!1)),e.preventDefault&&e.preventDefault(),!(e.cancelBubble=!0)}}function n(t){n.cover||(n.cover=document.createElement("DIV"), +n.cover.onkeydown=e,n.cover.className="dhx_modal_cover",document.body.appendChild(n.cover));document.body.scrollHeight;n.cover.style.display=t?"inline-block":"none"}function a(t,e){var n="gantt_"+t.toLowerCase().replace(/ /g,"_")+"_button dhtmlx_"+t.toLowerCase().replace(/ /g,"_")+"_button";return"
"+t+"
"}function i(t){c.area||(c.area=document.createElement("DIV"),c.area.className="gantt_message_area dhtmlx_message_area", +c.area.style[c.position]="5px",document.body.appendChild(c.area)),c.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
"+t.text+"
",e.className="gantt-info dhtmlx-info gantt-"+t.type+" dhtmlx-"+t.type,e.onclick=function(){c.hide(t.id),t=null},"bottom"==c.position&&c.area.firstChild?c.area.insertBefore(e,c.area.firstChild):c.area.appendChild(e),t.expire>0&&(c.timers[t.id]=window.setTimeout(function(){c.hide(t.id)},t.expire)),c.pull[t.id]=e,e=null,t.id}function s(e,n,i){var s=document.createElement("DIV"); +s.className=" gantt_modal_box dhtmlx_modal_box gantt-"+e.type+" dhtmlx-"+e.type,s.setAttribute("dhxbox",1);var r="";if(e.width&&(s.style.width=e.width),e.height&&(s.style.height=e.height),e.title&&(r+='
'+e.title+"
"),r+='
'+(e.content?"":e.text)+'
',n&&(r+=a(e.ok||"OK",!0)),i&&(r+=a(e.cancel||"Cancel",!1)),e.buttons)for(var o=0;o=0&&!t.getHours()&&n.getHours()&&(n.getDate()<=t.getDate()||n.getMonth()t?"0"+t:t},copy:function(t){return new Date(t.valueOf())},date_to_str:function(t,e){ +return t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+gantt.date.to_fixed(date.getDate())+"';case"%m":return'"+gantt.date.to_fixed((date.getMonth()+1))+"';case"%j":return'"+date.getDate()+"';case"%n":return'"+(date.getMonth()+1)+"';case"%y":return'"+gantt.date.to_fixed(date.getFullYear()%100)+"';case"%Y":return'"+date.getFullYear()+"';case"%D":return'"+gantt.locale.date.day_short[date.getDay()]+"';case"%l":return'"+gantt.locale.date.day_full[date.getDay()]+"';case"%M":return'"+gantt.locale.date.month_short[date.getMonth()]+"'; +case"%F":return'"+gantt.locale.date.month_full[date.getMonth()]+"';case"%h":return'"+gantt.date.to_fixed((date.getHours()+11)%12+1)+"';case"%g":return'"+((date.getHours()+11)%12+1)+"';case"%G":return'"+date.getHours()+"';case"%H":return'"+gantt.date.to_fixed(date.getHours())+"';case"%i":return'"+gantt.date.to_fixed(date.getMinutes())+"';case"%a":return'"+(date.getHours()>11?"pm":"am")+"';case"%A":return'"+(date.getHours()>11?"PM":"AM")+"';case"%s":return'"+gantt.date.to_fixed(date.getSeconds())+"'; +case"%W":return'"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+"';default:return t}}),e&&(t=t.replace(/date\.get/g,"date.getUTC")),new Function("date",'return "'+t+'";')},str_to_date:function(t,e){for(var n="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);",a=t.match(/%[a-zA-Z]/g),i=0;i50?1900:2000);";break;case"%g":case"%G": +case"%h":case"%H":n+="set[3]=temp["+i+"]||0;";break;case"%i":n+="set[4]=temp["+i+"]||0;";break;case"%Y":n+="set[0]=temp["+i+"]||0;";break;case"%a":case"%A":n+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":n+="set[5]=temp["+i+"]||0;";break;case"%M":n+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;";break;case"%F":n+="set[1]=gantt.locale.date.month_full_hash[temp["+i+"]]||0;"}var s="set[0],set[1],set[2],set[3],set[4],set[5]";return e&&(s=" Date.UTC("+s+")"), +new Function("date","var set=[0,0,1,0,0,0]; "+n+" return new Date("+s+");")},getISOWeek:function(t){if(!t)return!1;var e=t.getDay();0===e&&(e=7);var n=new Date(t.valueOf());n.setDate(t.getDate()+(4-e));var a=n.getFullYear(),i=Math.round((n.getTime()-new Date(a,0,1).getTime())/864e5),s=1+Math.floor(i/7);return s},getUTCISOWeek:function(t){return this.getISOWeek(t)},convert_to_utc:function(t){return new Date(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds()); +},parseDate:function(t,e){return"string"==typeof t&&(gantt.defined(e)&&(e="string"==typeof e?gantt.defined(gantt.templates[e])?gantt.templates[e]:gantt.date.str_to_date(e):gantt.templates.xml_date),t=t?e(t):null),t}},gantt.date.quarter_start=function(t){gantt.date.month_start(t);var e,n=t.getMonth();return e=n>=9?9:n>=6?6:n>=3?3:0,t.setMonth(e),t},gantt.date.add_quarter=function(t,e){return gantt.date.add(t,3*e,"month")},gantt.config||(gantt.config={}),gantt.config||(gantt.config={}),gantt.templates||(gantt.templates={}), +function(){gantt.mixin(gantt.config,{links:{finish_to_start:"0",start_to_start:"1",finish_to_finish:"2",start_to_finish:"3"},types:{task:"task",project:"project",milestone:"milestone"},duration_unit:"day",work_time:!1,correct_work_time:!1,skip_off_time:!1,autosize:!1,autosize_min_width:0,show_links:!0,show_task_cells:!0,static_background:!1,branch_loading:!1,show_loading:!1,show_chart:!0,show_grid:!0,min_duration:36e5,xml_date:"%d-%m-%Y %H:%i",api_date:"%d-%m-%Y %H:%i",start_on_monday:!0,server_utc:!1, +show_progress:!0,fit_tasks:!1,select_task:!0,scroll_on_click:!0,preserve_scroll:!0,readonly:!1,date_grid:"%Y-%m-%d",drag_links:!0,drag_progress:!0,drag_resize:!0,drag_move:!0,drag_mode:{resize:"resize",progress:"progress",move:"move",ignore:"ignore"},round_dnd_dates:!0,link_wrapper_width:20,root_id:0,autofit:!1,columns:[{name:"text",tree:!0,width:"*",resize:!0},{name:"start_date",align:"center",resize:!0},{name:"duration",align:"center"},{name:"add",width:"44"}],step:1,scale_unit:"day",scale_offset_minimal:!0, +subscales:[],inherit_scale_class:!1,time_step:60,duration_step:1,date_scale:"%d %M",task_date:"%d %F %Y",time_picker:"%H:%i",task_attribute:"task_id",link_attribute:"link_id",layer_attribute:"data-layer",buttons_left:["gantt_save_btn","gantt_cancel_btn"],_migrate_buttons:{dhx_save_btn:"gantt_save_btn",dhx_cancel_btn:"gantt_cancel_btn",dhx_delete_btn:"gantt_delete_btn"},buttons_right:["gantt_delete_btn"],lightbox:{sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"time", +type:"duration",map_to:"auto"}],project_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect",map_to:"type"},{name:"time",type:"duration",readonly:!0,map_to:"auto"}],milestone_sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"type",type:"typeselect",map_to:"type"},{name:"time",type:"duration",single_date:!0,map_to:"auto"}]},drag_lightbox:!0,sort:!1,details_on_create:!0,details_on_dblclick:!0,initial_scroll:!0, +task_scroll_offset:100,order_branch:!1,order_branch_free:!1,task_height:"full",min_column_width:70,min_grid_column_width:70,grid_resizer_column_attribute:"column_index",grid_resizer_attribute:"grid_resizer",keep_grid_width:!1,grid_resize:!1,show_unscheduled:!0,readonly_property:"readonly",editable_property:"editable",type_renderers:{},open_tree_initially:!1,optimize_render:!0,prevent_default_scroll:!1,show_errors:!0}),gantt.keys={edit_save:13,edit_cancel:27},gantt._init_template=function(t,e,n){var a=this._reg_templates||{}; +n=n||t,this.config[t]&&a[n]!=this.config[t]&&(e&&this.templates[n]||(this.templates[n]=this.date.date_to_str(this.config[t]),a[n]=this.config[t])),this._reg_templates=a},gantt._init_templates=function(){var t=gantt.locale.labels;t.gantt_save_btn=t.icon_save,t.gantt_cancel_btn=t.icon_cancel,t.gantt_delete_btn=t.icon_delete;var e=this.date.date_to_str,n=this.config;gantt._init_template("date_scale",!0),gantt._init_template("date_grid",!0,"grid_date_format"),gantt._init_template("task_date",!0),gantt.mixin(this.templates,{ +xml_date:this.date.str_to_date(n.xml_date,n.server_utc),xml_format:e(n.xml_date,n.server_utc),api_date:this.date.str_to_date(n.api_date),progress_text:function(t,e,n){return""},grid_header_class:function(t,e){return""},task_text:function(t,e,n){return n.text},task_class:function(t,e,n){return""},grid_row_class:function(t,e,n){return""},task_row_class:function(t,e,n){return""},task_cell_class:function(t,e){return""},scale_cell_class:function(t){return""},scale_row_class:function(t){return""},grid_indent:function(t){ +return"
"},grid_folder:function(t){return"
"},grid_file:function(t){return"
"},grid_open:function(t){return"
"},grid_blank:function(t){return"
"},date_grid:function(t,e){return e&&gantt.isUnscheduledTask(e)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(e):gantt.templates.grid_date_format(t); +},task_time:function(t,e,n){return gantt.isUnscheduledTask(n)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(n):gantt.templates.task_date(t)+" - "+gantt.templates.task_date(e)},task_unscheduled_time:function(t){return""},time_picker:e(n.time_picker),link_class:function(t){return""},link_description:function(t){var e=gantt.getTask(t.source),n=gantt.getTask(t.target);return""+e.text+""+n.text+""},drag_link:function(t,e,n,a){t=gantt.getTask(t);var i=gantt.locale.labels,s=""+t.text+" "+(e?i.link_start:i.link_end)+"
"; +return n&&(n=gantt.getTask(n),s+=" "+n.text+" "+(a?i.link_start:i.link_end)+"
"),s},drag_link_class:function(t,e,n,a){var i="";if(t&&n){var s=gantt.isLinkAllowed(t,n,e,a);i=" "+(s?"gantt_link_allow":"gantt_link_deny")}return"gantt_link_tooltip"+i}}),this.callEvent("onTemplatesReady",[])}}(),window.jQuery&&!function(t){var e=[];t.fn.dhx_gantt=function(n){if(n=n||{},"string"!=typeof n){var a=[];return this.each(function(){if(this&&this.getAttribute&&!this.getAttribute("dhxgantt")){for(var t in n)"data"!=t&&(gantt.config[t]=n[t]); +gantt.init(this),n.data&&gantt.parse(n.data),a.push(gantt)}}),1===a.length?a[0]:a}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.dhx_gantt")}}(jQuery),gantt.locale={date:{month_full:["January","February","March","April","May","June","July","August","September","October","November","December"],month_short:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],day_full:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],day_short:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"] +},labels:{new_task:"New task",icon_save:"Save",icon_cancel:"Cancel",icon_details:"Details",icon_edit:"Edit",icon_delete:"Delete",confirm_closing:"",confirm_deleting:"Task will be deleted permanently, are you sure?",section_description:"Description",section_time:"Time period",section_type:"Type",column_text:"Task name",column_start_date:"Start time",column_duration:"Duration",column_add:"",link:"Link",confirm_link_deleting:"will be deleted",link_start:" (start)",link_end:" (end)",type_task:"Task", +type_project:"Project",type_milestone:"Milestone",minutes:"Minutes",hours:"Hours",days:"Days",weeks:"Week",months:"Months",years:"Years"}},gantt.skins.skyblue={config:{grid_width:350,row_height:27,scale_height:27,link_line_width:1,link_arrow_size:8,lightbox_additional_height:75},_second_column_width:95,_third_column_width:80},gantt.skins.meadow={config:{grid_width:350,row_height:27,scale_height:30,link_line_width:2,link_arrow_size:6,lightbox_additional_height:72},_second_column_width:95,_third_column_width:80 +},gantt.skins.terrace={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:2,link_arrow_size:6,lightbox_additional_height:75},_second_column_width:90,_third_column_width:70},gantt.skins.broadway={config:{grid_width:360,row_height:35,scale_height:35,link_line_width:1,link_arrow_size:7,lightbox_additional_height:86},_second_column_width:90,_third_column_width:80,_lightbox_template:"
 
", +_config_buttons_left:{},_config_buttons_right:{gantt_delete_btn:"icon_delete",gantt_save_btn:"icon_save"}},gantt.config.touch_drag=500,gantt.config.touch=!0,gantt.config.touch_feedback=!0,gantt._touch_feedback=function(){gantt.config.touch_feedback&&navigator.vibrate&&navigator.vibrate(1)},gantt._init_touch_events=function(){"force"!=this.config.touch&&(this.config.touch=this.config.touch&&(-1!=navigator.userAgent.indexOf("Mobile")||-1!=navigator.userAgent.indexOf("iPad")||-1!=navigator.userAgent.indexOf("Android")||-1!=navigator.userAgent.indexOf("Touch"))), +this.config.touch&&(window.navigator.msPointerEnabled?this._touch_events(["MSPointerMove","MSPointerDown","MSPointerUp"],function(t){return t.pointerType==t.MSPOINTER_TYPE_MOUSE?null:t},function(t){return!t||t.pointerType==t.MSPOINTER_TYPE_MOUSE}):this._touch_events(["touchmove","touchstart","touchend"],function(t){return t.touches&&t.touches.length>1?null:t.touches[0]?{target:t.target,pageX:t.touches[0].pageX,pageY:t.touches[0].pageY,clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}:t},function(){ +return!1}))},gantt._touch_events=function(t,e,n){function a(t){return t&&t.preventDefault&&t.preventDefault(),(t||event).cancelBubble=!0,!1}function i(t){var e=gantt._task_area_pulls,n=gantt.getTask(t);if(n&&gantt.isTaskVisible(t))for(var a in e)if(n=e[a][t],n&&n.getAttribute("task_id")&&n.getAttribute("task_id")==t){var i=n.cloneNode(!0);return g=n,e[a][t]=i,n.style.display="none",i.className+=" gantt_drag_move ",n.parentNode.appendChild(i),i}}var s,r=0,o=!1,_=!1,d=null,l=null,g=null;this._gantt_touch_event_ready||(this._gantt_touch_event_ready=1, +gantt.event(gantt.$container,t[0],function(t){if(!n(t)&&o){l&&clearTimeout(l);var i=e(t);if(gantt._tasks_dnd.drag.id||gantt._tasks_dnd.drag.start_drag)return gantt._tasks_dnd.on_mouse_move(i),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1;if(i&&d){var g=d.pageX-i.pageX,h=d.pageY-i.pageY;if(!_&&(Math.abs(g)>5||Math.abs(h)>5)&&(gantt._touch_scroll_active=_=!0,r=0,s=gantt.getScrollState()),_){gantt.scrollTo(s.x+g,s.y+h);var c=gantt.getScrollState();if(s.x!=c.x&&h>2*g||s.y!=c.y&&g>2*h)return a(t); +}}return a(t)}})),gantt.event(this.$container,"contextmenu",function(t){return o?a(t):void 0}),gantt.event(this.$container,t[1],function(t){if(!n(t)){if(t.touches&&t.touches.length>1)return void(o=!1);if(o=!0,d=e(t),d&&r){var s=new Date;500>s-r?(gantt._on_dblclick(d),a(t)):r=s}else r=new Date;l=setTimeout(function(){var t=gantt.locate(d);!t||gantt._locate_css(d,"gantt_link_control")||gantt._locate_css(d,"gantt_grid_data")||(gantt._tasks_dnd.on_mouse_down(d),gantt._tasks_dnd.drag&&gantt._tasks_dnd.drag.start_drag&&(i(t), +gantt._tasks_dnd._start_dnd(d),gantt._touch_drag=!0,gantt.refreshTask(t),gantt._touch_feedback())),l=null},gantt.config.touch_drag)}}),gantt.event(this.$container,t[2],function(t){if(!n(t)){l&&clearTimeout(l),gantt._touch_drag=!1,o=!1;var a=e(t);gantt._tasks_dnd.on_mouse_up(a),g&&(gantt.refreshTask(gantt.locate(g)),g.parentNode&&(g.parentNode.removeChild(g),gantt._touch_feedback())),gantt._touch_scroll_active=o=_=!1,g=null}})},function(){function t(t,e){var n=gantt.env.isIE?"":"%c",a=[n,'"',t,'"',n," has been deprecated in dhtmlxGantt v4.0 and will stop working in v5.0. Use ",n,'"',e,'"',n," instead. \nSee more details at http://docs.dhtmlx.com/gantt/migrating.html "].join(""),i=window.console.warn||window.console.log,s=[a]; +gantt.env.isIE||(s=s.concat(["font-weight:bold","font-weight:normal","font-weight:bold","font-weight:normal"])),i.apply(window.console,s)}function e(e){return function(){return t("dhtmlx."+e,"gantt."+e),gantt[e].apply(gantt,arguments)}}window.dhtmlx||(window.dhtmlx={});for(var n=["message","alert","confirm","modalbox","uid","copy","mixin","defined","bind","assert"],a=0;a"+tasks.join("")+""+links.join("")+""; + return ""+tasks.join("")+""+links.join("")+""; } }; @@ -4797,7 +4797,7 @@ gantt._get_duration_unit = function(){ }; gantt._get_safe_type = function(type){ - return "task"; + return gantt._get_type_name(type); }; gantt._get_type_name = function(type_value){ for(var i in this.config.types){ @@ -6735,30 +6735,30 @@ gantt._extend_to_optional = function(lightbox_block){ gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration); gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time); /** - * @desc: constructor, data processor object + * @desc: constructor, data processor object * @param: serverProcessorURL - url used for update * @type: public */ gantt.dataProcessor = function(serverProcessorURL){ this.serverProcessor = serverProcessorURL; this.action_param="!nativeeditor_status"; - + this.object = null; this.updatedRows = []; //ids of updated rows - + this.autoUpdate = true; this.updateMode = "cell"; - this._tMode="GET"; + this._tMode="GET"; this._headers = null; this._payload = null; this.post_delim = "_"; - + this._waitMode=0; this._in_progress={};//? this._invalid={}; this.mandatoryFields=[]; this.messages=[]; - + this.styles={ updated:"font-weight:bold;", inserted:"font-weight:bold;", @@ -6768,7 +6768,7 @@ gantt.dataProcessor = function(serverProcessorURL){ error:"color:red;", clear:"font-weight:normal;text-decoration:none;" }; - + this.enableUTFencoding(true); gantt._eventable(this); @@ -6801,7 +6801,7 @@ gantt.dataProcessor.prototype={ * @desc: allows to set escaping mode * @param: true - utf based escaping, simple - use current page encoding * @type: public - */ + */ enableUTFencoding:function(mode){ this._utf=!!mode; }, @@ -6862,7 +6862,7 @@ gantt.dataProcessor.prototype={ setUpdated:function(rowId,state,mode){ if (this._silent_mode) return; var ind=this.findRow(rowId); - + mode=mode||"updated"; var existing = this.obj.getUserData(rowId,this.action_param); if (existing && mode == "updated") mode=existing; @@ -6870,7 +6870,7 @@ gantt.dataProcessor.prototype={ this.set_invalid(rowId,false); //clear previous error flag this.updatedRows[ind]=rowId; this.obj.setUserData(rowId,this.action_param,mode); - if (this._in_progress[rowId]) + if (this._in_progress[rowId]) this._in_progress[rowId]="wait"; } else{ if (!this.is_invalid(rowId)){ @@ -6882,12 +6882,12 @@ gantt.dataProcessor.prototype={ //clear changed flag if (!state) this._clearUpdateFlag(rowId); - + this.markRow(rowId,state,mode); if (state && this.autoUpdate) this.sendData(rowId); }, _clearUpdateFlag:function(id){}, - markRow:function(id,state,mode){ + markRow:function(id,state,mode){ var str=""; var invalid=this.is_invalid(id); if (invalid){ @@ -6897,7 +6897,7 @@ gantt.dataProcessor.prototype={ if (this.callEvent("onRowMark",[id,state,mode,invalid])){ //default logic str=this.styles[state?mode:"clear"]+str; - + this.obj[this._methods[0]](id,str); if (invalid && invalid.details){ @@ -6914,7 +6914,7 @@ gantt.dataProcessor.prototype={ is_invalid:function(id){ return this._invalid[id]; }, - set_invalid:function(id,mode,details){ + set_invalid:function(id,mode,details){ if (details) mode={value:mode, details:details, toString:function(){ return this.value.toString(); }}; this._invalid[id]=mode; }, @@ -6923,7 +6923,7 @@ gantt.dataProcessor.prototype={ * @param: rowId - id of row to set update-status for * @type: public */ - checkBeforeUpdate:function(rowId){ + checkBeforeUpdate:function(rowId){ return true; }, /** @@ -6934,17 +6934,17 @@ gantt.dataProcessor.prototype={ sendData:function(rowId){ if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; if (this.obj.editStop) this.obj.editStop(); - - + + if(typeof rowId == "undefined" || this._tSend) return this.sendAllData(); if (this._in_progress[rowId]) return false; - + this.messages=[]; if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError",[rowId,this.messages])) return false; this._beforeSendData(this._getRowData(rowId),rowId); }, _beforeSendData:function(data,rowId){ - if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; + if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; this._sendData(data,rowId); }, serialize:function(data, id){ @@ -6979,8 +6979,8 @@ gantt.dataProcessor.prototype={ }, _sendData:function(a1,rowId){ if (!a1) return; //nothing to send - if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; - + if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; + if (rowId) this._in_progress[rowId]=(new Date()).valueOf(); @@ -6995,7 +6995,7 @@ gantt.dataProcessor.prototype={ return that.afterUpdate(that,xml,ids); }; - + var a3 = this.serverProcessor+(this._user?(gantt._urlSeparator(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):""); if (this._tMode=="GET") @@ -7036,14 +7036,14 @@ gantt.dataProcessor.prototype={ this._waitMode++; }, sendAllData:function(){ - if (!this.updatedRows.length) return; + if (!this.updatedRows.length) return; this.messages=[]; var valid=true; for (var i=0; i 0) t.timers[text.id]=window.setTimeout(function(){ t.hide(text.id); @@ -8490,7 +8490,7 @@ gantt._urlSeparator = function(str){ var box = document.createElement("DIV"); box.className = " gantt_modal_box dhtmlx_modal_box gantt-"+config.type + " dhtmlx-"+config.type; box.setAttribute("dhxbox", 1); - + var inner = ''; if (config.width) @@ -8513,7 +8513,7 @@ gantt._urlSeparator = function(str){ if (config.content){ var node = config.content; - if (typeof node == "string") + if (typeof node == "string") node = document.getElementById(node); if (node.style.display == 'none') node.style.display = ""; @@ -8538,7 +8538,7 @@ gantt._urlSeparator = function(str){ } function _createBox(config, ok, cancel){ var box = config.tagName ? config : _boxStructure(config, ok, cancel); - + if (!config.hidden) modality(true); document.body.appendChild(box); @@ -8645,7 +8645,7 @@ gantt._urlSeparator = function(str){ obj = null; },2000); obj.className+=" hidden"; - + if(t.timers[id]) window.clearTimeout(t.timers[id]); delete t.pull[id]; @@ -8770,7 +8770,7 @@ gantt.date={ case "%m": return "\"+gantt.date.to_fixed((date.getMonth()+1))+\""; case "%j": return "\"+date.getDate()+\""; case "%n": return "\"+(date.getMonth()+1)+\""; - case "%y": return "\"+gantt.date.to_fixed(date.getFullYear()%100)+\""; + case "%y": return "\"+gantt.date.to_fixed(date.getFullYear()%100)+\""; case "%Y": return "\"+date.getFullYear()+\""; case "%D": return "\"+gantt.locale.date.day_short[date.getDay()]+\""; case "%l": return "\"+gantt.locale.date.day_full[date.getDay()]+\""; @@ -8806,7 +8806,7 @@ gantt.date={ break; case "%g": case "%G": - case "%h": + case "%h": case "%H": splt+="set[3]=temp["+i+"]||0;"; break; @@ -8815,9 +8815,9 @@ gantt.date={ break; case "%Y": splt+="set[0]=temp["+i+"]||0;"; break; - case "%a": + case "%a": case "%A": splt+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);"; - break; + break; case "%s": splt+="set[5]=temp["+i+"]||0;"; break; case "%M": splt+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;"; @@ -9048,7 +9048,7 @@ gantt.mixin(gantt.config, // grid width can be increased after the column has been resized keep_grid_width:false, - + // grid width can be adjusted grid_resize:false, @@ -9224,7 +9224,7 @@ if (window.jQuery){ } }); - + if (views.length === 1) return views[0]; return views; } @@ -9318,7 +9318,7 @@ gantt.skins.terrace = { lightbox_additional_height:75 }, _second_column_width:90, - _third_column_width:70 + _third_column_width:70 }; gantt.skins.broadway = { config:{ @@ -9380,7 +9380,7 @@ gantt._init_touch_events = function(){ clientX:ev.touches[0].clientX, clientY:ev.touches[0].clientY }; - else + else return ev; }, function(){ return false; }); } @@ -9409,7 +9409,7 @@ gantt._touch_events = function(names, accessor, ignore){ //ignore common and scrolling moves if (!action_mode) return; - + if (long_tap_timer) clearTimeout(long_tap_timer); var source = accessor(e); @@ -9474,7 +9474,7 @@ gantt._touch_events = function(names, accessor, ignore){ } else { dblclicktime = new Date(); } - + //long tap long_tap_timer = setTimeout(function(){ var taskId = gantt.locate(action_start); @@ -9492,11 +9492,11 @@ gantt._touch_events = function(names, accessor, ignore){ } } - + long_tap_timer = null; }, gantt.config.touch_drag); }); - + //touch end gantt.event(this.$container, names[2], function(e){ if (ignore(e)) return; @@ -9505,7 +9505,7 @@ gantt._touch_events = function(names, accessor, ignore){ action_mode = false; var source = accessor(e); gantt._tasks_dnd.on_mouse_up(source); - + if(current_target) { gantt.refreshTask(gantt.locate(current_target)); if(current_target.parentNode){ @@ -9513,7 +9513,7 @@ gantt._touch_events = function(names, accessor, ignore){ gantt._touch_feedback(); } } - + gantt._touch_scroll_active = action_mode = scroll_mode = false; current_target = null; }); @@ -9526,7 +9526,7 @@ gantt._touch_events = function(names, accessor, ignore){ (e||event).cancelBubble = true; return false; } - + function cloneTaskRendered(taskId) { var renders = gantt._task_area_pulls; var task = gantt.getTask(taskId); diff --git a/js/et2_widget_gantt.js b/js/et2_widget_gantt.js index 9fcebcc9..8f79b74f 100644 --- a/js/et2_widget_gantt.js +++ b/js/et2_widget_gantt.js @@ -849,7 +849,7 @@ var et2_gantt = (function(){ "use strict"; return et2_inputWidget.extend([et2_IR var value = gantt_widget.getInstanceManager().getValues(gantt_widget.getInstanceManager().widgetContainer); var request = gantt_widget.egw().json(gantt_widget.options.ajax_update, - [link,value], function(new_id) { + [link,'link',value], function(new_id) { if(new_id) { link.id = new_id; @@ -1168,7 +1168,7 @@ var et2_gantt = (function(){ "use strict"; return et2_inputWidget.extend([et2_IR * * Since the gantt chart tends to be large and browsers cannot handle printing * pages wider than a piece of paper, we rotate the gantt to fit. - * + * */ beforePrint: function beforePrint() { // Add the class, if needed @@ -1203,7 +1203,7 @@ var et2_gantt = (function(){ "use strict"; return et2_inputWidget.extend([et2_IR // Make gantt chart "full size" this.gantt_node.width(max_width) .height(max_height); - + this.gantt.render(); this.gantt_node.css({ diff --git a/lang/egw_de.lang b/lang/egw_de.lang index 4e9db65a..042822c5 100644 --- a/lang/egw_de.lang +++ b/lang/egw_de.lang @@ -205,12 +205,16 @@ general pricelist projectmanager de Allgemeine Preisliste general settings projectmanager de Allgemeine Einstellungen: global categories projectmanager de Globale Kategorien h projectmanager de h +has been moved to settings to allow eg. group-specific ids projectmanager de Wurde zu Einstellungen verschoben um z.b. gruppen-spezifische Nummern zu ermöglichen. health projectmanager de Gesundheit hours projectmanager de Stunden hours per workday projectmanager de Stunden pro Arbeitstag how long do you work on the given day. projectmanager de Wie lange arbeiten Sie an dem angegebenen Tag +how should ids for new projects be generated? projectmanager de Wie sollen Projektnummern für neue Projekte generiert werden? +how should ids for new subprojects be generated? projectmanager de Wie sollen Nummern für neue Unterprojekte generiert werden? how should the project selection in the menu be displayed: a tree gives a better overview, a selectbox might perform better. projectmanager de Wie soll die Projektauswahl im Menü angezeigt werden: Ein Baum gibt einen besseren Überblick, eine Auswahlbox kann schneller sein. html link to the current record projectmanager de HTML-Link zum aktuellen Eintrag +id generation projectmanager de Generierung Projektnummern if checked the datasources of the elements (eg. infolog entries) are deleted too. projectmanager de Wenn angekreuzt werden die Datenquellen der Element (z.B. InfoLog Einträge) mit gelöscht if checked the datasources of the elements (eg. infolog entries) will change their status too. projectmanager de Wenn angekreuzt werden der Status der Datenquellen der Element (z.B. InfoLog Einträge) mit geändert if you see entities (eg. {) in the ganttchart, switch this off. projectmanager de Wenn Sie im Gantt-Diagramm statt Umlauten komische Zeichen sehen, schalten Sie das ab diff --git a/lang/egw_en.lang b/lang/egw_en.lang index 99d92af5..3998d7e9 100644 --- a/lang/egw_en.lang +++ b/lang/egw_en.lang @@ -205,12 +205,16 @@ general pricelist projectmanager en General price list general settings projectmanager en General settings global categories projectmanager en Global categories h projectmanager en h +has been moved to settings to allow eg. group-specific ids projectmanager en Has been moved to settings to allow eg. group-specific IDs health projectmanager en Health hours projectmanager en Hours hours per workday projectmanager en Hours per work day how long do you work on the given day. projectmanager en How long do you work on the given day +how should ids for new projects be generated? projectmanager en How should IDs for new projects be generated? +how should ids for new subprojects be generated? projectmanager en How should IDs for new subprojects be generated? how should the project selection in the menu be displayed: a tree gives a better overview, a selectbox might perform better. projectmanager en How should the project selection in the menu be displayed: A tree gives a better overview, a select box might perform better. html link to the current record projectmanager en HTML link to the current record +id generation projectmanager en ID generation if checked the datasources of the elements (eg. infolog entries) are deleted too. projectmanager en If checked the data sources of the elements, e.g. InfoLog entries, are deleted too. if checked the datasources of the elements (eg. infolog entries) will change their status too. projectmanager en If checked the data sources of the elements, e.g. InfoLog entries, will change their status too. if you see entities (eg. {) in the ganttchart, switch this off. projectmanager en If you see entities (eg. {) in the Gantt chart, switch this off. @@ -446,6 +450,7 @@ view this project projectmanager en View this project view this project-element projectmanager en View this project element working duration on %1 projectmanager en Working duration on %1 you can leave the date of the first price empty projectmanager en You can leave the date of the first price empty +you can use %ymd to insert the date of creation. it uses the same syntax like the php funktion date(). other placeholders are %px to insert the parents id (only at the subprojects generation) or %ix to insert an index. indices will be increased automatically to avoid duplicated ids. every generation format should contain exactly one index! (exept you are sure that the date will identify the project). you can also use e.g. %04ix. this index will be filled with '0' to 4 digits (e.g. 0001). if you leave out the filling character (e.g. %5ix), the index will be filled with '0'. projectmanager en You can use %Ymd to insert the date of creation. It uses the same syntax like the PHP funktion date(). Other placeholders are %px to insert the parents ID (only at the subprojects generation) or %ix to insert an index. Indices will be increased automatically to avoid duplicated IDs. Every generation format should contain exactly one index! (Exept you are sure that the date will identify the project). You can also use e.g. %04ix. This index will be filled with '0' to 4 digits (e.g. 0001). If you leave out the filling character (e.g. %5ix), the index will be filled with '0'. you dont have jpgraph version %1 or higher installed! it is needed from projectmanager for ganttcharts. projectmanager en You don't have JPGraph version %1 or higher installed! It is needed from Project Manager for Gantt charts. you need to select a project first projectmanager en You need to select a project first your database is not up to date (%1 vs. %2), please run %3setup%4 to update your database. projectmanager en Your database is NOT up to date (%1 vs. %2), please run %3setup%4 to update your database. diff --git a/lang/egw_es-es.lang b/lang/egw_es-es.lang index 03efc14e..0cb53fac 100644 --- a/lang/egw_es-es.lang +++ b/lang/egw_es-es.lang @@ -28,8 +28,10 @@ add price projectmanager es-es Añadir precio add project projectmanager es-es Añadir proyecto add project-elements projectmanager es-es Añadir elementos de proyecto add this role projectmanager es-es Añadir este rol +add timesheet projectmanager es-es Añadir hoja de tiempos addressbook elements of a project can be used to define individual serial letter recipients. available fields are projectmanager es-es Los elementos de la libreta de direcciones de un proyecto pueden usarse para definir destinatarios individuales de las cartas. Los campos disponibles son addressbook fields projectmanager es-es Campos de la libreta de direcciones +all projects projectmanager es-es Todos los proyectos all roles projectmanager es-es Todos los roles all_roles projectmanager es-es Todos los roles allow users to change their working times projectmanager es-es Permitir a los usuarios cambiar sus horas de trabajo @@ -115,6 +117,7 @@ element details projectmanager es-es Detalles del elemento element id projectmanager es-es ID del elemento element list projectmanager es-es Lista de elementos element modifier projectmanager es-es Modificador del elemento +element role projectmanager es-es Rol del elemento element role deleted projectmanager es-es Se ha borrado el rol del elemento. element role saved projectmanager es-es Se ha guardado el rol del elemento. element role title projectmanager es-es Título del rol del elemento @@ -132,7 +135,6 @@ elements which have to be finished before this can start projectmanager es-es El empty projectmanager es-es Vacío empty for all projectmanager es-es vacío para todo encode non-ascii projectmanager es-es No codificar en ascii -end before projectmanager es-es Finalizar antes enddate projectmanager es-es Fecha de finalización error: deleting element role !!! projectmanager es-es ¡Error al borrar el rol del elemento! error: deleting price !!! projectmanager es-es ¡¡Error al borrar el precio!! @@ -292,6 +294,7 @@ project-element projectmanager es-es Elemento del proyecto project-element deleted projectmanager es-es Se ha borrado el elmento del proyecto project-element saved projectmanager es-es Se ha guardado el elemento del proyecto project-elements projectmanager es-es Elementos del proyecto +projectelement projectmanager es-es Elemento del proyecto projectid projectmanager es-es ID del proyecto projectlist projectmanager es-es Lista de proyectos projectmanager common es-es Administrador de proyectos @@ -317,6 +320,7 @@ role projectmanager es-es Rol role deleted projectmanager es-es Se ha borrado el rol role saved projectmanager es-es Se ha guardado el rol roles projectmanager es-es Roles +same day projectmanager es-es mismo día save the changes made projectmanager es-es Guardar los cambios hechos save this project element projectmanager es-es Guardar este elemento del proyecto select a project projectmanager es-es Seleccionar un proyecto @@ -343,13 +347,14 @@ show planned times instead of the real times projectmanager es-es Mostrar tiempo show status icons of the datasources projectmanager es-es Mostrar iconos de estado de las fuentes de datos show the project selection as projectmanager es-es Mostrar la selección del proyecto como site configuration saved projectmanager es-es Se ha guardado la configuración del sitio -start after projectmanager es-es Comenzar después de start date, end date projectmanager es-es Fecha de inicio, fecha de fin start working on %1 projectmanager es-es Comenzar a trabajar en %1 start, end, category, ... projectmanager es-es Inicio, fin, categoría... start- & enddate projectmanager es-es Fecha de inicio y fin startdate projectmanager es-es Fecha de inicio startrecord projectmanager es-es Registro de inicio +starts after projectmanager es-es Inicia después +starts before projectmanager es-es Inicia antes status filter projectmanager es-es Filtro de estados status set projectmanager es-es Se ha establecido el estado style used for everything but elements. some fonts have only normal style. projectmanager es-es Estilo utilizado para todo excepto los elementos. Algunos tipos de letra sólo tienen estilo normal. diff --git a/lang/egw_fr.lang b/lang/egw_fr.lang index cca2b48a..de259269 100644 --- a/lang/egw_fr.lang +++ b/lang/egw_fr.lang @@ -1,3 +1,4 @@ +%1 days in advance projectmanager fr %1 jour(s) en avance %1 element(s) updated projectmanager fr %1 élément(s) mis à jour %1 new project-elements imported projectmanager fr %1 nouveaux éléments de projet importés %1 project(s) %2 projectmanager fr %1 projet(s) %2 @@ -7,13 +8,19 @@ %1 records imported projectmanager fr %1 enregistrements importés %1 records read (not yet imported, you may go %2back%3 and uncheck test import) projectmanager fr %1 enregistrements lus (non encore importé, vous devriez retourner en arrière %2back%3 et décocher le test de límportation) %1 times permission denied, %2 projects deleted projectmanager fr %1 fois accès refusé, %2 projets supprimés -- planned projectmanager fr - prévue +%1 you are responsible for is due at %2 projectmanager fr %1 pour lequel vous êtes responsable est à échéance %2 +%1 you are responsible for is starting at %2 projectmanager fr %1 pour lequel vous êtes responsable débute à %2 +(project id) project title - template name projectmanager fr (ID projet) titre du projet - nom du modèle +- planned projectmanager fr - prévu +- re-planned projectmanager fr - replanifié 0ngoing (0 < % < 100) projectmanager fr En cours (0 < % < 100) a describtive title for the project, must not be empty projectmanager fr Un titre descriptif pour le projet (ne doit pas être vide) +access projectmanager fr Accès accounting projectmanager fr Comptabilité accounting options projectmanager fr Options de comptabilité accounting type projectmanager fr Type de comptabilité actions projectmanager fr Actions +active projectmanager fr Active activity projectmanager fr Activité add a new milestone projectmanager fr Ajouter une nouvelle étape add a new project projectmanager fr Ajouter un nouveau projet @@ -26,8 +33,13 @@ add price projectmanager fr Ajouter un prix add project projectmanager fr Ajouter un projet add project-elements projectmanager fr Ajouter des éléments de projet add this role projectmanager fr Ajouter ce rôle +add timesheet projectmanager fr Ajouter une feuille de temps +add timesheet only projectmanager fr Ajouter une feuille de temps seulement addressbook elements of a project can be used to define individual serial letter recipients. available fields are projectmanager fr Les éléments de carnet d'adresses d'un projet peuvent être utilisés pour définir des destinataires de publipostage. Les champs disponibles sont addressbook fields projectmanager fr Champs du carnet d'adresses +admin projectmanager fr Admin +all projectmanager fr Tout +all projects projectmanager fr Tous les projets all roles projectmanager fr Tous les rôles all_roles projectmanager fr Tous les rôles allow users to change their working times projectmanager fr Autoriser les utilisateurs à changer leurs horaires de travail @@ -35,6 +47,7 @@ allowed accounting types projectmanager fr Types de comptabilité autorisés allowed units projectmanager fr Unités autorisées anonymous public projectmanager fr Anonyme app. projectmanager fr App. +application projectmanager fr Demande apply the changes projectmanager fr Appliquer les modifications archive projectmanager fr Archive assistant projectmanager fr Assistant @@ -49,9 +62,12 @@ budget (no pricelist) projectmanager fr Budget (sans liste de prix) budget and pricelist projectmanager fr Budget et liste de prix by projectmanager fr par calculate budget by quantity (eg. time) and price projectmanager fr Calculer le budget par quantité (p.ex. temps) et prix +cancel projectmanager fr Annuler +category projectmanager fr Catégorie category in %1 project-element(s) updated. projectmanager fr Catégorie mise à jour dans %1 élément(s) category set projectmanager fr Catégorie définie change category projectmanager fr Changer la catégorie +change the following details of %s projectmanager fr Changer les détails suivants de %s charset of file projectmanager fr Jeu de caractères du fichier charset of the above selected font projectmanager fr Jeu de caractères de la police sélectionnée ci-dessus check all projectmanager fr Tout cocher @@ -61,7 +77,7 @@ constraints projectmanager fr Contraintes contact fields for serial letters projectmanager fr Champs du contacts puor le publipostage conversation between days and hours, default 8 projectmanager fr conversion entre jours et heures, par défaut 8 coordinator projectmanager fr Coordinateur -cost per time projectmanager fr Coût Temporel +cost per time projectmanager fr Coût au temps create a new empty project or use a template projectmanager fr Créer un projet vide ou utiliser un modèle create new links projectmanager fr Créer de nouveaux liens created projectmanager fr créé @@ -77,10 +93,14 @@ customer title projectmanager fr Titre client data exchange settings projectmanager fr Paramètres d'échange de données datasource projectmanager fr Source de données datasources too projectmanager fr Les sources de données aussi +date projectmanager fr Date dates projectmanager fr Dates -days projectmanager fr jours +days projectmanager fr Jours +default action on double-click projectmanager fr Action par défaut au double clic default all and a selectbox to choose projectmanager fr par défaut tous et une boîte de sélection pour choisir +delete projectmanager fr Supprimer delete all checked projects projectmanager fr Supprimer tous les projets sélectionnés +delete this element role projectmanager fr Supprimer cet élément de rôle delete this milestone projectmanager fr Supprimer cette étape delete this price projectmanager fr Supprimer ce prix delete this project projectmanager fr Supprimer ce projet @@ -88,18 +108,24 @@ delete this project-element, does not remove the linked entry projectmanager fr delete this role projectmanager fr Supprimer ce rôle deleted projectmanager fr supprimé depth of display projectmanager fr Profondeur d'affichage +description projectmanager fr Description +details projectmanager fr Détails details of cumulated projectmanager fr Détail cumul details of subelements projectmanager fr Détails des sous-éléments +direct update from gantt chart requires stylite egroupware enterprise line (epl). projectmanager fr La mise à jour directe depuis le Gantt nécessite la version EPL. directory with documents to insert project data projectmanager fr Répertoire avec les documents pour l'insertion de données do not use that entry as project-element projectmanager fr Ne pas utiliser cette entrée comme élément de projet document '%1' does not exist or is not readable for you! projectmanager fr Le document '%1' n'existe pas ou n'est pas lisible avec votre profil ! done (100%) projectmanager fr Fait (100%) +due %1 projectmanager fr Echéance %1 edit access, incl. editing budget and elements projectmanager fr Accès en édition (comprenant l'édition du budget et des éléments) edit budget projectmanager fr Modifier le budget +edit element roles projectmanager fr Modifier les rôles sur les éléments edit milestone projectmanager fr Modifier l'étape edit price projectmanager fr Modifier le prix edit project projectmanager fr Modifier le projet edit project-elements projectmanager fr Modifier les éléments de projet +edit this element role projectmanager fr Modifier ce rôle sur élément edit this milestone projectmanager fr Modifier cette étape edit this price projectmanager fr Modifier ce prix edit this project projectmanager fr Modifier ce projet @@ -110,6 +136,7 @@ element details projectmanager fr Détails de l'élément element id projectmanager fr ID de l'élément element list projectmanager fr Liste d'éléments element modifier projectmanager fr Modifié par +element role projectmanager fr Rôle sur l'élément element role deleted projectmanager fr Rôle supprimé. element role saved projectmanager fr Rôle sauvegardé. element role title projectmanager fr Titre du rôle @@ -125,18 +152,22 @@ elements which have to be finished before this can start projectmanager fr Elém empty projectmanager fr Vide empty for all projectmanager fr vide pour tous encode non-ascii projectmanager fr Encodage non-ascii -end before projectmanager fr Fin avant +end date projectmanager fr Date de fin enddate projectmanager fr Date de fin -error: deleting price !!! projectmanager fr Erreur: suppression du prix !!! -error: deleting project !!! projectmanager fr Erreur: suppression du projet !!! -error: deleting project-element !!! projectmanager fr Erreur: suppression de l'élément de projet !!! -error: deleting role !!! projectmanager fr Erreur: suppression du rôle !!! +ends after projectmanager fr Fin après +ends before projectmanager fr Fin avant +error: deleting element role !!! projectmanager fr Erreur à la suppression du rôle sur l'élément ! +error: deleting price !!! projectmanager fr Erreur à la suppression du prix ! +error: deleting project !!! projectmanager fr Erreur à la suppression du projet ! +error: deleting project-element !!! projectmanager fr Erreur à la suppression de l'élément de projet ! +error: deleting role !!! projectmanager fr Erreur à la suppression du rôle ! error: project-id already exist, choose an other one or have one generated by leaving it emtpy !!! projectmanager fr Erreur : cet ID de projet existe déjà, choisissez-en un autre ou laissez le champ vide pour que l'application génère l'ID !!! -error: saving milestone projectmanager fr Erreur: enregistrement de l'étape !!! -error: saving role !!! projectmanager fr Erreur: enregistrement du rôle !!! -error: saving the price (%1) !!! projectmanager fr Erreur: enregistrement du rôle !!! -error: saving the project (%1) !!! projectmanager fr Erreur: enregistrement du projet (%1) !!! -error: saving the project-element (%1) !!! projectmanager fr Erreur: enregistrement de l'élément de projet (%1) !!! +error: saving element role !!! projectmanager fr Erreur à l'enregistrement de l'élément du rôle ! +error: saving milestone projectmanager fr Erreur à l'enregistrement de l'étape ! +error: saving role !!! projectmanager fr Erreur à l'enregistrement du rôle ! +error: saving the price (%1) !!! projectmanager fr Erreur à l'enregistrement du prix (%1) ! +error: saving the project (%1) !!! projectmanager fr Erreur à l'enregistrement du projet (%1) ! +error: saving the project-element (%1) !!! projectmanager fr Erreur à l'enregistrement de l'élément de projet (%1) ! everything recursive projectmanager fr Tout récursif example: projectmanager fr Exemple : examples: projectmanager fr Exemples : @@ -144,11 +175,16 @@ existing data will be overwrited if checked projectmanager fr Les données exist existing links projectmanager fr Liens existants exists projectmanager fr Existe exit without saving projectmanager fr Quitter sans enregistrer +exports a list of project elements to a csv file. projectmanager fr Exporter une liste d'éléments de projet vers un fichier CSV. +exports a list of projects to a csv file. projectmanager fr Exporter une liste de projets vers un fichier CSV. +external projectmanager fr Externe favorites projectmanager fr Favoris +fields for element roles: projectmanager fr Champs pour les éléments du rôle : fieldseparator projectmanager fr Séparateur de champs font projectmanager fr Police font charset projectmanager fr Charset de police font style projectmanager fr Style de police +fontfile '%1' not found!!! projectmanager fr Le fichier de font '%1' n'a pu être trouvé ! for serial letter use this tag. put the content, you want to repeat between two tags. projectmanager fr Pour les lettres en série utiliser cette balise. Placer le contenu que vous voulez répéter entre deux balises. free descriptiv text projectmanager fr Descriptif libre from %1 to %2 projectmanager fr de %1 à %2 @@ -159,56 +195,79 @@ general availibility projectmanager fr Disponibilité générale general fields: projectmanager fr Champs généraux : general pricelist projectmanager fr Liste de prix générale general settings projectmanager fr Paramètres généraux +global projectmanager fr Global global categories projectmanager fr Catégorie globale h projectmanager fr h health projectmanager fr Santé hours projectmanager fr heures hours per workday projectmanager fr Heures par jour ouvré how long do you work on the given day. projectmanager fr Combien de temps travaillez-vous ce jour-là. +how should ids for new projects be generated? projectmanager fr Comment générer les IDs des nouveaux projets ? +how should ids for new subprojects be generated? projectmanager fr Comment générer les IDs des nouveaux sous-projets ? +how should the project selection in the menu be displayed projectmanager fr Comment afficher la sélection des projets dans le menu how should the project selection in the menu be displayed: a tree gives a better overview, a selectbox might perform better. projectmanager fr Comment doit apparaître la sélection du projet dans lemenu: une arborescence donne une meilleure vue d'ensemble, une boîte de sélection peut être plus efficace. html link to the current record projectmanager fr Lien HTML vers l'enregistrement courant +id generation projectmanager fr Génération des ID if you specify an export definition, it will be used when you export projectmanager fr Si vous spécifier un format d'export, il sera utilisé à l'export. ignore that entry projectmanager fr Ignorer cette entrée ignored projectmanager fr Ignoré import projectmanager fr Importation +imports a list of projects from a csv file. does not include project elements. projectmanager fr Importer une liste de projets depuis un fichier CSV. (ne pas comprend pas les éléments de projet) insert projectmanager fr Insérer last modified projectmanager fr Dernière modification last sync date and time projectmanager fr Date et heure de la dernière synchro leave it empty if you dont need a different customer title projectmanager fr laissez vide si vous n'avez pas besoin d'un titre de client différent leave it empty to have one generated projectmanager fr Laissez ce champ vide pour que la valeur soit générée automatiquement leave it empty, if identitcal to the time projectmanager fr Laissez ce champ vide si identique au temps +limit number of characters in ganttchart element title (0 for no limit) projectmanager fr Limiter le nombre de caractères dans les titres d'éléments du Gantt (0 pour aucune limite) linked elements projectmanager fr Eléments liés +linked to %1 projectmanager fr lié à %1 links projectmanager fr Liens links and attached files projectmanager fr Liens et fichiers attachés links to specified application. example: {{links/infolog}} projectmanager fr Liens vers les applications spécifiés. Exemple : {{links/infolog}} list of files linked to the current record projectmanager fr Listes des fichiers liés à l'enregistrement courant +lists all elements assigned to an element role in a table. projectmanager fr Lister tous les éléments assignés à un rôle d'élément dans un tableau. +lists all project elements in a table. projectmanager fr Lister tous les éléments du projet dans une table. mainproject only projectmanager fr Projet principal seulement mainprojects projectmanager fr Projets principaux manage mapping projectmanager fr Gestion des correspondances members projectmanager fr Membres +menu projectmanager fr Menu +milestone projectmanager fr Etape milestone deleted projectmanager fr Etape effacée milestone saved projectmanager fr Etape sauvegardée milestones projectmanager fr Etapes milestones before this element has to be finished projectmanager fr Etapes avant que cet élément ne soit terminé modified projectmanager fr Modifié modified by projectmanager fr Modifié par +modified date and time projectmanager fr Date et heure de modification modifier projectmanager fr Editeur modify status projectmanager fr Modifier le statut +multi assignable projectmanager fr Assignable à plusieurs +multi assignments projectmanager fr Assignements multiples name of current user, all other contact fields are valid too projectmanager fr Nom de l'utilisateur courant, tous les autres champs de contacts sont valides aussi necessary for project-elements doing that not automatic projectmanager fr nécessaire pour les éléments de projet ne le faisant pas automatiquement necessary php extentions %1 not loaded and can't be loaded !!! projectmanager fr Les extensions PHP nécessaires %1 ne sont pas chargées et ne peuvent pas l'être !!! new projectmanager fr Nouveau new project submitted by %1 at %2 projectmanager fr Nouveau projet soumis par %1 à %2 +no projectmanager fr Non no accounting, only status projectmanager fr Pas de comptabilité, statut uniquement no accounting, only times and status projectmanager fr Pas de comptabilité, temps et statut uniquement no details projectmanager fr Pas de détail no read access to the datasource: removing overwritten values will just empty them !!! projectmanager fr Aucun droit en LECTURE à la source des données: enlever les valeurs écrasées va juste les vider !!! +no rights to export more then %1 entries! projectmanager fr Vous n'avez pas le droit d'exporter plus que %1 entrées ! no save necessary projectmanager fr Aucun enregistrement nécessaire nonactive projectmanager fr Inactif +none projectmanager fr aucun not available projectmanager fr Indisponible not started (0%) projectmanager fr Non commencé (0%) not working projectmanager fr ne fonctionne pas +notification settings projectmanager fr Paramètres de notification number of records to read (%1) projectmanager fr Nombre d'enregistrements à lire (%1) +ok projectmanager fr OK +one day after projectmanager fr un jour après +one day in advance projectmanager fr un jour en avance +ongoing (0 < % < 100) projectmanager fr En cours (0 < % < 100) only this project projectmanager fr Seulement ce projet overwrite the datasource projectmanager fr Ecraser la source de données percentage the member is availible for projects projectmanager fr Pourcentage de disponibilité pour les projets @@ -223,88 +282,157 @@ planned quantity projectmanager fr Quantité planifiée planned start projectmanager fr Début planifié planned start date and time projectmanager fr Date et heure de début planifié planned time projectmanager fr Temps prévu +planned time in minutes projectmanager fr Temps prévu en minutes planned times projectmanager fr Temps prévus please download a recent version from %1 and install it in %2. projectmanager fr Téléchargez une version récente sur %1 et installez-la dans %2. +pm_milestone projectmanager fr Etape price projectmanager fr Prix price / unit projectmanager fr Prix / Unité price deleted projectmanager fr Prix supprimé price per unit projectmanager fr Prix par unité price saved projectmanager fr Prix enregistré pricelist projectmanager fr Liste de prix +print projectmanager fr Imprimer +priority projectmanager fr Priorité +private projectmanager fr Privé project common fr Projet +project access (e.g. public) projectmanager fr Accès au projet, par ex. public project availibility projectmanager fr Disponibilité du projet -project deleted projectmanager fr Projet supprimé +project category projectmanager fr Catégorie de projet +project completion (e.g. 100%) projectmanager fr Progression du projet, par ex. 100% +project creator projectmanager fr Créateur du projet +project csv export projectmanager fr Export CSV de projets +project csv import projectmanager fr Import CSV de projets +project deleted projectmanager fr Projet supprimé. +project element csv export projectmanager fr Export CSV des éléments project id projectmanager fr ID de projet +project id - template name projectmanager fr ID de projet - modèle project members and roles projectmanager fr Membres et rôles du projet +project modified by %1 at %2 projectmanager fr Projet modifié par %1 le %2 +project modifier projectmanager fr Modifié par +project number projectmanager fr Numéro de projet project overview projectmanager fr Aperçu du projet +project priority projectmanager fr Priorité du projet project saved projectmanager fr Projet enregistré +project sort order projectmanager fr Ordre de tri des projets project specific title, prices, ... projectmanager fr Titres, prix, etc. spécifiques au projet +project status projectmanager fr Statut du projet +project title projectmanager fr Titre du projet +project title - template name projectmanager fr Titre du projet - nom du modèle +project-element projectmanager fr Elément de projet project-element deleted projectmanager fr Elément de projet supprimé project-element saved projectmanager fr Elément de projet enregistré project-elements projectmanager fr Eléments de projet +projectelement projectmanager fr Elément de projet +projectid projectmanager fr ID Projet projectlist projectmanager fr Liste de projets projectmanager common fr Gestionnaire de projets +projectmanager element fields projectmanager fr Champs d'éléments du gestionnaire de projets +projectmanager element fields: projectmanager fr Champs d'éléments du gestionnaire de projets : +projectmanager fields: projectmanager fr Champs du gestionnaire de projet +projectmanager-fieldname projectmanager fr Nom des champs du gestionnaire de projet projectmember projectmanager fr Membre de projet projects common fr Projets +public projectmanager fr Public quantity projectmanager fr Quantité re-planned projectmanager fr Re-planifié re-planned time projectmanager fr Temps re-planifié read access, incl. budget and adding elements projectmanager fr Accès en lecture, comprenant le budget et l'ajout d'éléments read access, no budget projectmanager fr Accès en lecture, ne comprenant pas le budget real end projectmanager fr Fin réelle +real end date and time projectmanager fr Date et heure de fin réelle real start projectmanager fr Début réel +real start date and time projectmanager fr Date et heure de début réel +receive notifications about due entries (planned dates) projectmanager fr Recevoir les notification sur les éléments dus (dates planifiées) +receive notifications about due entries (real dates) projectmanager fr Recevoir les notification sur les éléments dus (dates réelles) +receive notifications about items assigned to you with these roles projectmanager fr Recevoir les notification sur les éléments vous étant assignés avec ces rôles +receive notifications about own items projectmanager fr Recevoir les notifications sur ses propres éléments +receive notifications about starting entries (planned dates) projectmanager fr Recevoir les notification sur les éléments débutant (dates planifiées) +receive notifications about starting entries (real dates) projectmanager fr Recevoir les notification sur les éléments débutant (dates réelles) +recovered projectmanager fr récupéré remark projectmanager fr Remarque +replanned time in minutes projectmanager fr Temps replanifié en minutes resources projectmanager fr Ressources role projectmanager fr Rôle role deleted projectmanager fr Rôle supprimé role saved projectmanager fr Rôle enregistré roles projectmanager fr Rôles +same day projectmanager fr même jour save the changes made projectmanager fr Enregistre les modifications save this project element projectmanager fr Enregistre l'élément de projet select a project projectmanager fr Sélectionner un projet select an activity if you want to calculate costs by quantity (time) and price projectmanager fr choisissez une activité si vous désirez calculer les coûts par quantité (temps) et prix +select columns projectmanager fr sélectionner les colonnes +select export options projectmanager fr Sélectionner les options d'export select multiple projects for a further action projectmanager fr Choisissez plusieurs projets pour continuer select the accounting types visible for users of projectmanager projectmanager fr Sélectionnez les types de comptabilités visibles par les utilisateurs du gestionnaire de projets select this project and show it's elements projectmanager fr Sélectionner ce projet et montrer ses éléments selectbox with %1 projectmanager fr Boîte de sélection avec %1 +set order to show sub-project bars in ganttcharts. projectmanager fr Sélectionner l'ordre de tri pour afficher les sous éléments dans les diagrammes de Gantt. share projectmanager fr Partager share on the whole project projectmanager fr Partager sur le projet entier share on the whole project in hours or percent, defaults to planned time projectmanager fr Partager sur le projet entier en heures ou pourcentage, par défaut sur le temps planifié +shared time in minutes projectmanager fr Temps partagé en minutes should projectmanager display the status icons of the datasource (eg. infolog) or just a progressbar with the numerical status (faster). projectmanager fr Le Gestionnaire de projets doit-il afficher les icônes de statut de la source de données (c'est-à-dire InfoLog) ou seulement une barre de progression avec le statut numérique (plus rapide). show constraints and milestones projectmanager fr Montrer les contraintes et les étapes +show elements in ganttchart by applications projectmanager fr Afficher les élément dans les Gantt par demande +show links in the project elements list projectmanager fr Afficher des liens sur la liste des éléments show planned times instead of the real times projectmanager fr Montrer les temps prévus au lieu des temps réels show status icons of the datasources projectmanager fr Montrer les icônes de statut de la source de données show the project selection as projectmanager fr Montrer la sélection de projet comme +site configuration projectmanager fr Configuration site configuration saved projectmanager fr Configuration du site enregistrée -start after projectmanager fr Commencer après +start date projectmanager fr Date de début +start date, end date projectmanager fr Date de début, Date de fin start working on %1 projectmanager fr Commencer de travailler sur %1 start, end, category, ... projectmanager fr Début, Fin, Catégorie... start- & enddate projectmanager fr Dates de début et de fin startdate projectmanager fr Date de début +starting %1 projectmanager fr Début %1 startrecord projectmanager fr Enregistrement de départ +starts after projectmanager fr Début après +starts before projectmanager fr Début avant +status projectmanager fr Statut status filter projectmanager fr Filtre de statut +status set projectmanager fr Statut défini +style used for everything but elements. some fonts have only normal style. projectmanager fr Style utilisé pour tout sauf les éléments. Certaines polices ont seulement un style normal. subelements projectmanager fr Sous-éléments +subproject projectmanager fr Sous-projet subprojects projectmanager fr Sous-projets +synced projectmanager fr Synchronisé synchronise all projectmanager fr Tout synchroniser tag to mark positions for address labels projectmanager fr Balise pour marquer les positions des étiquettes d'adresses template projectmanager fr Modèle +template as subproject projectmanager fr Modèle de sous-projet template including elment-tree saved as new project projectmanager fr Modèle comprenant son arborescence enregistrée comme sous-projet +template name projectmanager fr Nom du modèle +template name - project title projectmanager fr Nom du modèle - Titre de projet test import (show importable records only in browser) projectmanager fr Tester l'import (montrer seulement les enregistrements importables dans le navigateur) +that action allows to download the specified document with the project and elements data inserted. projectmanager fr Cette action permet de télécharger le document spécifier avec le projet et les éléments insérés. the following document-types are supported: projectmanager fr Les documents types suivants sont supportés : time projectmanager fr Temps times projectmanager fr Temps timezone projectmanager fr Fuseau horaire +title projectmanager fr Titre title must not be empty projectmanager fr Le titre ne doit pas être vide titles of any entries linked to the current record, excluding attached files projectmanager fr Titres de toutes les entrées liées à l'enregistrement courant, à l'exception des fichiers to many might exceed your execution-time-limit projectmanager fr trop pourrait dépasser votre temps limite d'exécution +today projectmanager fr Aujourd'hui +total projectmanager fr Total translation projectmanager fr Traduction tree with %1 projectmanager fr Arborescence avec %1 +unable to find parent project %1 projectmanager fr Impossible de trouver l'objet parent %1 unit projectmanager fr Unité unitprice projectmanager fr Unité de prix +update projectmanager fr mis à jour usage projectmanager fr Usage use this tag for addresslabels. put the content, you want to repeat, between two tags. projectmanager fr Utiliser cette balise pour les étiquettes d'adresse. Placer le contenu que vous voulez répéter entre deux balises. used projectmanager fr Utilisé -used time projectmanager fr Temps utilisé +used budget projectmanager fr Budget utilisé +used quantity projectmanager fr Quantité utilisée +used time projectmanager fr Temps passé +used time in minutes projectmanager fr Temps passé en minutes +username projectmanager fr Nom d'utilisateur valid since projectmanager fr Valide depuis view all subs of this entry projectmanager fr Voir tous les Enfants de cette entrée view ganttchart of this project projectmanager fr Voir le diagramme de Gantt de ce projet @@ -312,14 +440,18 @@ view milestone projectmanager fr Voir l'étape view price projectmanager fr Voir le prix view project projectmanager fr Voir le projet view project-elements projectmanager fr Voir les éléments du projet -view subs projectmanager fr Voir les Enfants +view subs projectmanager fr Voir les sous-éléments view this element in %1 projectmanager fr Voir cet élément dans %1 view this milestone projectmanager fr Voir cette étape view this price projectmanager fr Voir ce prix view this project projectmanager fr Voir ce projet view this project-element projectmanager fr Voir cet élément de projet working duration on %1 projectmanager fr Durée de travail sur %1 +yes, noone can purge deleted items projectmanager fr Oui, personne ne peut purger les éléments supprimés +yes, only admins can purge deleted items projectmanager fr Oui, seuls les administrateurs peuvent purger les éléments supprimés +yes, with purging of deleted items possible projectmanager fr Oui, avec la possibilité de purger les éléments supprimés. you can leave the date of the first price empty projectmanager fr vous pouvez laisser la date du premier prix vide you dont have jpgraph version %1 or higher installed! it is needed from projectmanager for ganttcharts. projectmanager fr Vous n'avez pas de version de JPGraph %1 ou plus ! Ceci est nécessaire pour les diagrammes de Gantt dans le gestionnaire de projets. you need to select a project first projectmanager fr Vous devez d'abord sélectionner un projet +you need to select some entries first! projectmanager fr Vous devez d'abord supprimer certaines entrées ! your database is not up to date (%1 vs. %2), please run %3setup%4 to update your database. projectmanager fr Votre base de données n'est PAS à jour (%1 contre %2), exécutez %3setup%4 pour la mettre à jour. diff --git a/lang/egw_it.lang b/lang/egw_it.lang index 3777d652..9e66c096 100644 --- a/lang/egw_it.lang +++ b/lang/egw_it.lang @@ -1,3 +1,4 @@ +%1 days in advance projectmanager it %1 giorni in anticipo %1 element(s) updated projectmanager it %1 elemento/i aggiornato/i %1 new project-elements imported projectmanager it %1 nuovi elementi-progetto importati %1 project(s) %2 projectmanager it %1 progetti %2 @@ -7,6 +8,8 @@ %1 records imported projectmanager it %1 record importati %1 records read (not yet imported, you may go %2back%3 and uncheck test import) projectmanager it %1 record letti (non ancora importati, è possibile tornare %2indietro%3 e deselezionare Test Importazione) %1 times permission denied, %2 projects deleted projectmanager it %1 permessi tempi negati, %2 progetti eliminati +%1 you are responsible for is due at %2 projectmanager it %1 per il quale sei responsabile, scade il %2 +%1 you are responsible for is starting at %2 projectmanager it %1 per il quale sei responsabile, comincia il %2 (project id) project title - template name projectmanager it (ID Progetto) titolo progetto - nome template - planned projectmanager it - pianificato - re-planned projectmanager it - ri-pianificato @@ -28,6 +31,7 @@ add price projectmanager it Aggiungi prezzo add project projectmanager it Aggiungi progetto add project-elements projectmanager it Aggiungi elementi-progetto add this role projectmanager it Aggiungi questo ruolo +add timesheet projectmanager it Aggiungi foglio ore add timesheet only projectmanager it Aggiungi solo foglio ore addressbook elements of a project can be used to define individual serial letter recipients. available fields are projectmanager it Elementi di rubrica di un progetto possono essere usati per definire destinatari individuali di lettere. I campi disponibili sono addressbook fields projectmanager it Campi rubrica @@ -57,9 +61,11 @@ can be used with element roles, "eroles" table plugin and "elements" table plugi category in %1 project-element(s) updated. projectmanager it Categoria aggiornata per %1 elementi di progetto category set projectmanager it Categoria impostata change category projectmanager it Modifica categoria +change the following details of %s projectmanager it Modifica i seguenti dati di %s charset of file projectmanager it Set di caratteri del file charset of the above selected font projectmanager it Set di caratteri del font selezionato sopra check all projectmanager it Seleziona tutto +check to make one element role assignable to multiple elements projectmanager it Seleziona per rendere un ruolo di elemento assegnabile a più elementi choose the default filename for downloaded documents. projectmanager it Seleziona il nome predefinito di file per i documenti scaricati close the window, discard the changes made projectmanager it Chiudi la finestra, annulla le modifiche fatte completion projectmanager it Completamento @@ -88,6 +94,7 @@ days projectmanager it giorni default action on double-click projectmanager it Azione predefinita al doppio click default all and a selectbox to choose projectmanager it tutto predefinito e una selectbox per scegliere delete all checked projects projectmanager it Elimina tutti i progetti selezionati +delete this element role projectmanager it Elimina questo ruolo di elemento delete this milestone projectmanager it Cancella questo traguardo delete this price projectmanager it Cancella questo prezzo delete this project projectmanager it Cancella questo progetto @@ -99,15 +106,23 @@ details of cumulated projectmanager it Dettagli dei cumulati details of subelements projectmanager it Dettagli dei sottoelementi directory with documents to insert project data projectmanager it Cartella con documenti per l'inserimento di dati progetto do not use that entry as project-element projectmanager it non usare quella voce come elemento-progetto +do you want a notification, if items are about to start according to their planned dates? projectmanager it Hai bisogno di una notifica quando alcune voci stanno per essere avviate in base alle loro date pianificate? +do you want a notification, if items are about to start according to their real dates? projectmanager it Hai bisogno di una notifica quando alcune voci stanno per essere avviate in base alle loro date reali? +do you want a notification, if items are due according to their planned dates? projectmanager it Hai bisogno di una notifica quando alcune voci stanno per scadere in base alle loro date pianificate? +do you want a notification, if items are due according to their real dates? projectmanager it Hai bisogno di una notifica quando alcune voci stanno per scadere in base alle loro date reali? +do you want a notification, if items get assigned to you or assigned items get updated? projectmanager it Hai bisogno di una notifica quando alcune voci a te assegnate vengono modificate? +do you want a notification, if items you created get updated? projectmanager it Hai bisogno di una notifica quando voci che hai creato tu vengono modificate? document '%1' does not exist or is not readable for you! projectmanager it Il documento '%1' non esiste o non è leggibile da te! document download filename projectmanager it Nom file documento scaricato done (100%) projectmanager it Completato (100%) edit access, incl. editing budget and elements projectmanager it modifica accesso, incl. modifica budget ed elementi edit budget projectmanager it Modifica budget +edit element roles projectmanager it Modifica ruoli di elemento edit milestone projectmanager it Modifica traguardo edit price projectmanager it Modifica prezzo edit project projectmanager it Modifica Progetto edit project-elements projectmanager it Modifica elementi-progetto +edit this element role projectmanager it Modifica questo ruolo di elemento edit this milestone projectmanager it Modifica questo traguardo edit this price projectmanager it Modifica questo prezzo edit this project projectmanager it Modifica questo progetto @@ -118,6 +133,7 @@ element details projectmanager it Dettagli elemento element id projectmanager it ID elemento element list projectmanager it Elenco elementi element modifier projectmanager it Elemento modificato da +element role projectmanager it Ruolo di elemento element role deleted projectmanager it Ruolo elemento eliminato element role saved projectmanager it Ruolo elemento salvato element role title projectmanager it Titolo ruolo elemento @@ -135,8 +151,9 @@ elements which have to be finished before this can start projectmanager it Eleme empty projectmanager it Vuoto empty for all projectmanager it per tutti vuoto encode non-ascii projectmanager it Codifica non-ascii -end before projectmanager it Fine prima di enddate projectmanager it Data fine +ends after projectmanager it Finisce dopo +ends before projectmanager it Finisce prima error: deleting element role !!! projectmanager it Errore di eliminazione ruolo elemento! error: deleting price !!! projectmanager it Errore: cancellando prezzo! error: deleting project !!! projectmanager it Errore: cancellando progetto! @@ -163,6 +180,7 @@ exists projectmanager it Esiste exit without saving projectmanager it Esci senza salvare export definition to use for nextmatch export (elements) projectmanager it Definizione di esportazione da utilizzare nell'esportazione nextmatch (elementi) export definition to use for nextmatch export (projects) projectmanager it Definizione di esportazione da utilizzare nell'esportazione nextmatch (progetti) +export definition to use for nextmatch export (projekte) projectmanager it Esporta definizione da utilizzare per l'esportazione nextmatch exports a list of project elements to a csv file. projectmanager it Esporta una lista di elementi di progetti in csv exports a list of projects to a csv file. projectmanager it Esporta una lista di progetti in csv external projectmanager it Esterno @@ -219,6 +237,7 @@ mainproject only projectmanager it Solo progetto principale mainprojects projectmanager it Progetti principali manage mapping projectmanager it Gestisci la mappatura members projectmanager it Membri +milestone projectmanager it Milestone milestone deleted projectmanager it Traguardo cancellato milestone saved projectmanager it Traguardo salvato milestones projectmanager it Traguardi @@ -228,6 +247,7 @@ modified by projectmanager it Modificato da modified date and time projectmanager it Data e ora modifica modifier projectmanager it Modificatore modify status projectmanager it Modifica stato +multi assignable projectmanager it Multi assegnabile multi assignments projectmanager it Assegnazioni multiple name of current user, all other contact fields are valid too projectmanager it Nome dell'utente corrente, tutti gli altri campi di contatto sono validi pure. necessary for project-elements doing that not automatic projectmanager it necessario per gli elementi-progetto che non lo fanno in automatico @@ -244,8 +264,11 @@ nonactive projectmanager it Non attivo not available projectmanager it Non disponibile not started (0%) projectmanager it Non iniziato (0%) not working projectmanager it non funzionante +notification settings projectmanager it Impostazioni di notifica number of characters to which title of ganttchart elements should be shortened to. projectmanager it Numero di caratteri a cui accorciare i titoli degli elementi nel Gantt number of records to read (%1) projectmanager it Numero di record da leggere (%1) +one day after projectmanager it il giorno dopo +one day in advance projectmanager it un giorno in anticipo only this project projectmanager it Solo questo progetto order of sub-project bars in ganttcharts projectmanager it Ordine delle barre di sottoprogetto nel Gantt overwrite the datasource projectmanager it Sovrascrivi sorgente dati @@ -264,6 +287,7 @@ planned time projectmanager it Tempo pianificato planned time in minutes projectmanager it Tempo pianificato in minuti planned times projectmanager it Ore pianificate please download a recent version from %1 and install it in %2. projectmanager it Per favore scarica una versione recente da %1 e installala in %2. +pm_milestone projectmanager it MIlestone price projectmanager it Prezzo price / unit projectmanager it Prezzo / Unità price deleted projectmanager it Prezzo cancellato @@ -289,14 +313,16 @@ project number projectmanager it Numero progetto project overview projectmanager it Panoramica progetto project priority projectmanager it Priorità progetto project saved projectmanager it Progetto salvato +project sort order projectmanager it Ordinamento progetti project specific title, prices, ... projectmanager it Progetto specificato: titolo, prezzi, ... project status projectmanager it Stato progetto project title projectmanager it Titolo progetto project title - template name projectmanager it Titolo progetto - nome template -project-element projectmanager it Elemento progetto -project-element deleted projectmanager it Elemento-progetto cancellato -project-element saved projectmanager it Elemento-progetto salvato -project-elements projectmanager it Elementi-Progetto +project-element projectmanager it Elemento di progetto +project-element deleted projectmanager it Elemento di progetto eliminato +project-element saved projectmanager it Elemento di progetto salvato +project-elements projectmanager it Elementi di rogetto +projectelement projectmanager it Elemento di progetto projectid projectmanager it ID progetto projectlist projectmanager it Elenco progetti projectmanager common it Gestione Progetti @@ -315,6 +341,12 @@ real end projectmanager it Fine reale real end date and time projectmanager it Data e ora fine reali real start projectmanager it Inizio reale real start date and time projectmanager it Data e ora inizio reali +receive notifications about due entries (planned dates) projectmanager it Ricevere notifiche per voci in scadenza (date pianificate) +receive notifications about due entries (real dates) projectmanager it Ricevere notifiche per voci in scadenza (date reali) +receive notifications about items assigned to you with these roles projectmanager it Ricevere notifiche per voci a te assegnate con questi ruoli +receive notifications about own items projectmanager it Ricevere notifiche per le proprie voci +receive notifications about starting entries (planned dates) projectmanager it Ricevere notifiche per voci in avvio (date pianificate) +receive notifications about starting entries (real dates) projectmanager it Ricevere notifiche per voci in avvio (date reali) remark projectmanager it Osservazione replanned time in minutes projectmanager it Tempo ripianificato in minuti resources projectmanager it Risorse @@ -322,12 +354,14 @@ role projectmanager it Ruolo role deleted projectmanager it Ruolo cancellato role saved projectmanager it Ruolo salvato roles projectmanager it Ruoli +same day projectmanager it stesso giorno save the changes made projectmanager it Salva le modifiche fatte save this project element projectmanager it Salva questo elemento progetto select a project projectmanager it scegli un progetto select an activity if you want to calculate costs by quantity (time) and price projectmanager it seleziona un'attività se vuoi calcolare i costi per quantità (tempo) e prezzo select export options projectmanager it Seleziona opzioni di esportazione select multiple projects for a further action projectmanager it Seleziona più progetti per una successiva azione +select project sort order for project tree and link search projectmanager it Seleziona l'ordinamento dei progetti nell'albero di classificazione e per la ricerca dei collegamenti select the accounting types visible for users of projectmanager projectmanager it seleziona i tipi contabilità visibili agli utenti di Gestione Progetti select this project and show it's elements projectmanager it Seleziona questo progetto e mostra i suoi elementi selectbox with %1 projectmanager it Selectbox con %1 @@ -348,13 +382,14 @@ show planned times instead of the real times projectmanager it Mostra tempi pian show status icons of the datasources projectmanager it Mostra icone di stato delle sorgenti dati show the project selection as projectmanager it Mostra la selezione progetti come site configuration saved projectmanager it Configurazione sito salvata -start after projectmanager it Inizia dopo start date, end date projectmanager it Data inizio, Data fine start working on %1 projectmanager it Ha iniziato a lavorare il %1 start, end, category, ... projectmanager it Inizio, Fine, Categoria, ... start- & enddate projectmanager it Data Inizio e Fine startdate projectmanager it Data inizio startrecord projectmanager it Record Iniziale +starts after projectmanager it Comincia dopo +starts before projectmanager it Comincia prima status filter projectmanager it Filtro di stato status set projectmanager it Impostazione stato style used for everything but elements. some fonts have only normal style. projectmanager it Stile usato per tutto tranne che per gli elementi. Alcuni font ammetto solo lo stile normale diff --git a/lang/egw_sl.lang b/lang/egw_sl.lang index 5b25f89e..f5a1ff3d 100644 --- a/lang/egw_sl.lang +++ b/lang/egw_sl.lang @@ -1,115 +1,451 @@ +%1 days in advance projectmanager sl %1 dni vnaprej %1 element(s) updated projectmanager sl %1 element(-a/-i/-ov) posodobljen(-a/-i/-ih) %1 new project-elements imported projectmanager sl %1 novih elementov projekta je bilo uvoženih +%1 project(s) %2 projectmanager sl %1 projekt (i) %2 +%1 project(s) %2, %3 failed because of insufficent rights !!! projectmanager sl %1 projektov %2, %3 ni uspel zaradi nezadostnih pravic! +%1 project-element(s) deleted. projectmanager sl %1 element (i) projekta je bil izbrisan. %1 projects deleted projectmanager sl %1 projektov je bilo zbrisanih %1 records imported projectmanager sl %1 zapisov uvoženih %1 records read (not yet imported, you may go %2back%3 and uncheck test import) projectmanager sl 1% zapisov prebranih (niso še uvoženi, lahko greste %2nazaj%3 in odznačite preizkus uvoza) %1 times permission denied, %2 projects deleted projectmanager sl %1 krat je bil dostop zavrnjen, %2 projektov zbrisanih +%1 you are responsible for is due at %2 projectmanager sl %1, za katerega ste odgovorni, je dolžan pri %2 +%1 you are responsible for is starting at %2 projectmanager sl %1, za katerega ste odgovorni, se začne pri %2 +(project id) project title - template name projectmanager sl (ID projekta) naslov projekta - ime predloge - planned projectmanager sl - planirano +- re-planned projectmanager sl - ponovno načrtovano 0ngoing (0 < % < 100) projectmanager sl V teku (0 < % < 100) a describtive title for the project, must not be empty projectmanager sl Opisni naslov projekta ne sme bit prazen accounting projectmanager sl Računovodstvo accounting options projectmanager sl Možnosti računovodstva accounting type projectmanager sl Vrsta računovodstva actions projectmanager sl Dejanja -activity projectmanager sl Aktivnost +activity projectmanager sl Dejavnosti add a new milestone projectmanager sl Dodaj nov milestone add a new project projectmanager sl Dodaj nov projekt add element projectmanager sl Dodaj element add existing projectmanager sl Dodaj obstoječega add milestone projectmanager sl Dodaj milestone +add or edit element roles projectmanager sl Dodajanje ali urejanje pravil +add or edit roles and their acl projectmanager sl Add or edit roles and their ACL add price projectmanager sl Dodaj ceno add project projectmanager sl Dodaj projekt add project-elements projectmanager sl Dodaj elemente projekta +add this role projectmanager sl Dodaj to pravilo +add timesheet projectmanager sl Dodaj časovni list +add timesheet only projectmanager sl Dodaj smao časovni list +addressbook elements of a project can be used to define individual serial letter recipients. available fields are projectmanager sl Elemente adresarja projekta lahko uporabite za definiranje posameznih prejemnikov serijskih črk. Razpoložljiva polja so +addressbook fields projectmanager sl Polja adresarjev +all projects projectmanager sl Vsi projekti +all roles projectmanager sl Vsa pravila +all_roles projectmanager sl Vsa pravila allow users to change their working times projectmanager sl Dovoli uporabnikom spreminjanje svojega delovnega časa allowed accounting types projectmanager sl Dovoljene vrste računovodstva allowed units projectmanager sl Dovoljene enote -app. projectmanager sl Apl. +anonymous public projectmanager sl Anonimna javnost +app. projectmanager sl Prg. apply the changes projectmanager sl Uveljavi spremenbe archive projectmanager sl Arhiv assistant projectmanager sl Pomočnik at which time do you start working on the given day. projectmanager sl Ob kateri uri začnete delati na določen dan. +availability settings projectmanager sl Nastavitve razpoložljivosti +available fields for this plugin: projectmanager sl Razpoložljiva polja za ta vtičnik: availible projectmanager sl Na voljo +billable projectmanager sl Predračun bookable projectmanager sl Se lahko rezervira budget projectmanager sl Proračun budget (no pricelist) projectmanager sl Proračun (brez stroškovnika) budget and pricelist projectmanager sl Proračun s stroškovnikom by projectmanager sl od +calculate budget by quantity (eg. time) and price projectmanager sl Izračunajte proračun po količini (npr. Času) in ceni +can be used with element roles, "eroles" table plugin and "elements" table plugin projectmanager sl Uporablja se lahko pri pravilih elementa, vtičnici »eRoles« in vtičniku »elementi«. +category in %1 project-element(s) updated. projectmanager sl Kategorija je posodobljena v elementih projekta %1. +category set projectmanager sl Skupina kategorij +change category projectmanager sl Spremeni kategorijo +change the following details of %s projectmanager sl Spremenite naslednje podrobnosti o %s charset of file projectmanager sl Kodna tabela datoteke +charset of the above selected font projectmanager sl Kodna tabela zgoraj izbrane pisave check all projectmanager sl Izberi vse +check to make one element role assignable to multiple elements projectmanager sl Preverite, ali je ena elementna pravilo dodeljena več elementom +choose the default filename for downloaded documents. projectmanager sl Izberite privzeto ime datoteke za prenesene dokumente. +close the window, discard the changes made projectmanager sl Zaprite okno, zavrnite izvedene spremembe +completion projectmanager sl Dokončanje +constraints projectmanager sl Omejitve +contact fields for serial letters projectmanager sl Preveri polja za serijske črke +conversation between days and hours, default 8 projectmanager sl Razmerje med dnevi in ​​urami, privzeto 8 coordinator projectmanager sl Koordinator cost per time projectmanager sl Strošek na uro +create a new empty project or use a template projectmanager sl Ustvarite nov prazen projekt ali uporabite predlogo create new links projectmanager sl Ustvari nove povezave created projectmanager sl ustvarjeno +created a ganttchart from the checked projects projectmanager sl Iz pregledanih projektov je ustvaril grafikon Gantt +creation date and time projectmanager sl Datum ustvarjanja in čas +creator projectmanager sl Stvarnik csv-fieldname projectmanager sl CSV-Ime polja csv-filename projectmanager sl CSV-Ime datoteke csv-import common sl CSV-Uvoz +cumulated elements too projectmanager sl Tudi seštevek elementov custom fields projectmanager sl Lastna polja +customer title projectmanager sl Naslov stranke +data exchange settings projectmanager sl Nastavitve za izmenjavo podatkov datasource projectmanager sl Vir podatkov +datasources too projectmanager sl Tudi viri podatkov dates projectmanager sl Datumi days projectmanager sl Dni +default action on double-click projectmanager sl Privzeto dejanje za dvokliknite +default all and a selectbox to choose projectmanager sl Privzeto vse in izberite polje za izbiro delete all checked projects projectmanager sl Zbriši vse izbrane projekte +delete this element role projectmanager sl Izbriši to vlogo elementa +delete this milestone projectmanager sl Izbriši to vlogo elementa delete this price projectmanager sl Zbriši to ceno delete this project projectmanager sl Zbriši ta projekt +delete this project-element, does not remove the linked entry projectmanager sl Izbrišite ta element projekta, NE odstranite povezanega vnosa. +delete this role projectmanager sl Izbriši to pravilo deleted projectmanager sl Zbrisano depth of display projectmanager sl Globina prikaza +details of cumulated projectmanager sl Podrobnosti seštevka +details of subelements projectmanager sl Podrobnosti podelementov +directory with documents to insert project data projectmanager sl Imenik z dokumenti za vstavljanje podatkov projekta +do not use that entry as project-element projectmanager sl Ta vnos ne uporabljajte kot element projekta +do you want a notification, if items are about to start according to their planned dates? projectmanager sl Želite obvestilo, če se bodo elementi začeli v skladu z načrtovanimi datumi? +do you want a notification, if items are about to start according to their real dates? projectmanager sl Želite obvestilo, če se bodo elementi začeli v skladu z njihovimi dejanskimi datumi? +do you want a notification, if items are due according to their planned dates? projectmanager sl Želite obvestilo, če so predmeti zapadli v skladu z načrtovanimi datumi? +do you want a notification, if items are due according to their real dates? projectmanager sl Želite obvestilo, če so predmeti zapadli glede na njihove dejanske datume? +do you want a notification, if items get assigned to you or assigned items get updated? projectmanager sl Želite obvestilo, če vam bodo predmeti dodeljeni ali bodo dodeljeni predmeti posodobljeni? +do you want a notification, if items you created get updated? projectmanager sl Želite obvestilo, če so elementi, ki ste jih ustvarili, posodobljeni? document '%1' does not exist or is not readable for you! projectmanager sl Dokument '%1' ne obstaja ali pa nimate pravice branja! +document download filename projectmanager sl Ime datoteke za prenos dokumenta done (100%) projectmanager sl Narejeno (100%) +edit access, incl. editing budget and elements projectmanager sl Uredi dostop, vklj. urejanje proračuna in elementov edit budget projectmanager sl Uredi proračun +edit element roles projectmanager sl Uredite pravila elementov +edit milestone projectmanager sl Uredite mejnik edit price projectmanager sl Uredi ceno edit project projectmanager sl Uredi projekt edit project-elements projectmanager sl Uredi elemente projekta +edit this element role projectmanager sl Uredite to pravilo elementa +edit this milestone projectmanager sl Uredite ta mejnik edit this price projectmanager sl Uredi to ceno edit this project projectmanager sl Uredi ta projekt edit this project-element projectmanager sl Uredi ta element projekta +edit this role projectmanager sl Uredi to pravilo +element category projectmanager sl Kategorija elementov +element details projectmanager sl Podrobnosti elementa +element id projectmanager sl ID elementa +element list projectmanager sl Seznam elementov +element modifier projectmanager sl Popravek elementa +element role projectmanager sl Pravilo elementa +element role deleted projectmanager sl pravilo elementa je izbrisano +element role saved projectmanager sl Pravilo elementa je shranjeno +element role title projectmanager sl Naslov pravila elementa +element roles projectmanager sl Pravilo elementa +element roles defined as "mutliple" can be used here. projectmanager sl Tu lahko uporabimo pravila elementov, ki so opredeljeni kot "večkratni". +element roles feature is currently not enabled in your global projectmanager configuration projectmanager sl Funkcija elementov trenutno ni omogočena v vaši globalni konfiguraciji programa ProjectManager. +element roles: projectmanager sl Pravila elementov +element status projectmanager sl Stanje elementov +element title projectmanager sl Naslov elementov elementlist projectmanager sl Seznam elementov +elements projectmanager sl Elementi +elements of elements projectmanager sl Elementi elementov +elements that can't start before this one is finished projectmanager sl Elementi, ki se ne morejo zagnati pred tem, je končan. +elements which have to be finished before this can start projectmanager sl Elementi, ki jih je treba dokončati, se lahko začnejo. empty projectmanager sl Prazno empty for all projectmanager sl Izprazni za vse -end before projectmanager sl Konec pred +encode non-ascii projectmanager sl Kodiraj ne-ascii enddate projectmanager sl Končni datum +ends after projectmanager sl Konča po +ends before projectmanager sl Konča pred +error: deleting element role !!! projectmanager sl Napaka pri brisanju pravila elementa! +error: deleting price !!! projectmanager sl Napaka pri brisanju cene! +error: deleting project !!! projectmanager sl Napaka pri brisanju projekta! +error: deleting project-element !!! projectmanager sl Napaka pri brisanju elementa projekta! +error: deleting role !!! projectmanager sl Napaka pri brisanju pravila! +error: project-id already exist, choose an other one or have one generated by leaving it emtpy !!! projectmanager sl Napaka: ID projekta že obstaja, izberite drugo ali jo ustvarite, tako da ga pustite prazen! +error: rekursion found: id %1 more than once in projectpath, while building projecttree: projectmanager sl NAPAKA: Najdena recurza, ID %1 več kot enkrat na projektni poti, pri gradnji projektnega drevesa: +error: saving element role !!! projectmanager sl Napaka pri shranjevanju elementa! +error: saving milestone projectmanager sl Napaka pri shranjevanju mejnika! +error: saving role !!! projectmanager sl Napaka pri shranjevanju pravila! +error: saving the price (%1) !!! projectmanager sl Napaka pri shranjevanju cene (%1)! +error: saving the project (%1) !!! projectmanager sl Napaka pri shranjevanju projekta (%1)! +error: saving the project-element (%1) !!! projectmanager sl Napaka pri shranjevanju elementa projekta (%1)! +everything recursive projectmanager sl Vse rekurzivno +example {{if n_prefix~mr~hello mr.~hello ms.}} - search the field "n_prefix", for "mr", if found, write hello mr., else write hello ms. projectmanager sl Primer {{IF n_prefix ~ Mr ~ Pozdravljeni g. ~ Pozdravljeni gospa}} - poiščite polje »n_prefix«, za »gospod«, če najdete, pišite Hello Hello, drugače pišite Hello Ms. +example {{letterprefixcustom n_prefix title n_family}} - example: mr dr. james miller projectmanager sl Primer {{LETTERPREFIXCUSTOM n_prefix naslov n_family}} - Primer: g. Dr. James Miller +example {{nelf role}} - if field role is not empty, you will get a new line with the value of field role projectmanager sl Primer {{NELF role}} - če pravilo v polju ni prazno, boste dobili novo vrstico z vrednostjo pravila na poljubnem mestu +example {{nenvlf role}} - if field role is not empty, set a lf without any value of the field projectmanager sl Primer {{nenvlf role}} - če pravilo v polju ni prazna, nastavite LF brez poljubne vrednosti polja +example: projectmanager sl Primer: +examples: projectmanager sl Primeri: +existing data will be overwrited if checked projectmanager sl Če se preveri obstoječe podatke, bodo prepisani. existing links projectmanager sl Obstoječe povezave exists projectmanager sl Obstaja +exit without saving projectmanager sl Izhod brez shranjevanja +export definition to use for nextmatch export (elements) projectmanager sl Izvozna definicija, ki jo je treba uporabiti za izvoz naslednjega računa (elementi) +export definition to use for nextmatch export (projects) projectmanager sl Izvozna definicija, ki jo je treba uporabiti za prihodnji izvoz (projekti) +export definition to use for nextmatch export (projekte) projectmanager sl Izvozna definicija, ki jo je treba uporabiti za prihodnji izvoz (Projekte) +exports a list of project elements to a csv file. projectmanager sl Izvozi seznam elementov projekta v datoteko CSV. +exports a list of projects to a csv file. projectmanager sl Izvozi seznam projektov v datoteko CSV. +external projectmanager sl Zunanji favorites projectmanager sl Priljubljene +fields for element roles: projectmanager sl Polja za pravila elementov: fieldseparator projectmanager sl Ločilo polj +font projectmanager sl Pisava +font charset projectmanager sl Nabor pisave +font style projectmanager sl Slog pisave +font to use in the ganttchart, only the vera fonts are included in the projectmanager. projectmanager sl Pisava, ki se uporablja v grafikonu Gantt, so v vodniku projekta vključene samo pisave Vera. +fontfile '%1' not found!!! projectmanager sl Datoteka s pisavi "%1" ni bila najdena! for serial letter use this tag. put the content, you want to repeat between two tags. projectmanager sl Za tipska pisma uporabite značko. Vsebino, ki jo želite imeti v vseh dokumentih, vnesite med značke. +free descriptiv text projectmanager sl Brez opisnega besedila +from %1 to %2 projectmanager sl Od %1 do %2 full access projectmanager sl poln dostop +furthermore addressbook elements in the projectmanager elements list can be selected to define individual recipients of a serial letter. projectmanager sl Elemente adresarja na seznamu elementov upravitelja projektov lahko izberete, da določite posamezne prejemnike serijske črke. +ganttchart projectmanager sl Ganttogram +ganttchart parameter projectmanager sl Parametri Ganttograma +general availibility projectmanager sl Splošna razpoložljivost general fields: projectmanager sl Splošna polja: +general pricelist projectmanager sl Splošni cenik +general settings projectmanager sl Splošne nastavitve global categories projectmanager sl Globalne kategorije h projectmanager sl h +health projectmanager sl Popravi hours projectmanager sl ure +hours per workday projectmanager sl Hours per work day +how long do you work on the given day. projectmanager sl Kako dolgo delate na dan? +how should the project selection in the menu be displayed: a tree gives a better overview, a selectbox might perform better. projectmanager sl Kako naj se prikaže izbor projekta v meniju: drevo daje boljši pregled, izbirno okence lahko bolje deluje. +html link to the current record projectmanager sl Povezava HTML s trenutnim zapisom +if checked the datasources of the elements (eg. infolog entries) are deleted too. projectmanager sl Če ste preverili podatkovne vire elementov, npr. Tudi zapisi InfoLog se izbrišejo. +if checked the datasources of the elements (eg. infolog entries) will change their status too. projectmanager sl Če ste preverili podatkovne vire elementov, npr. Točke vnosa InfoLog bodo spremenile tudi njihovo stanje. +if you see entities (eg. {) in the ganttchart, switch this off. projectmanager sl Če vidite elemente (npr. {) V gantogramu, to izključite. +if you specify an export definition, it will be used when you export projectmanager sl Če določite definicijo izvoza, se bo uporabil, ko boste izvozili +ignore that entry projectmanager sl Prezri vnos +ignored projectmanager sl Prezrti. import projectmanager sl Uvoz +imports a list of projects from a csv file. does not include project elements. projectmanager sl Uvozi seznam projektov iz datoteke CSV. Ne vključuje elementov projekta. insert projectmanager sl Vstavi last modified projectmanager sl nazadnje spremenjeno +last sync date and time projectmanager sl Zadnji datum in čas sinhronizacije +leave it empty if you dont need a different customer title projectmanager sl Pustite prazno, če ne potrebujete drugega naslova stranke. +leave it empty to have one generated projectmanager sl Pustite, da je prazna, da jo ustvarite +leave it empty, if identitcal to the time projectmanager sl Pustite, da je prazna, če je enaka času +limit number of characters in ganttchart element title (0 for no limit) projectmanager sl Omeji število znakov v naslovu elementa gantograma (0 brez omejitve) +linked elements projectmanager sl Povezani elementi links projectmanager sl Povezave +links and attached files projectmanager sl Povezave in priložene datoteke +links to specified application. example: {{links/infolog}} projectmanager sl Povezave do določene aplikacije. Primer: {{links / infolog}} +list of files linked to the current record projectmanager sl Seznam datotek, povezanih s trenutnim zapisom +lists all elements assigned to an element role in a table. projectmanager sl Lists all elements assigned to an element role in a table. +lists all project elements in a table. projectmanager sl Navede vse elemente projekta v tabeli. +mainproject only projectmanager sl Samo glavni projekt +mainprojects projectmanager sl Glavni projekti manage mapping projectmanager sl Upravljaj mapiranje members projectmanager sl Člani +milestone projectmanager sl Mejnik +milestone deleted projectmanager sl Zbrisani mejniki +milestone saved projectmanager sl Shranjeni mejniki +milestones projectmanager sl Mejniki +milestones before this element has to be finished projectmanager sl Mejnike pred tem elementom je treba končati modified projectmanager sl Spremenjeno +modified by projectmanager sl Spremenjeno z +modified date and time projectmanager sl Spremenjen datum in čas +modifier projectmanager sl Spremenil +modify status projectmanager sl Stanje spremembe +multi assignable projectmanager sl Večnamensko +multi assignments projectmanager sl Več nalog name of current user, all other contact fields are valid too projectmanager sl Ime trenutnega uporabnika, veljavna so tudi vsa druga polja stika +necessary for project-elements doing that not automatic projectmanager sl Nujno za elemente projekta, ki niso avtomatski +necessary php extentions %1 not loaded and can't be loaded !!! projectmanager sl Potrebne PHP razširitve %1 niso naložene in jih ni mogoče naložiti! new projectmanager sl nov +new project submitted by %1 at %2 projectmanager sl Nov projekt, ki ga je predložil %1 pri %2 +no accounting, only status projectmanager sl Brez računovodstva, samo stanje +no accounting, only times and status projectmanager sl Brez računovodstva, samo čas in stanje no details projectmanager sl Brez podrobnosti +no read access to the datasource: removing overwritten values will just empty them !!! projectmanager sl Ne READ dostop do vira podatkov: odstranjevanje prepisanih vrednosti jih bo le izpraznilo! +no rights to export more then %1 entries! projectmanager sl Ni pravic za izvoz več kot %1 vnosov! +no save necessary projectmanager sl Brez prihranka nonactive projectmanager sl Neaktivno +not available projectmanager sl Ni na voljo +not started (0%) projectmanager sl Ni začelo (0%) +not working projectmanager sl Ne deluje +notification settings projectmanager sl Nastavitve obvestil +number of characters to which title of ganttchart elements should be shortened to. projectmanager sl Število znakov, na katere je treba skrajšati naslov elementov gantograma. number of records to read (%1) projectmanager sl Število zapisov za branje (%1) +one day after projectmanager sl dan kasneje +one day in advance projectmanager sl en dan vnaprej +only this project projectmanager sl Samo ta projekt +order of sub-project bars in ganttcharts projectmanager sl Vrstni red podprojektnih Stolpcev gantograma +overwrite the datasource projectmanager sl Prepiši vir podatkov +percentage the member is availible for projects projectmanager sl Odstotek članov ki je na voljo za projekte +percentage the member is availible for this project projectmanager sl Odstotek članov ki je na voljo za ta projekte permission denied !!! projectmanager sl Dostop zavrnjen! planned projectmanager sl Planirano +planned budget projectmanager sl Načrtovani proračun +planned end projectmanager sl Načrtovani konec +planned end date and time projectmanager sl Načrtovani datum in čas zaključka +planned quantitiy projectmanager sl Predvidena količina +planned quantity projectmanager sl Predvidena količina +planned start projectmanager sl Načrtovani začetek +planned start date and time projectmanager sl Načrtovani datum in čas začetka planned time projectmanager sl Planirani čas +planned time in minutes projectmanager sl Predviden čas v minutah +planned times projectmanager sl Načrtovani časi +please download a recent version from %1 and install it in %2. projectmanager sl Prenesite najnovejšo različico iz %1 in jo namestite v %2. +pm_milestone projectmanager sl Mejnik price projectmanager sl Cena +price / unit projectmanager sl Cena / enota +price deleted projectmanager sl Cena je izbrisana. +price per unit projectmanager sl Cena na enoto +price saved projectmanager sl Cena je shranjena pricelist projectmanager sl Cenik +project common sl Project +project access (e.g. public) projectmanager sl Dostop do projekta, npr. javnost +project availibility projectmanager sl Razpoložljivost projekta +project category projectmanager sl Kategorija projekta +project completion (e.g. 100%) projectmanager sl Zaključek projekta, npr. 100% +project creator projectmanager sl Projektni ustvarjalec +project csv export projectmanager sl Izvoz CSV projekta +project csv import projectmanager sl Uvoz CSV projekta +project deleted projectmanager sl Projekt je izbrisan. +project element csv export projectmanager sl Izvozni element CSV projekta +project id projectmanager sl ID projekta +project id - template name projectmanager sl ID projekta - ime predloge +project members and roles projectmanager sl Člani projekta in vloge +project modified by %1 at %2 projectmanager sl Projekt je spremenil %1 na %2 +project modifier projectmanager sl Projekt spremenil +project number projectmanager sl Številka projekta +project overview projectmanager sl Pregled projekta +project priority projectmanager sl Prednost projekta +project saved projectmanager sl Projekt je shranjen. +project sort order projectmanager sl Razvrstitev projekta +project specific title, prices, ... projectmanager sl Naslov specifičnega projekta, cene, ... +project status projectmanager sl Stanje projekta +project title projectmanager sl Naslov projekta +project title - template name projectmanager sl Naslov projekta - ime predloge +project-element projectmanager sl Element projekta +project-element deleted projectmanager sl Element projekta je izbrisan. +project-element saved projectmanager sl Element projekta je shranjen. +project-elements projectmanager sl Elementi projekta +projectelement projectmanager sl Element projekta +projectid projectmanager sl ID projekta +projectlist projectmanager sl Seznam projektov projectmanager common sl Upravljalec projektov +projectmanager element fields projectmanager sl Elementi polja upravitelja projektov +projectmanager element fields: projectmanager sl Elementi polja upravitelja projektov: +projectmanager fields: projectmanager sl Področja vodij projektov: +projectmanager-fieldname projectmanager sl Ime vodnika projekta +projectmember projectmanager sl Projektni član +projects common sl Projekti quantity projectmanager sl Količina +re-planned projectmanager sl Ponovno načrtovana +re-planned time projectmanager sl Ponovno načrtovani čas +read access, incl. budget and adding elements projectmanager sl Dostop za branje, vklj. proračun in dodajanje elementov +read access, no budget projectmanager sl Dostop za branje, brez proračuna +real end projectmanager sl Pravi konec +real end date and time projectmanager sl Dejanski končni datum in čas +real start projectmanager sl Realni začetek +real start date and time projectmanager sl Realni začetni datum in čas +receive notifications about due entries (planned dates) projectmanager sl Prejemanje obvestil o zapadlih vnosih (načrtovani datumi) +receive notifications about due entries (real dates) projectmanager sl Prejemanje obvestil o zapadlih vnosih (pravi datumi) +receive notifications about items assigned to you with these roles projectmanager sl Prejemajte obvestila o elementih, ki so vam dodeljeni s temi pravili +receive notifications about own items projectmanager sl Prejmite obvestila o lastnih predmetih +receive notifications about starting entries (planned dates) projectmanager sl Prejemanje obvestil o začetnih vnosih (načrtovani datumi) +receive notifications about starting entries (real dates) projectmanager sl Prejem obvestil o začetnih vnosih (pravi datumi) remark projectmanager sl Opazka +replanned time in minutes projectmanager sl Ponovno načrtovani čas v minutah resources projectmanager sl Sredstva role projectmanager sl Vloga +role deleted projectmanager sl Pravilo zbrisano +role saved projectmanager sl Pravilo shranjeno +roles projectmanager sl Pravila +same day projectmanager sl Isti dan +save the changes made projectmanager sl Shranite izvedene spremembe +save this project element projectmanager sl Shrani ta element projekta select a project projectmanager sl Izberite projekt +select an activity if you want to calculate costs by quantity (time) and price projectmanager sl Izberite dejavnost, če želite izračunati stroške glede na količino (čas) in ceno. +select export options projectmanager sl Izberite možnosti izvoza +select multiple projects for a further action projectmanager sl Za nadaljnje ukrepe izberite več projektov +select project sort order for project tree and link search projectmanager sl Select project sort order for project tree and link search +select the accounting types visible for users of projectmanager projectmanager sl Izberite vrste računovodskih izkazov, ki so vidni za uporabnike +select this project and show it's elements projectmanager sl Izberite ta projekt in pokažite njegove elemente +selectbox with %1 projectmanager sl Izberite polje z %1 +set order to show sub-project bars in ganttcharts. projectmanager sl Nastavite vrstni red prikaza stolpcev podprojekta v gantogramu +share projectmanager sl Deliti +share on the whole project projectmanager sl Delite na celoten projekt +share on the whole project in hours or percent, defaults to planned time projectmanager sl Delite celoten projekt v urah ali odstotkih, privzeto načrtujete čas +shared time in minutes projectmanager sl Skupni čas v minutah +should project elements list show the dedicated icons of the infolog types. icons for infolog custom types can be added at the vfs-path where additional images, icons or logos can be found (see site configuration). if 32x32 pixels icons are uploaded with a file name ending with '_element', that bigger icon will be loaded in the element list. projectmanager sl Če seznami elementov projektov kažejo posebne ikone infolog tipov. Ikone za infologne tipe po meri se lahko dodajo na poti VFS, kjer so na voljo dodatne slike, ikone ali logotipi (glejte Konfiguracija strani). Če naložite ikone 32x32 pik z imenom datoteke, ki se konča z '_element', bo ta večja ikona naložena na seznam elementov. +should project elements show the links to other applications and/or the file-attachments in the project elements list (only when showing details). projectmanager sl Če bi elementi projekta prikazali povezave do drugih aplikacij in / ali priloge datotek na seznamu Elementi projekta (samo pri prikazu podrobnosti). +should projectmanager display the status icons of the datasource (eg. infolog) or just a progressbar with the numerical status (faster). projectmanager sl Če vodja projektov prikaže ikone stanja vira podatkov, npr. InfoLog ali le vrstica napredka z numeričnim statusom. +show constraints and milestones projectmanager sl Pokaži omejitve in mejnike +show elements in ganttchart by applications projectmanager sl Pokažite elemente v gantogramu po aplikacijah +show elements in ganttchart depending on applications they come from (none = all) projectmanager sl Pokaži elemente v gantogramu glede na aplikacije, iz katerih prihajajo (none = all) +show infolog type icon in the project elements list projectmanager sl Na seznamu Elementi projekta prikažite ikono vrste infologije +show links in the project elements list projectmanager sl Prikaži povezave na seznamu Elementi projekta +show planned times instead of the real times projectmanager sl Prikažite načrtovane čase namesto dejanskih časov +show status icons of the datasources projectmanager sl Prikažite ikone stanja v podatkovnih virih +show the project selection as projectmanager sl Prikaži izbor projekta kot +site configuration saved projectmanager sl Konfiguracija strani je shranjena. +start date, end date projectmanager sl Začetni datum, končni datum +start working on %1 projectmanager sl Začnite delati na %1 +start, end, category, ... projectmanager sl Začetek, konec, kategorija, ... +start- & enddate projectmanager sl Datum začetka in konca startdate projectmanager sl Začetni datum startrecord projectmanager sl Začetni zapis +starts after projectmanager sl Začne za +starts before projectmanager sl Začne prej +status filter projectmanager sl Filter stanja +status set projectmanager sl Stanje nastavljeno +style used for everything but elements. some fonts have only normal style. projectmanager sl Slog za vse, razen za elemente. Nekatere pisave imajo le običajni slog. +subelements projectmanager sl Podelementi +subproject projectmanager sl Podprojekt +subprojects projectmanager sl Podprojekti +synced projectmanager sl Posodobljeno +synchronise all projectmanager sl Vse posodobljeno +table plugins: projectmanager sl Vtičniki za tabele: tag to mark positions for address labels projectmanager sl Oznaka za označitev položajev oznak adresarja template projectmanager sl Predloga +template as subproject projectmanager sl Predloga kot podprojekt +template including elment-tree saved as new project projectmanager sl Predloga, ki vsebuje drevo elementa, je shranjena kot nov projekt +template name projectmanager sl Ime predloge +template name - project title projectmanager sl Ime predloge - naslov projekta test import (show importable records only in browser) projectmanager sl Preizkus uvoza (Pokaže uvožene zapisesamo v brskalniku). +that action allows to download the specified document with the project and elements data inserted. projectmanager sl To dejanje omogoča prenos določenega dokumenta z vstavljenimi podatki projekta in elementov. +the charset depends on the font you want to use. projectmanager sl Koda je odvisna od pisave, ki jo želite uporabiti. +the document can contain placeholder like {{%3}}, to be replaced with the data (%1full list of placeholder names%2). projectmanager sl dokument lahko vsebuje vsebnik kot {{%3}}, ki ga je treba zamenjati s podatki (%1 popoln seznam imen imenika %2). +the following document-types are supported: projectmanager sl Podprte so naslednje vrste dokumentov: +time projectmanager sl Čas times projectmanager sl Časi timezone projectmanager sl Časovni pas +title contains invalid characters (use a-z, numbers, dash and underscore) projectmanager sl Naslov vsebuje neveljavne znake. Uporabite A-Z, številke, pomišljaj in podčrtaj. +title must not be empty projectmanager sl Naslov ne sme biti prazen +titles of any entries linked to the current record, excluding attached files projectmanager sl Naslovi vseh vnosov, povezanih s trenutnim zapisom, brez priloženih datotek to many might exceed your execution-time-limit projectmanager sl Preveč lahko preseže čas izvajanja +total completion shares projectmanager sl Skupni dokončani deleži +total shares projectmanager sl Skupaj deleži translation projectmanager sl Prevod +tree with %1 projectmanager sl Drevo z %1 +unable to find parent project %1 projectmanager sl Projekta staršev %1 ni mogoče najti +unit projectmanager sl Enota +unitprice projectmanager sl Cena na enoto +usage projectmanager sl Uporaba use this tag for addresslabels. put the content, you want to repeat, between two tags. projectmanager sl Uporabi to značko za naslov nalepk. Stik, ki ga želite ponoviti, dajte med dve znački. +used projectmanager sl Uporabljeno +used budget projectmanager sl Uporabljen proračun +used quantity projectmanager sl Uporabljena količina used time projectmanager sl Porabljen čas +used time in minutes projectmanager sl Uporabljen čas v nekaj minutah +valid since projectmanager sl Velja od view all subs of this entry projectmanager sl Poglej vse podrejene zapise +view ganttchart of this project projectmanager sl Oglejte si gantogram tega projekta +view milestone projectmanager sl Pogled mejnika +view price projectmanager sl Pogled cene +view project projectmanager sl Pogled projekta +view project-elements projectmanager sl Pogled elementov projekta view subs projectmanager sl Pogled podrejenih zapisov +view this element in %1 projectmanager sl Ogled tega elementa v %1 +view this milestone projectmanager sl Oglejte si ta mejnik +view this price projectmanager sl Oglejte si to ceno +view this project projectmanager sl Oglejte si ta projekt +view this project-element projectmanager sl Oglejte si ta element projekta +working duration on %1 projectmanager sl Delovno trajanje na %1 +you can leave the date of the first price empty projectmanager sl Datum prve cene lahko pustite prazen +you dont have jpgraph version %1 or higher installed! it is needed from projectmanager for ganttcharts. projectmanager sl Nimate nameščene različice JPGraph %1 ali novejše! Potreben je od vodje projekta za grafikone Gantt. +you need to select a project first projectmanager sl Najprej morate izbrati projekt your database is not up to date (%1 vs. %2), please run %3setup%4 to update your database. projectmanager sl Vaša podatkovna baza NI obnovljena (%1 vs. %2), prosimo poženite %3 nastavitev%4 za prenovo vaše podatkovne baze. diff --git a/lang/egw_tr.lang b/lang/egw_tr.lang index 1c42af36..1f2a63e0 100644 --- a/lang/egw_tr.lang +++ b/lang/egw_tr.lang @@ -1,24 +1,24 @@ %1 records imported projectmanager tr %1 kay?t ithal edildi. -%1 records read (not yet imported, you may go %2back%3 and uncheck test import) projectmanager tr %1 kay?t okundu. (Henz ithal edilmedi, %2geri%3 giderek ?thal Etme seene?indeki tik i?aretini kald?rabilirsiniz.) +%1 records read (not yet imported, you may go %2back%3 and uncheck test import) projectmanager tr %1 kay?t okundu. (Henüz ithal edilmedi, %2geri%3 giderek ?thal Etme seçene?indeki tik i?aretini kald?rabilirsiniz.) actions projectmanager tr Eylemler -charset of file projectmanager tr Dosya Karakter Kmesi (char-set) +charset of file projectmanager tr Dosya Karakter Kümesi (char-set) csv-fieldname projectmanager tr CSV Alan-Ad? csv-filename projectmanager tr CSV Dosya Ad? -custom fields projectmanager tr zel Alanlar -days projectmanager tr gn +custom fields projectmanager tr Özel Alanlar +days projectmanager tr gün deleted projectmanager tr Silindi -empty for all projectmanager tr Tamam? iin bo? -enddate projectmanager tr BitiTarih +empty for all projectmanager tr Tamam? için bo? +enddate projectmanager tr BitişTarih fieldseparator projectmanager tr Alan ayrac? global categories projectmanager tr Genel kategoriler hours projectmanager tr saat import projectmanager tr ?thal Et -modified projectmanager tr Deitirilmi +modified projectmanager tr Değiştirilmiş new projectmanager tr Yeni number of records to read (%1) projectmanager tr Okunacak kay?t say?s? (1%) -startdate projectmanager tr Balang tarihi +startdate projectmanager tr Başlangıç tarihi startrecord projectmanager tr Kaydetmeye ba?la -test import (show importable records only in browser) projectmanager tr ?thal test (?thal edilebilecek ba?lant?lar? sadece grntle. +test import (show importable records only in browser) projectmanager tr ?thal test (?thal edilebilecek ba?lant?lar? sadece görüntüle. times projectmanager tr Kere -to many might exceed your execution-time-limit projectmanager tr ok fazlas? execution-time-limit'inizi a?abilir! -translation projectmanager tr Tercme +to many might exceed your execution-time-limit projectmanager tr çok fazlas? execution-time-limit'inizi a?abilir! +translation projectmanager tr Tercüme diff --git a/setup/setup.inc.php b/setup/setup.inc.php index 3247cb5e..4025f673 100644 --- a/setup/setup.inc.php +++ b/setup/setup.inc.php @@ -11,7 +11,7 @@ */ $setup_info['projectmanager']['name'] = 'projectmanager'; -$setup_info['projectmanager']['version'] = '16.1'; +$setup_info['projectmanager']['version'] = '17.1'; $setup_info['projectmanager']['app_order'] = 5; $setup_info['projectmanager']['tables'] = array('egw_pm_projects','egw_pm_extra','egw_pm_elements','egw_pm_constraints','egw_pm_milestones','egw_pm_roles','egw_pm_members','egw_pm_pricelist','egw_pm_prices','egw_pm_eroles'); $setup_info['projectmanager']['enable'] = 1; diff --git a/setup/tables_update.inc.php b/setup/tables_update.inc.php index f4abfd01..c1a26233 100644 --- a/setup/tables_update.inc.php +++ b/setup/tables_update.inc.php @@ -458,7 +458,16 @@ function projectmanager_upgrade14_2() } +/** + * Fix pe_status to be (again) only "new", "used" or "ignore" + * + * @return string + */ function projectmanager_upgrade16_1() { + $GLOBALS['egw_setup']->db->update('egw_pm_elements', array( + 'pe_status' => 'used', + ), "pe_status NOT IN ('new','used','ignore')", __LINE__, __FILE__, 'projectmanager'); + return $GLOBALS['setup_info']['projectmanager']['currentver'] = '17.1'; } diff --git a/templates/default/config.xet b/templates/default/config.xet index 88a780da..88aa005b 100644 --- a/templates/default/config.xet +++ b/templates/default/config.xet @@ -65,18 +65,7 @@ - - - - - - - - - - - - + diff --git a/templates/default/elements.list.xet b/templates/default/elements.list.xet index 4391dc29..a567f7b0 100644 --- a/templates/default/elements.list.xet +++ b/templates/default/elements.list.xet @@ -173,11 +173,11 @@ return false;"/> - - + +