From 87bba93d4b7a2951a54be305d552c5b5869b3d89 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 18 Aug 2012 19:35:05 +0200 Subject: [PATCH] [REM] unused files from calendar bzr revid: al@openerp.com-20120818173505-6i414945p102fp0c --- .../codebase/connector/base_connector.php | 706 ------------- .../codebase/connector/combo_connector.php | 89 -- .../codebase/connector/connector.js | 141 --- .../connector/crosslink_connector.php | 120 --- .../codebase/connector/dataprocessor.php | 465 --------- .../codebase/connector/db_common.php | 959 ------------------ .../codebase/connector/db_mssql.php | 66 -- .../codebase/connector/db_mysqli.php | 53 - .../codebase/connector/db_oracle.php | 79 -- .../codebase/connector/db_pdo.php | 65 -- .../codebase/connector/db_postgre.php | 66 -- .../codebase/connector/grid_connector.php | 268 ----- .../connector/scheduler_connector.php | 121 --- .../codebase/connector/tools.php | 254 ----- .../codebase/connector/tree_connector.php | 274 ----- .../codebase/connector/treegrid_connector.php | 161 --- .../codebase/connector/update.php | 262 ----- .../codebase/dhtmlxscheduler_mobile.css | 5 - .../codebase/dhtmlxscheduler_mobile.js | 318 ------ .../codebase/imgs_glossy/blue_tab.png | Bin 247 -> 0 bytes .../codebase/imgs_glossy/blue_tab_wide.png | Bin 252 -> 0 bytes .../codebase/imgs_glossy/but_repeat.gif | Bin 1149 -> 0 bytes .../codebase/imgs_glossy/buttons.gif | Bin 616 -> 0 bytes .../codebase/imgs_glossy/calendar.gif | Bin 622 -> 0 bytes .../codebase/imgs_glossy/clock_big.gif | Bin 1321 -> 0 bytes .../codebase/imgs_glossy/clock_small.gif | Bin 388 -> 0 bytes .../imgs_glossy/colapce-expand-icon.gif | Bin 452 -> 0 bytes .../codebase/imgs_glossy/controlls5.png | Bin 2835 -> 0 bytes .../codebase/imgs_glossy/databg.png | Bin 89 -> 0 bytes .../codebase/imgs_glossy/databg_now.png | Bin 89 -> 0 bytes .../codebase/imgs_glossy/event-bg.png | Bin 148 -> 0 bytes .../codebase/imgs_glossy/icon.png | Bin 230 -> 0 bytes .../codebase/imgs_glossy/left-separator.png | Bin 230 -> 0 bytes .../codebase/imgs_glossy/left-time-bg.png | Bin 124 -> 0 bytes .../codebase/imgs_glossy/lightbox.png | Bin 207 -> 0 bytes .../codebase/imgs_glossy/loading.gif | Bin 3951 -> 0 bytes .../codebase/imgs_glossy/move.png | Bin 145 -> 0 bytes .../codebase/imgs_glossy/multi-days-bg.png | Bin 350 -> 0 bytes .../imgs_glossy/second-top-days-bg.png | Bin 138 -> 0 bytes .../codebase/imgs_glossy/top-days-bg.png | Bin 177 -> 0 bytes .../codebase/imgs_glossy/top-separator.gif | Bin 259 -> 0 bytes .../codebase/imgs_glossy/white_tab.png | Bin 290 -> 0 bytes .../codebase/imgs_glossy/white_tab_wide.png | Bin 300 -> 0 bytes .../codebase/imgs_mobile/add.png | Bin 1404 -> 0 bytes .../codebase/imgs_mobile/arrow_left.png | Bin 1955 -> 0 bytes .../codebase/imgs_mobile/arrow_right.png | Bin 1975 -> 0 bytes .../codebase/imgs_mobile/event.png | Bin 1096 -> 0 bytes .../codebase/imgs_mobile/event_focus.png | Bin 1062 -> 0 bytes .../codebase/imgs_mobile/noevents.png | Bin 1687 -> 0 bytes .../lib/dhtmlxScheduler/codebase/readme.txt | 16 - 50 files changed, 4488 deletions(-) delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/crosslink_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab_wide.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/buttons.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_small.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/colapce-expand-icon.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-time-bg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/top-days-bg.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/top-separator.gif delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/add.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/event.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/event_focus.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png delete mode 100644 addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php deleted file mode 100644 index aab70e3c6ea..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/base_connector.php +++ /dev/null @@ -1,706 +0,0 @@ -start = $start; - $this->end = $end; - $this->type = "xml"; - } - public function add($add){ - $this->start.=$add; - } - public function reset(){ - $this->start=""; - $this->end=""; - } - public function set_type($add){ - $this->type=$add; - } - public function output($name="", $inline=true){ - ob_clean(); - if ($this->type == "xml") - header("Content-type: text/xml"); - - echo $this->__toString(); - } - public function __toString(){ - return $this->start.$this->end; - } -} - -/*! EventInterface - Base class , for iterable collections, which are used in event -**/ -class EventInterface{ - protected $request; ////!< DataRequestConfig instance - public $rules=array(); //!< array of sorting rules - - /*! constructor - creates a new interface based on existing request - @param request - DataRequestConfig object - */ - public function __construct($request){ - $this->request = $request; - } - - /*! remove all elements from collection - */ - public function clear(){ - array_splice($rules,0); - } - /*! get index by name - - @param name - name of field - @return - index of named field - */ - public function index($name){ - $len = sizeof($this->rules); - for ($i=0; $i < $len; $i++) { - if ($this->rules[$i]["name"]==$name) - return $i; - } - return false; - } -} -/*! Wrapper for collection of sorting rules -**/ -class SortInterface extends EventInterface{ - /*! constructor - creates a new interface based on existing request - @param request - DataRequestConfig object - */ - public function __construct($request){ - parent::__construct($request); - $this->rules = &$request->get_sort_by_ref(); - } - /*! add new sorting rule - - @param name - name of field - @param dir - direction of sorting - */ - public function add($name,$dir){ - $this->request->set_sort($name,$dir); - } - public function store(){ - $this->request->set_sort_by($this->rules); - } -} -/*! Wrapper for collection of filtering rules -**/ -class FilterInterface extends EventInterface{ - /*! constructor - creates a new interface based on existing request - @param request - DataRequestConfig object - */ - public function __construct($request){ - $this->request = $request; - $this->rules = &$request->get_filters_ref(); - } - /*! add new filatering rule - - @param name - name of field - @param value - value to filter by - @param rule - filtering rule - */ - public function add($name,$value,$rule){ - $this->request->set_filter($name,$value,$rule); - } - public function store(){ - $this->request->set_filters($this->rules); - } -} - -/*! base class for component item representation -**/ -class DataItem{ - protected $data; //!< hash of data - protected $config;//!< DataConfig instance - protected $index;//!< index of element - protected $skip;//!< flag , which set if element need to be skiped during rendering - /*! constructor - - @param data - hash of data - @param config - DataConfig object - @param index - index of element - */ - function __construct($data,$config,$index){ - $this->config=$config; - $this->data=$data; - $this->index=$index; - $this->skip=false; - } - /*! get named value - - @param name - name or alias of field - @return - value from field with provided name or alias - */ - public function get_value($name){ - return $this->data[$name]; - } - /*! set named value - - @param name - name or alias of field - @param value - value for field with provided name or alias - */ - public function set_value($name,$value){ - return $this->data[$name]=$value; - } - /*! get id of element - @return - id of element - */ - public function get_id(){ - $id = $this->config->id["name"]; - if (array_key_exists($id,$this->data)) - return $this->data[$id]; - return false; - } - /*! change id of element - - @param value - new id value - */ - public function set_id($value){ - $this->data[$this->config->id["name"]]=$value; - } - /*! get index of element - - @return - index of element - */ - public function get_index(){ - return $this->index; - } - /*! mark element for skiping ( such element will not be rendered ) - */ - public function skip(){ - $this->skip=true; - } - - /*! return self as XML string - */ - public function to_xml(){ - return $this->to_xml_start().$this->to_xml_end(); - } - - /*! replace xml unsafe characters - - @param string - string to be escaped - @return - escaped string - */ - protected function xmlentities($string) { - return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); - } - - /*! return starting tag for self as XML string - */ - public function to_xml_start(){ - $str="config->data); $i++){ - $name=$this->config->data[$i]["name"]; - $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'"; - } - return $str.">"; - } - /*! return ending tag for XML string - */ - public function to_xml_end(){ - return ""; - } -} - - - - - -/*! Base connector class - This class used as a base for all component specific connectors. - Can be used on its own to provide raw data. -**/ -class Connector { - protected $config;//DataConfig instance - protected $request;//DataRequestConfig instance - protected $names;//!< hash of names for used classes - private $encoding="utf-8";//!< assigned encoding (UTF-8 by default) - private $editing=false;//!< flag of edit mode ( response for dataprocessor ) - private $updating=false;//!< flag of update mode ( response for data-update ) - private $db; //!< db connection resource - protected $dload;//!< flag of dyn. loading mode - public $access; //!< AccessMaster instance - - public $sql; //DataWrapper instance - public $event; //EventMaster instance - public $limit=false; - - private $id_seed=0; //!< default value, used to generate auto-IDs - protected $live_update = false; // actions table name for autoupdating - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param db - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($db,$type=false, $item_type=false, $data_type=false){ - $this->exec_time=microtime(true); - - if (!$type) $type="MySQL"; - if (class_exists($type."DBDataWrapper",false)) $type.="DBDataWrapper"; - if (!$item_type) $item_type="DataItem"; - if (!$data_type) $data_type="DataProcessor"; - - $this->names=array( - "db_class"=>$type, - "item_class"=>$item_type, - "data_class"=>$data_type, - ); - - $this->config = new DataConfig(); - $this->request = new DataRequestConfig(); - $this->event = new EventMaster(); - $this->access = new AccessMaster(); - - if (!class_exists($this->names["db_class"],false)) - throw new Exception("DB class not found: ".$this->names["db_class"]); - $this->sql = new $this->names["db_class"]($db,$this->config); - - $this->db=$db;//saved for options connectors, if any - - EventMaster::trigger_static("connectorCreate",$this); - } - - /*! return db connection resource - nested class may neeed to access live connection object - @return - DB connection resource - */ - protected function get_connection(){ - return $this->db; - } - - public function get_config(){ - return new DataConfig($this->config); - } - - public function get_request(){ - return new DataRequestConfig($this->config); - } - - - /*! config connector based on table - - @param table - name of table in DB - @param id - name of id field - @param fields - list of fields names - @param extra - list of extra fields, optional, such fields will not be included in data rendering, but will be accessible in all inner events - @param relation_id - name of field used to define relations for hierarchical data organization, optional - */ - public function render_table($table,$id="",$fields=false,$extra=false,$relation_id=false){ - $this->configure($table,$id,$fields,$extra,$relation_id); - return $this->render(); - } - public function configure($table,$id="",$fields=false,$extra=false,$relation_id=false){ - if ($fields === false){ - //auto-config - $info = $this->sql->fields_list($table); - $fields = implode(",",$info["fields"]); - if ($info["key"]) - $id = $info["key"]; - } - $this->config->init($id,$fields,$extra,$relation_id); - $this->request->set_source($table); - } - - protected function uuid(){ - return time()."x".$this->id_seed++; - } - - /*! config connector based on sql - - @param sql - sql query used as base of configuration - @param id - name of id field - @param fields - list of fields names - @param extra - list of extra fields, optional, such fields will not be included in data rendering, but will be accessible in all inner events - @param relation_id - name of field used to define relations for hierarchical data organization, optional - */ - public function render_sql($sql,$id,$fields,$extra=false,$relation_id=false){ - $this->config->init($id,$fields,$extra,$relation_id); - $this->request->parse_sql($sql); - return $this->render(); - } - - /*! render already configured connector - - @param config - configuration of data - @param request - configuraton of request - */ - public function render_connector($config,$request){ - $this->config->copy($config); - $this->request->copy($request); - return $this->render(); - } - - /*! render self - process commands, output requested data as XML - */ - public function render(){ - EventMaster::trigger_static("connectorInit",$this); - - $this->parse_request(); - if ($this->live_update !== false && $this->updating!==false) { - $this->live_update->get_updates(); - } else { - if ($this->editing){ - $dp = new $this->names["data_class"]($this,$this->config,$this->request); - $dp->process($this->config,$this->request); - } - else { - $wrap = new SortInterface($this->request); - $this->event->trigger("beforeSort",$wrap); - $wrap->store(); - - $wrap = new FilterInterface($this->request); - $this->event->trigger("beforeFilter",$wrap); - $wrap->store(); - - $this->output_as_xml( $this->sql->select($this->request) ); - } - } - $this->end_run(); - } - - /*! prevent SQL injection through column names - replace dangerous chars in field names - @param str - incoming field name - @return - safe field name - */ - protected function safe_field_name($str){ - return strtok($str, " \n\t;',"); - } - - /*! limit max count of records - connector will ignore any records after outputing max count - @param limit - max count of records - @return - none - */ - public function set_limit($limit){ - $this->limit = $limit; - } - - protected function parse_request_mode(){ - //detect edit mode - if (isset($_GET["editing"])){ - $this->editing=true; - } else if (isset($_POST["ids"])){ - $this->editing=true; - LogMaster::log('While there is no edit mode mark, POST parameters similar to edit mode detected. \n Switching to edit mode ( to disable behavior remove POST[ids]'); - } else if (isset($_GET['dhx_version'])){ - $this->updating = true; - } - } - - /*! parse incoming request, detects commands and modes - */ - protected function parse_request(){ - //set default dyn. loading params, can be reset in child classes - if ($this->dload) - $this->request->set_limit(0,$this->dload); - else if ($this->limit) - $this->request->set_limit(0,$this->limit); - - $this->parse_request_mode(); - - if ($this->live_update && ($this->updating || $this->editing)){ - $this->request->set_version($_GET["dhx_version"]); - $this->request->set_user($_GET["dhx_user"]); - } - - if (isset($_GET["dhx_sort"])) - foreach($_GET["dhx_sort"] as $k => $v){ - $k = $this->safe_field_name($k); - $this->request->set_sort($this->resolve_parameter($k),$v); - } - - if (isset($_GET["dhx_filter"])) - foreach($_GET["dhx_filter"] as $k => $v){ - $k = $this->safe_field_name($k); - $this->request->set_filter($this->resolve_parameter($k),$v); - } - - - } - - /*! convert incoming request name to the actual DB name - @param name - incoming parameter name - @return - name of related DB field - */ - protected function resolve_parameter($name){ - return $name; - } - - - /*! replace xml unsafe characters - - @param string - string to be escaped - @return - escaped string - */ - private function xmlentities($string) { - return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); - } - - /*! render from DB resultset - @param res - DB resultset - process commands, output requested data as XML - */ - protected function render_set($res){ - $output=""; - $index=0; - $this->event->trigger("beforeRenderSet",$this,$res,$this->config); - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - if ($data->get_id()===false) - $data->set_id($this->uuid()); - $this->event->trigger("beforeRender",$data); - $output.=$data->to_xml(); - $index++; - } - return $output; - } - - /*! output fetched data as XML - @param res - DB resultset - */ - protected function output_as_xml($res){ - $start="encoding."' ?>".$this->xml_start(); - $end=$this->render_set($res).$this->xml_end(); - - $out = new OutputWriter($start, $end); - $this->event->trigger("beforeOutput", $this, $out); - - $out->output(); - } - - - /*! end processing - stop execution timer, kill the process - */ - protected function end_run(){ - $time=microtime(true)-$this->exec_time; - LogMaster::log("Done in {$time}s"); - flush(); - die(); - } - - /*! set xml encoding - - methods sets only attribute in XML, no real encoding conversion occurs - @param encoding - value which will be used as XML encoding - */ - public function set_encoding($encoding){ - $this->encoding=$encoding; - } - - /*! enable or disable dynamic loading mode - - @param count - count of rows loaded from server, actual only for grid-connector, can be skiped in other cases. - If value is a false or 0 - dyn. loading will be disabled - */ - public function dynamic_loading($count){ - $this->dload=$count; - } - - /*! enable logging - - @param path - path to the log file. If set as false or empty strig - logging will be disabled - @param client_log - enable output of log data to the client side - */ - public function enable_log($path=true,$client_log=false){ - LogMaster::enable_log($path,$client_log); - } - - /*! provides infor about current processing mode - @return - true if processing dataprocessor command, false otherwise - */ - public function is_select_mode(){ - $this->parse_request_mode(); - return !$this->editing; - } - - public function is_first_call(){ - $this->parse_request_mode(); - return !($this->editing || $this->updating || $this->request->get_start() || sizeof($this->request->get_filters()) || sizeof($this->request->get_sort_by())); - - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - return ""; - } - /*! renders self as xml, ending part - */ - protected function xml_end(){ - return ""; - } - - - public function insert($data) { - $action = new DataAction('inserted', false, $data); - $request = new DataRequestConfig(); - $request->set_source($this->request->get_source()); - - $this->config->limit_fields($data); - $this->sql->insert($action,$request); - $this->config->restore_fields($data); - - return $action->get_new_id(); - } - - public function delete($id) { - $action = new DataAction('deleted', $id, array()); - $request = new DataRequestConfig(); - $request->set_source($this->request->get_source()); - - $this->sql->delete($action,$request); - return $action->get_status(); -} - - public function update($data) { - $action = new DataAction('updated', $data[$this->config->id["name"]], $data); - $request = new DataRequestConfig(); - $request->set_source($this->request->get_source()); - - $this->config->limit_fields($data); - $this->sql->update($action,$request); - $this->config->restore_fields($data); - - return $action->get_status(); - } - - /*! sets actions_table for Optimistic concurrency control mode and start it - @param table_name - name of database table which will used for saving actions - @param url - url used for update notifications - */ - public function enable_live_update($table, $url=false){ - $this->live_update = new DataUpdate($this->sql, $this->config, $this->request, $table,$url); - $this->live_update->set_event($this->event,$this->names["item_class"]); - $this->event->attach("beforeOutput", Array($this->live_update, "version_output")); - $this->event->attach("beforeFiltering", Array($this->live_update, "get_updates")); - $this->event->attach("beforeProcessing", Array($this->live_update, "check_collision")); - $this->event->attach("afterProcessing", Array($this->live_update, "log_operations")); - } -} - - -/*! wrapper around options collection, used for comboboxes and filters -**/ -class OptionsConnector extends Connector{ - protected $init_flag=false;//!< used to prevent rendering while initialization - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="DataItem"; - if (!$data_type) $data_type=""; //has not sense, options not editable - parent::__construct($res,$type,$item_type,$data_type); - } - /*! render self - process commands, return data as XML, not output data to stdout, ignore parameters in incoming request - @return - data as XML string - */ - public function render(){ - if (!$this->init_flag){ - $this->init_flag=true; - return ""; - } - $res = $this->sql->select($this->request); - return $this->render_set($res); - } -} - - - -class DistinctOptionsConnector extends OptionsConnector{ - /*! render self - process commands, return data as XML, not output data to stdout, ignore parameters in incoming request - @return - data as XML string - */ - public function render(){ - if (!$this->init_flag){ - $this->init_flag=true; - return ""; - } - $res = $this->sql->get_variants($this->config->text[0]["db_name"],$this->request); - return $this->render_set($res); - } -} - -?> diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php deleted file mode 100644 index 65e6bfe8564..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/combo_connector.php +++ /dev/null @@ -1,89 +0,0 @@ -selected=false; - } - /*! mark option as selected - */ - function select(){ - $this->selected=true; - } - /*! return self as XML string, starting part - */ - function to_xml_start(){ - if ($this->skip) return ""; - - return ""; - } -} - -/*! Connector for the dhtmlxCombo -**/ -class ComboConnector extends Connector{ - private $filter; //!< filtering mask from incoming request - private $position; //!< position from incoming request - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param res - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="ComboDataItem"; - parent::__construct($res,$type,$item_type,$data_type); - } - - //parse GET scoope, all operations with incoming request must be done here - function parse_request(){ - parent::parse_request(); - - if (isset($_GET["pos"])){ - if (!$this->dload) //not critical, so just write a log message - LogMaster::log("Dyn loading request received, but server side was not configured to process dyn. loading. "); - else - $this->request->set_limit($_GET["pos"],$this->dload); - } - - if (isset($_GET["mask"])) - $this->request->set_filter($this->config->text[0]["name"],$_GET["mask"]."%","LIKE"); - - LogMaster::log($this->request); - } - - - /*! renders self as xml, starting part - */ - public function xml_start(){ - if ($this->request->get_start()) - return ""; - else - return ""; - } - - /*! renders self as xml, ending part - */ - public function xml_end(){ - return ""; - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js deleted file mode 100644 index f0d03f7a880..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/connector.js +++ /dev/null @@ -1,141 +0,0 @@ -/* -This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details -*/ -/* - dhx_sort[index]=direction - dhx_filter[index]=mask -*/ -if (window.dhtmlXGridObject){ - dhtmlXGridObject.prototype._init_point_connector=dhtmlXGridObject.prototype._init_point; - dhtmlXGridObject.prototype._init_point=function(){ - var clear_url=function(url){ - url=url.replace(/(\?|\&)connector[^\f]*/g,""); - return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"; - } - var combine_urls=function(url){ - return clear_url(url)+(this._connector_sorting||"")+(this._connector_filter||""); - } - var sorting_url=function(url,ind,dir){ - this._connector_sorting="&dhx_sort["+ind+"]="+dir; - return combine_urls.call(this,url); - } - var filtering_url=function(url,inds,vals){ - for (var i=0; idata_mode = $name; - $this->data_result=array(); - } - public function getDataResult(){ - return $this->data_result; - } - - public function render(){ - if (!$this->init_flag){ - $this->init_flag=true; - return ""; - } - return parent::render(); - } - - protected function output_as_xml($res){ - if ($this->data_mode){ - while ($data=$this->sql->get_next($res)){ - $this->data_result[]=$data[$this->data_mode]; - } - } - else - return parent::output_as_xml($res); - } - protected function end_run(){ - if (!$this->data_mode) - parent::end_run(); - } -} - -class CrossOptionsConnector extends Connector{ - public $options, $link; - private $master_name, $link_name, $master_value; - - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - $this->options = new OptionsConnector($res,$type,$item_type,$data_type); - $this->link = new DelayedConnector($res,$type,$item_type,$data_type); - - EventMaster::attach_static("connectorInit",array($this, "handle")); - } - public function handle($conn){ - if ($conn instanceof DelayedConnector) return; - if ($conn instanceof OptionsConnector) return; - - $this->master_name = $this->link->get_config()->id["db_name"]; - $this->link_name = $this->options->get_config()->id["db_name"]; - - $this->link->event->attach("beforeFilter",array($this, "get_only_related")); - - if (isset($_GET["dhx_crosslink_".$this->link_name])){ - $this->get_links($_GET["dhx_crosslink_".$this->link_name]); - die(); - } - - if (!$this->dload){ - $conn->event->attach("beforeRender", array($this, "getOptions")); - $conn->event->attach("beforeRenderSet", array($this, "prepareConfig")); - } - - - $conn->event->attach("afterProcessing", array($this, "afterProcessing")); - } - public function prepareConfig($conn, $res, $config){ - $config->add_field($this->link_name); - } - public function getOptions($data){ - $this->link->dataMode($this->link_name); - - $this->get_links($data->get_value($this->master_name)); - - $data->set_value($this->link_name, implode(",",$this->link->getDataResult())); - } - public function get_links($id){ - $this->master_value = $id; - $this->link->render(); - } - public function get_only_related($filters){ - $index = $filters->index($this->master_name); - if ($index!==false){ - $filters->rules[$index]["value"]=$this->master_value; - } else - $filters->add($this->master_name, $this->master_value, "="); - } - public function afterProcessing($action){ - $status = $action->get_status(); - - $master_key = $action->get_value($this->master_name); - $link_key = $action->get_value($this->link_name); - $link_key = explode(',', $link_key); - - if ($status == "inserted") - $master_key = $action->get_new_id(); - - switch ($status){ - case "deleted": - $this->link->delete($master_key); - break; - case "updated": - $this->link->delete($master_key); - case "inserted": - for ($i=0; $i < sizeof($link_key); $i++) - if ($link_key[$i]!="") - $this->link->insert(array( - $this->link_name => $link_key[$i], - $this->master_name => $master_key - )); - break; - } - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php deleted file mode 100644 index 551a3ce7cb2..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/dataprocessor.php +++ /dev/null @@ -1,465 +0,0 @@ -connector= $connector; - $this->config=$config; - $this->request=$request; - } - - /*! convert incoming data name to valid db name - redirect to Connector->name_data by default - @param data - data name from incoming request - @return - related db_name - */ - function name_data($data){ - return $data; - } - /*! retrieve data from incoming request and normalize it - - @param ids - array of extected IDs - @return - hash of data - */ - function get_post_values($ids){ - $data=array(); - for ($i=0; $i < sizeof($ids); $i++) - $data[$ids[$i]]=array(); - - foreach ($_POST as $key => $value) { - $details=explode("_",$key,2); - if (sizeof($details)==1) continue; - - $name=$this->name_data($details[1]); - $data[$details[0]][$name]=$value; - } - - return $data; - } - /*! process incoming request ( save|update|delete ) - */ - function process(){ - LogMaster::log("DataProcessor object initialized",$_POST); - - $results=array(); - - if (!isset($_POST["ids"])) - throw new Exception("Incorrect incoming data, ID of incoming records not recognized"); - - $ids=explode(",",$_POST["ids"]); - $rows_data=$this->get_post_values($ids); - $failed=false; - - try{ - if ($this->connector->sql->is_global_transaction()) - $this->connector->sql->begin_transaction(); - - for ($i=0; $i < sizeof($ids); $i++) { - $rid = $ids[$i]; - LogMaster::log("Row data [{$rid}]",$rows_data[$rid]); - - if (!isset($_POST[$rid."_!nativeeditor_status"])) - throw new Exception("Status of record [{$rid}] not found in incoming request"); - $status = $_POST[$rid."_!nativeeditor_status"]; - - $action=new DataAction($status,$rid,$rows_data[$rid]); - $results[]=$action; - $this->inner_process($action); - } - - } catch(Exception $e){ - $failed=true; - } - - if ($this->connector->sql->is_global_transaction()){ - if (!$failed) - for ($i=0; $i < sizeof($results); $i++) - if ($results[$i]->get_status()=="error" || $results[$i]->get_status()=="invalid"){ - $failed=true; - break; - } - if ($failed){ - for ($i=0; $i < sizeof($results); $i++) - $results[$i]->error(); - $this->connector->sql->rollback_transaction(); - } - else - $this->connector->sql->commit_transaction(); - } - - $this->output_as_xml($results); - } - - /*! converts status string to the inner mode name - - @param status - external status string - @return - inner mode name - */ - protected function status_to_mode($status){ - switch($status){ - case "updated": - return "update"; - break; - case "inserted": - return "insert"; - break; - case "deleted": - return "delete"; - break; - default: - return $status; - break; - } - } - /*! process data updated request received - - @param action - DataAction object - @return - DataAction object with details of processing - */ - protected function inner_process($action){ - - if ($this->connector->sql->is_record_transaction()) - $this->connector->sql->begin_transaction(); - - try{ - - $mode = $this->status_to_mode($action->get_status()); - if (!$this->connector->access->check($mode)){ - LogMaster::log("Access control: {$operation} operation blocked"); - $action->error(); - } else { - $check = $this->connector->event->trigger("beforeProcessing",$action); - if (!$action->is_ready()) - $this->check_exts($action,$mode); - $check = $this->connector->event->trigger("afterProcessing",$action); - } - - } catch (Exception $e){ - $action->set_status("error"); - } - - if ($this->connector->sql->is_record_transaction()){ - if ($action->get_status()=="error" || $action->get_status()=="invalid") - $this->connector->sql->rollback_transaction(); - else - $this->connector->sql->commit_transaction(); - } - - return $action; - } - /*! check if some event intercepts processing, send data to DataWrapper in other case - - @param action - DataAction object - @param mode - name of inner mode ( will be used to generate event names ) - */ - function check_exts($action,$mode){ - $old_config = new DataConfig($this->config); - - $this->connector->event->trigger("before".$mode,$action); - if ($action->is_ready()) - LogMaster::log("Event code for ".$mode." processed"); - else { - //check if custom sql defined - $sql = $this->connector->sql->get_sql($mode,$action); - if ($sql) - $this->connector->sql->query($sql); - else{ - $action->sync_config($this->config); - $method=array($this->connector->sql,$mode); - if (!is_callable($method)) - throw new Exception("Unknown dataprocessing action: ".$mode); - call_user_func($method,$action,$this->request); - } - } - $this->connector->event->trigger("after".$mode,$action); - - $this->config = $old_config; - } - - /*! output xml response for dataprocessor - - @param results - array of DataAction objects - */ - function output_as_xml($results){ - LogMaster::log("Edit operation finished",$results); - ob_clean(); - header("Content-type:text/xml"); - echo ""; - echo ""; - for ($i=0; $i < sizeof($results); $i++) - echo $results[$i]->to_xml(); - echo ""; - } - -} - -/*! contain all info related to action and controls customizaton -**/ -class DataAction{ - private $status; //!< cuurent status of record - private $id;//!< id of record - private $data;//!< data hash of record - private $userdata;//!< hash of extra data , attached to record - private $nid;//!< new id value , after operation executed - private $output;//!< custom output to client side code - private $attrs;//!< hash of custtom attributes - private $ready;//!< flag of operation's execution - private $addf;//!< array of added fields - private $delf;//!< array of deleted fields - - - /*! constructor - - @param status - current operation status - @param id - record id - @param data - hash of data - */ - function __construct($status,$id,$data){ - $this->status=$status; - $this->id=$id; - $this->data=$data; - $this->nid=$id; - - $this->output=""; - $this->attrs=array(); - $this->ready=false; - - $this->addf=array(); - $this->delf=array(); - } - - - /*! add custom field and value to DB operation - - @param name - name of field which will be added to DB operation - @param value - value which will be used for related field in DB operation - */ - function add_field($name,$value){ - LogMaster::log("adding field: ".$name.", with value: ".$value); - $this->data[$name]=$value; - $this->addf[]=$name; - } - /*! remove field from DB operation - - @param name - name of field which will be removed from DB operation - */ - function remove_field($name){ - LogMaster::log("removing field: ".$name); - $this->delf[]=$name; - } - - /*! sync field configuration with external object - - @param slave - SQLMaster object - @todo - check , if all fields removed then cancel action - */ - function sync_config($slave){ - foreach ($this->addf as $k => $v) - $slave->add_field($v); - foreach ($this->delf as $k => $v) - $slave->remove_field($v); - } - /*! get value of some record's propery - - @param name - name of record's property ( name of db field or alias ) - @return - value of related property - */ - function get_value($name){ - if (!array_key_exists($name,$this->data)){ - LogMaster::log("Incorrect field name used: ".$name); - LogMaster::log("data",$this->data); - return ""; - } - return $this->data[$name]; - } - /*! set value of some record's propery - - @param name - name of record's property ( name of db field or alias ) - @param value - value of related property - */ - function set_value($name,$value){ - LogMaster::log("change value of: ".$name." as: ".$value); - $this->data[$name]=$value; - } - /*! get hash of data properties - - @return - hash of data properties - */ - function get_data(){ - return $this->data; - } - /*! get some extra info attached to record - deprecated, exists just for backward compatibility, you can use set_value instead of it - @param name - name of userdata property - @return - value of related userdata property - */ - function get_userdata_value($name){ - return $this->get_value($name); - } - /*! set some extra info attached to record - deprecated, exists just for backward compatibility, you can use get_value instead of it - @param name - name of userdata property - @param value - value of userdata property - */ - function set_userdata_value($name,$value){ - return $this->set_value($name,$value); - } - /*! get current status of record - - @return - string with status value - */ - function get_status(){ - return $this->status; - } - /*! assign new status to the record - - @param status - new status value - */ - function set_status($status){ - $this->status=$status; - } - /*! get id of current record - - @return - id of record - */ - function get_id(){ - return $this->id; - } - /*! sets custom response text - - can be accessed through defineAction on client side. Text wrapped in CDATA, so no extra escaping necessary - @param text - custom response text - */ - function set_response_text($text){ - $this->set_response_xml(""); - } - /*! sets custom response xml - - can be accessed through defineAction on client side - @param text - string with XML data - */ - function set_response_xml($text){ - $this->output=$text; - } - /*! sets custom response attributes - - can be accessed through defineAction on client side - @param name - name of custom attribute - @param value - value of custom attribute - */ - function set_response_attribute($name,$value){ - $this->attrs[$name]=$value; - } - /*! check if action finished - - @return - true if action finished, false otherwise - */ - function is_ready(){ - return $this->ready; - } - /*! return new id value - - equal to original ID normally, after insert operation - value assigned for new DB record - @return - new id value - */ - function get_new_id(){ - return $this->nid; - } - - /*! set result of operation as error - */ - function error(){ - $this->status="error"; - $this->ready=true; - } - /*! set result of operation as invalid - */ - function invalid(){ - $this->status="invalid"; - $this->ready=true; - } - /*! confirm successful opeation execution - @param id - new id value, optional - */ - function success($id=false){ - if ($id!==false) - $this->nid = $id; - $this->ready=true; - } - /*! convert DataAction to xml format compatible with client side dataProcessor - @return - DataAction operation report as XML string - */ - function to_xml(){ - $str="attrs as $k => $v) { - $str.=$k."='".$v."' "; - } - $str.=">{$this->output}"; - return $str; - } - /*! convert self to string ( for logs ) - - @return - DataAction operation report as plain string - */ - function __toString(){ - return "action:{$this->status}; sid:{$this->id}; tid:{$this->nid};"; - } - - -} - - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php deleted file mode 100644 index 7ef239c0488..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_common.php +++ /dev/null @@ -1,959 +0,0 @@ -copy($proto); - else{ - $start=0; - $this->filters=array(); - $this->sort_by=array(); - } - } - - /*! copy parameters of source object into self - - @param proto - source object - */ - public function copy($proto){ - $this->filters =$proto->get_filters(); - $this->sort_by =$proto->get_sort_by(); - $this->count =$proto->get_count(); - $this->start =$proto->get_start(); - $this->source =$proto->get_source(); - $this->fieldset =$proto->get_fieldset(); - $this->relation =$proto->get_relation(); - $this->user = $proto->user; - $this->version = $proto->version; - } - - /*! convert self to string ( for logs ) - @return - self as plain string, - */ - public function __toString(){ - $str="Source:{$this->source}\nFieldset:{$this->fieldset}\nWhere:"; - for ($i=0; $i < sizeof($this->filters); $i++) - $str.=$this->filters[$i]["name"]." ".$this->filters[$i]["operation"]." ".$this->filters[$i]["value"].";"; - $str.="\nStart:{$this->start}\nCount:{$this->count}\n"; - for ($i=0; $i < sizeof($this->sort_by); $i++) - $str.=$this->sort_by[$i]["name"]."=".$this->sort_by[$i]["direction"].";"; - $str.="\nRelation:{$this->relation}"; - return $str; - } - - /*! returns set of filtering rules - @return - set of filtering rules - */ - public function get_filters(){ - return $this->filters; - } - public function &get_filters_ref(){ - return $this->filters; - } - public function set_filters($data){ - $this->filters=$data; - } - - - public function get_user(){ - return $this->user; - } - public function set_user($user){ - $this->user = $user; - } - public function get_version(){ - return $this->version; - } - public function set_version($version){ - $this->version = $version; - } - - /*! returns list of used fields - @return - list of used fields - */ - public function get_fieldset(){ - return $this->fieldset; - } - /*! returns name of source table - @return - name of source table - */ - public function get_source(){ - return $this->source; - } - /*! returns set of sorting rules - @return - set of sorting rules - */ - public function get_sort_by(){ - return $this->sort_by; - } - public function &get_sort_by_ref(){ - return $this->sort_by; - } - public function set_sort_by($data){ - $this->sort_by=$data; - } - - /*! returns start index - @return - start index - */ - public function get_start(){ - return $this->start; - } - /*! returns count of requested records - @return - count of requested records - */ - public function get_count(){ - return $this->count; - } - /*! returns name of relation id - @return - relation id name - */ - public function get_relation(){ - return $this->relation; - } - - /*! sets sorting rule - - @param field - name of column - @param order - direction of sorting - */ - public function set_sort($field,$order=false){ - if (!$field && !$order) - $this->sort_by=array(); - else{ - $order=strtolower($order)=="asc"?"ASC":"DESC"; - $this->sort_by[]=array("name"=>$field,"direction" => $order); - } - } - /*! sets filtering rule - - @param field - name of column - @param value - value for filtering - @param operation - operation for filtering, optional , LIKE by default - */ - public function set_filter($field,$value,$operation=false){ - array_push($this->filters,array("name"=>$field,"value"=>$value,"operation"=>$operation)); - } - - /*! sets list of used fields - - @param value - list of used fields - */ - public function set_fieldset($value){ - $this->fieldset=$value; - } - /*! sets name of source table - - @param value - name of source table - */ - public function set_source($value){ - $this->source=trim($value); - if (!$this->source) throw new Exception("Source of data can't be empty"); - } - /*! sets data limits - - @param start - start index - @param count - requested count of data - */ - public function set_limit($start,$count){ - $this->start=$start; - $this->count=$count; - } - /*! sets name of relation id - - @param value - name of relation id field - */ - public function set_relation($value){ - $this->relation=$value; - } - /*! parse incoming sql, to fill other properties - - @param sql - incoming sql string - */ - public function parse_sql($sql){ - $sql= preg_replace("/[ \n\t]+limit[\n ,0-9]/i","",$sql); - - $data = preg_split("/[ \n\t]+\\_from\\_/i",$sql,2); - if (count($data)!=2) - $data = preg_split("/[ \n\t]+from/i",$sql,2); - $this->fieldset = preg_replace("/^[\s]*select/i","",$data[0],1); - - $table_data = preg_split("/[ \n\t]+where/i",$data[1],2); - if (sizeof($table_data)>1){ //where construction exists - $this->set_source($table_data[0]); - $where_data = preg_split("/[ \n\t]+order[ ]+by/i",$table_data[1],2); - $this->filters[]=$where_data[0]; - if (sizeof($where_data)==1) return; //end of line detected - $data=$where_data[1]; - } else { - $table_data = preg_split("/[ \n\t]+order[ ]+by/i",$table_data[0],2); - $this->set_source($table_data[0]); - if (sizeof($table_data)==1) return; //end of line detected - $data=$table_data[1]; - } - - if (trim($data)){ //order by construction exists - $s_data = preg_split("/\\,/",trim($data)); - for ($i=0; $i < count($s_data); $i++) { - $data=preg_split("/[ ]+/",trim($s_data[$i]),2); - $this->set_sort($data[0],$data[1]); - } - - } - } -} - -/*! manager of data configuration -**/ -class DataConfig{ - public $id;////!< name of ID field - public $relation_id;//!< name or relation ID field - public $text;//!< array of text fields - public $data;//!< array of all known fields , fields which exists only in this collection will not be included in dataprocessor's operations - - - /*! converts self to the string, for logging purposes - **/ - public function __toString(){ - $str="ID:{$this->id['db_name']}(ID:{$this->id['name']})\n"; - $str.="Relation ID:{$this->relation_id['db_name']}({$this->relation_id['name']})\n"; - $str.="Data:"; - for ($i=0; $itext); $i++) - $str.="{$this->text[$i]['db_name']}({$this->text[$i]['name']}),"; - - $str.="\nExtra:"; - for ($i=0; $idata); $i++) - $str.="{$this->data[$i]['db_name']}({$this->data[$i]['name']}),"; - - return $str; - } - - /*! removes un-used fields from configuration - @param name - name of field , which need to be preserved - */ - public function minimize($name){ - for ($i=0; $i < sizeof($this->text); $i++){ - if ($this->text[$i]["name"]==$name){ - $this->text[$i]["name"]="value"; - $this->data=array($this->text[$i]); - $this->text=array($this->text[$i]); - return; - } - } - throw new Exception("Incorrect dataset minimization, master field not found."); - } - - public function limit_fields($data){ - if (isset($this->full_field_list)) - $this->restore_fields(); - $this->full_field_list = $this->text; - $this->text = array(); - - for ($i=0; $i < sizeof($this->full_field_list); $i++) { - if (array_key_exists($this->full_field_list[$i]["name"],$data)) - $this->text[] = $this->full_field_list[$i]; - } - } - - public function restore_fields(){ - if (isset($this->full_field_list)) - $this->text = $this->full_field_list; - } - - /*! initialize inner state by parsing configuration parameters - - @param id - name of id field - @param fields - name of data field(s) - @param extra - name of extra field(s) - @param relation - name of relation field - - */ - public function init($id,$fields,$extra,$relation){ - $this->id = $this->parse($id,false); - $this->text = $this->parse($fields,true); - $this->data = array_merge($this->text,$this->parse($extra,true)); - $this->relation_id = $this->parse($relation,false); - } - - /*! parse configuration string - - @param key - key string from configuration - @param mode - multi names flag - @return - parsed field name object - */ - private function parse($key,$mode){ - if ($mode){ - if (!$key) return array(); - $key=explode(",",$key); - for ($i=0; $i < sizeof($key); $i++) - $key[$i]=$this->parse($key[$i],false); - return $key; - } - $key=explode("(",$key); - $data=array("db_name"=>trim($key[0]), "name"=>trim($key[0])); - if (sizeof($key)>1) - $data["name"]=substr(trim($key[1]),0,-1); - return $data; - } - - /*! constructor - init public collectons - @param proto - DataConfig object used as prototype for new one, optional - */ - public function __construct($proto=false){ - if ($proto!==false) - $this->copy($proto); - else { - $this->text=array(); - $this->data=array(); - $this->id=array("name"=>"dhx_auto_id", "db_name"=>"dhx_auto_id"); - $this->relation_id=array("name"=>"", "db_name"=>""); - } - } - - /*! copy properties from source object - - @param proto - source object - */ - public function copy($proto){ - $this->id = $proto->id; - $this->relation_id = $proto->relation_id; - $this->text = $proto->text; - $this->data = $proto->data; - } - - /*! returns list of data fields (db_names) - @return - list of data fields ( ready to be used in SQL query ) - */ - public function db_names_list($db){ - $out=array(); - if ($this->id["db_name"]) - array_push($out,$db->escape_name($this->id["db_name"])); - if ($this->relation_id["db_name"]) - array_push($out,$db->escape_name($this->relation_id["db_name"])); - - for ($i=0; $i < sizeof($this->data); $i++){ - if ($this->data[$i]["db_name"]!=$this->data[$i]["name"]) - $out[]=$db->escape_name($this->data[$i]["db_name"])." as ".$this->data[$i]["name"]; - else - $out[]=$db->escape_name($this->data[$i]["db_name"]); - } - - return $out; - } - - /*! add field to dataset config ($text collection) - - added field will be used in all auto-generated queries - @param name - name of field - @param aliase - aliase of field, optional - */ - public function add_field($name,$aliase=false){ - if ($aliase===false) $aliase=$name; - - //adding to list of data-active fields - if ($this->id["db_name"]==$name || $this->relation_id["db_name"] == $name){ - LogMaster::log("Field name already used as ID, be sure that it is really necessary."); - } - if ($this->is_field($name,$this->text)!=-1) - throw new Exception('Data field already registered: '.$name); - array_push($this->text,array("db_name"=>$name,"name"=>$aliase)); - - //adding to list of all fields as well - if ($this->is_field($name,$this->data)==-1) - array_push($this->data,array("db_name"=>$name,"name"=>$aliase)); - - } - - /*! remove field from dataset config ($text collection) - - removed field will be excluded from all auto-generated queries - @param name - name of field, or aliase of field - */ - public function remove_field($name){ - $ind = $this->is_field($name); - if ($ind==-1) throw new Exception('There was no such data field registered as: '.$name); - array_splice($this->text,$ind,1); - //we not deleting field from $data collection, so it will not be included in data operation, but its data still available - } - - /*! check if field is a part of dataset - - @param name - name of field - @param collection - collection, against which check will be done, $text collection by default - @return - returns true if field already a part of dataset, otherwise returns true - */ - private function is_field($name,$collection = false){ - if (!$collection) - $collection=$this->text; - - for ($i=0; $iconfig=$config; - $this->connection=$connection; - } - - /*! insert record in storage - - @param data - DataAction object - @param source - DataRequestConfig object - */ - abstract function insert($data,$source); - - /*! delete record from storage - - @param data - DataAction object - @param source - DataRequestConfig object - */ - abstract function delete($data,$source); - - /*! update record in storage - - @param data - DataAction object - @param source - DataRequestConfig object - */ - abstract function update($data,$source); - - /*! select record from storage - - @param source - DataRequestConfig object - */ - abstract function select($source); - - /*! get size of storage - - @param source - DataRequestConfig object - */ - abstract function get_size($source); - - /*! get all variations of field in storage - - @param name - name of field - @param source - DataRequestConfig object - */ - abstract function get_variants($name,$source); - - /*! checks if there is a custom sql string for specified db operation - - @param name - name of DB operation - @param data - hash of data - @return - sql string - */ - public function get_sql($name,$data){ - return ""; //custom sql not supported by default - } - - /*! begins DB transaction - */ - public function begin_transaction(){ - throw new Exception("Data wrapper not supports transactions."); - } - /*! commits DB transaction - */ - public function commit_transaction(){ - throw new Exception("Data wrapper not supports transactions."); - } - /*! rollbacks DB transaction - */ - public function rollback_transaction(){ - throw new Exception("Data wrapper not supports transactions."); - } -} - -/*! Common database abstraction class - Class provides base set of methods to access and change data in DB, class used as a base for DB-specific wrappers -**/ -abstract class DBDataWrapper extends DataWrapper{ - private $transaction = false; //!< type of transaction - private $sequence=false;//!< sequence name - private $sqls = array();//!< predefined sql actions - - - /*! assign named sql query - @param name - name of sql query - @param data - sql query text - */ - public function attach($name,$data){ - $name=strtolower($name); - $this->sqls[$name]=$data; - } - /*! replace vars in sql string with actual values - - @param matches - array of field name matches - @return - value for the var name - */ - public function get_sql_callback($matches){ - return $this->escape($this->temp->get_value($matches[1])); - } - public function get_sql($name,$data){ - $name=strtolower($name); - if (!array_key_exists($name,$this->sqls)) return ""; - - - $str = $this->sqls[$name]; - $this->temp = $data; //dirty - $str = preg_replace_callback('|\{([^}]+)\}|',array($this,"get_sql_callback"),$str); - unset ($this->temp); //dirty - return $str; - } - - public function insert($data,$source){ - $sql=$this->insert_query($data,$source); - $this->query($sql); - $data->success($this->get_new_id()); - } - public function delete($data,$source){ - $sql=$this->delete_query($data,$source); - $this->query($sql); - $data->success(); - } - public function update($data,$source){ - $sql=$this->update_query($data,$source); - $this->query($sql); - $data->success(); - } - public function select($source){ - $select=$source->get_fieldset(); - if (!$select){ - $select=$this->config->db_names_list($this); - $select = implode(",",$select); - } - - $where=$this->build_where($source->get_filters(),$source->get_relation()); - $sort=$this->build_order($source->get_sort_by()); - - return $this->query($this->select_query($select,$source->get_source(),$where,$sort,$source->get_start(),$source->get_count())); - } - public function get_size($source){ - $count = new DataRequestConfig($source); - - $count->set_fieldset("COUNT(*) as DHX_COUNT "); - $count->set_sort(null); - $count->set_limit(0,0); - - $res=$this->select($count); - $data=$this->get_next($res); - if (array_key_exists("DHX_COUNT",$data)) return $data["DHX_COUNT"]; - else return $data["dhx_count"]; //postgresql - } - public function get_variants($name,$source){ - $count = new DataRequestConfig($source); - $count->set_fieldset("DISTINCT ".$this->escape_name($name)." as value"); - $count->set_sort(null); - $count->set_limit(0,0); - - return $this->select($count); - } - - public function sequence($sec){ - $this->sequence=$sec; - } - - - /*! create an sql string for filtering rules - - @param rules - set of filtering rules - @param relation - name of relation id field - @return - sql string with filtering rules - */ - protected function build_where($rules,$relation=false){ - $sql=array(); - for ($i=0; $i < sizeof($rules); $i++) - if (is_string($rules[$i])) - array_push($sql,$rules[$i]); - else - if ($rules[$i]["value"]!=""){ - if (!$rules[$i]["operation"]) - array_push($sql,$this->escape_name($rules[$i]["name"])." LIKE '%".$this->escape($rules[$i]["value"])."%'"); - else - array_push($sql,$this->escape_name($rules[$i]["name"])." ".$rules[$i]["operation"]." '".$this->escape($rules[$i]["value"])."'"); - } - if ($relation!==false) - array_push($sql,$this->escape_name($this->config->relation_id["db_name"])." = '".$this->escape($relation)."'"); - return implode(" AND ",$sql); - } - /*! convert sorting rules to sql string - - @param by - set of sorting rules - @return - sql string for set of sorting rules - */ - protected function build_order($by){ - if (!sizeof($by)) return ""; - $out = array(); - for ($i=0; $i < sizeof($by); $i++) - if ($by[$i]["name"]) - $out[]=$this->escape_name($by[$i]["name"])." ".$by[$i]["direction"]; - return implode(",",$out); - } - - /*! generates sql code for select operation - - @param select - list of fields in select - @param from - table name - @param where - list of filtering rules - @param sort - list of sorting rules - @param start - start index of fetching - @param count - count of records to fetch - @return - sql string for select operation - */ - protected function select_query($select,$from,$where,$sort,$start,$count){ - $sql="SELECT ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - if ($start || $count) $sql.=" LIMIT ".$start.",".$count; - return $sql; - } - /*! generates update sql - - @param data - DataAction object - @param request - DataRequestConfig object - @return - sql string, which updates record with provided data - */ - protected function update_query($data,$request){ - $sql="UPDATE ".$request->get_source()." SET "; - $temp=array(); - for ($i=0; $i < sizeof($this->config->text); $i++) { - $step=$this->config->text[$i]; - - if ($data->get_value($step["name"])===Null) - $step_value ="Null"; - else - $step_value = "'".$this->escape($data->get_value($step["name"]))."'"; - $temp[$i]= $this->escape_name($step["db_name"])."=". $step_value; - } - if ($relation = $this->config->relation_id["db_name"]){ - $temp[]= $this->escape_name($relation)."='".$this->escape($data->get_value($relation))."'"; - } - $sql.=implode(",",$temp)." WHERE ".$this->escape_name($this->config->id["db_name"])."='".$this->escape($data->get_id())."'"; - - //if we have limited set - set constraints - $where=$this->build_where($request->get_filters(),$request->get_relation()); - if ($where) $sql.=" AND (".$where.")"; - - return $sql; - } - - /*! generates delete sql - - @param data - DataAction object - @param request - DataRequestConfig object - @return - sql string, which delete record - */ - protected function delete_query($data,$request){ - $sql="DELETE FROM ".$request->get_source(); - $sql.=" WHERE ".$this->escape_name($this->config->id["db_name"])."='".$this->escape($data->get_id())."'"; - - //if we have limited set - set constraints - $where=$this->build_where($request->get_filters(),$request->get_relation()); - if ($where) $sql.=" AND (".$where.")"; - - return $sql; - } - - /*! generates insert sql - - @param data - DataAction object - @param request - DataRequestConfig object - @return - sql string, which inserts new record with provided data - */ - protected function insert_query($data,$request){ - $temp_n=array(); - $temp_v=array(); - foreach($this->config->text as $k => $v){ - $temp_n[$k]=$this->escape_name($v["db_name"]); - if ($data->get_value($v["name"])===Null) - $temp_v[$k]="Null"; - else - $temp_v[$k]="'".$this->escape($data->get_value($v["name"]))."'"; - } - if ($relation = $this->config->relation_id["db_name"]){ - $temp_n[]=$this->escape_name($relation); - $temp_v[]="'".$this->escape($data->get_value($relation))."'"; - } - if ($this->sequence){ - $temp_n[]=$this->escape_name($this->config->id["db_name"]); - $temp_v[]=$this->sequence; - } - - $sql="INSERT INTO ".$request->get_source()."(".implode(",",$temp_n).") VALUES (".implode(",",$temp_v).")"; - - return $sql; - } - - /*! sets the transaction mode, used by dataprocessor - - @param mode - mode name - */ - public function set_transaction_mode($mode){ - if ($mode!="none" && $mode!="global" && $mode!="record") - throw new Exception("Unknown transaction mode"); - $this->transaction=$mode; - } - /*! returns true if global transaction mode was specified - @return - true if global transaction mode was specified - */ - public function is_global_transaction(){ - return $this->transaction == "global"; - } - /*! returns true if record transaction mode was specified - @return - true if record transaction mode was specified - */ - public function is_record_transaction(){ - return $this->transaction == "record"; - } - - - public function begin_transaction(){ - $this->query("BEGIN"); - } - public function commit_transaction(){ - $this->query("COMMIT"); - } - public function rollback_transaction(){ - $this->query("ROLLBACK"); - } - - /*! exec sql string - - @param sql - sql string - @return - sql result set - */ - abstract protected function query($sql); - /*! returns next record from result set - - @param res - sql result set - @return - hash of data - */ - abstract public function get_next($res); - /*! returns new id value, for newly inserted row - @return - new id value, for newly inserted row - */ - abstract protected function get_new_id(); - /*! escape data to prevent sql injections - @param data - unescaped data - @return - escaped data - */ - abstract public function escape($data); - - /*! escape field name to prevent sql reserved words conflict - @param data - unescaped data - @return - escaped data - */ - public function escape_name($data){ - return $data; - } - - /*! get list of tables in the database - - @return - array of table names - */ - public function tables_list() { - throw new Exception("Not implemented"); - } - - /*! returns list of fields for the table in question - - @param table - name of table in question - @return - array of field names - */ - public function fields_list($table) { - throw new Exception("Not implemented"); - } - -} -/*! Implementation of DataWrapper for MySQL -**/ -class MySQLDBDataWrapper extends DBDataWrapper{ - protected $last_result; - public function query($sql){ - LogMaster::log($sql); - $res=mysql_query($sql,$this->connection); - if ($res===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); - $this->last_result = $res; - return $res; - } - - public function get_next($res){ - if (!$res) - $res = $this->last_result; - - return mysql_fetch_assoc($res); - } - - protected function get_new_id(){ - return mysql_insert_id($this->connection); - } - - public function escape($data){ - return mysql_real_escape_string($data); - } - - public function tables_list() { - $result = mysql_query("SHOW TABLES"); - if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); - - $tables = array(); - while ($table = mysql_fetch_array($result)) { - $tables[] = $table[0]; - } - return $tables; - } - - public function fields_list($table) { - $result = mysql_query("SHOW COLUMNS FROM `".$table."`"); - if ($result===false) throw new Exception("MySQL operation failed\n".mysql_error($this->connection)); - - $fields = array(); - $id = ""; - while ($field = mysql_fetch_assoc($result)) { - if ($field['Key'] == "PRI") - $id = $field["Field"]; - else - $fields[] = $field["Field"]; - } - return array("fields" => $fields, "key" => $id ); - } - - /*! escape field name to prevent sql reserved words conflict - @param data - unescaped data - @return - escaped data - */ - public function escape_name($data){ - if ((strpos($data,"`")!==false || intval($data)==$data) || (strpos($data,".")!==false)) - return $data; - return '`'.$data.'`'; - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php deleted file mode 100644 index 4cad2217878..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mssql.php +++ /dev/null @@ -1,66 +0,0 @@ -connection); - if ($this->insert_operation){ - $last = mssql_fetch_assoc($res); - $this->last_id = $last["dhx_id"]; - mssql_free_result($res); - } - if ($this->start_from) - mssql_data_seek($res,$this->start_from); - return $res; - } - - public function get_next($res){ - return mssql_fetch_assoc($res); - } - - protected function get_new_id(){ - /* - MSSQL doesn't support identity or auto-increment fields - Insert SQL returns new ID value, which stored in last_id field - */ - return $this->last_id; - } - - protected function insert_query($data,$request){ - $sql = parent::insert_query($data,$request); - $this->insert_operation=true; - return $sql.";SELECT @@IDENTITY AS dhx_id"; - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - $sql="SELECT " ; - if ($count) - $sql.=" TOP ".($count+$start); - $sql.=" ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - if ($start && $count) - $this->start_from=$start; - else - $this->start_from=false; - return $sql; - } - - public function escape($data){ - /* - there is no special escaping method for mssql - use common logic - */ - return str_replace("'","''",$data); - } - - public function begin_transaction(){ - $this->query("BEGIN TRAN"); - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php deleted file mode 100644 index a33ca71bbe4..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_mysqli.php +++ /dev/null @@ -1,53 +0,0 @@ -connection->query($sql); - if ($res===false) throw new Exception("MySQL operation failed\n".$this->connection->error); - return $res; - } - - public function get_next($res){ - return $res->fetch_assoc(); - } - - protected function get_new_id(){ - return $this->connection->insert_id; - } - - public function escape($data){ - return $this->connection->real_escape_string($data); - } - - public function tables_list() { - $result = $this->connection->query("SHOW TABLES"); - if ($result===false) throw new Exception("MySQL operation failed\n".$this->connection->error); - - $tables = array(); - while ($table = $result->fetch_array()) { - $tables[] = $table[0]; - } - return $tables; - } - - public function fields_list($table) { - $result = $this->connection->query("SHOW COLUMNS FROM `".$table."`"); - if ($result===false) throw new Exception("MySQL operation failed\n".$this->connection->error); - $fields = array(); - while ($field = $result->fetch_array()) { - if ($field['Key'] == "PRI") { - $fields[$field[0]] = 1; - } else { - $fields[$field[0]] = 0; - } - } - return $fields; - } - -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php deleted file mode 100644 index 46c3e88bebe..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_oracle.php +++ /dev/null @@ -1,79 +0,0 @@ -connection,$sql); - if ($stm===false) throw new Exception("Oracle - sql parsing failed\n".oci_error($this->connection)); - - $out = array(0=>null); - if($this->insert_operation){ - oci_bind_by_name($stm,":outID",$out[0],999); - $this->insert_operation=false; - } - - - $mode = ($this->is_record_transaction() || $this->is_global_transaction())?OCI_DEFAULT:OCI_COMMIT_ON_SUCCESS; - $res=oci_execute($stm,$mode); - if ($res===false) throw new Exception("Oracle - sql execution failed\n".oci_error($this->connection)); - - $this->last_id=$out[0]; - - return $stm; - } - - public function get_next($res){ - $data = oci_fetch_assoc($res); - if (array_key_exists("VALUE",$data)) - $data["value"]=$data["VALUE"]; - return $data; - } - - protected function get_new_id(){ - /* - Oracle doesn't support identity or auto-increment fields - Insert SQL returns new ID value, which stored in last_id field - */ - return $this->last_id; - } - - protected function insert_query($data,$request){ - $sql = parent::insert_query($data,$request); - $this->insert_operation=true; - return $sql." returning ".$this->config->id["db_name"]." into :outID"; - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - $sql="SELECT ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - if ($start || $count) - $sql="SELECT * FROM ( select /*+ FIRST_ROWS(".$count.")*/dhx_table.*, ROWNUM rnum FROM (".$sql.") dhx_table where ROWNUM <= ".($count+$start)." ) where rnum >".$start; - return $sql; - } - - public function escape($data){ - /* - as far as I can see the only way to escape data is by using oci_bind_by_name - while it is neat solution in common case, it conflicts with existing SQL building logic - fallback to simple escaping - */ - return str_replace("'","''",$data); - } - - public function begin_transaction(){ - //auto-start of transaction - } - public function commit_transaction(){ - oci_commit($this->connection); - } - public function rollback_transaction(){ - oci_rollback($this->connection); - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php deleted file mode 100644 index 8fb6cf4578b..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_pdo.php +++ /dev/null @@ -1,65 +0,0 @@ -connection->query($sql); - if ($res===false) throw new Exception("PDO - sql execution failed\n".$this->connection->errorInfo()); - - return new PDOResultSet($res); - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - $sql="SELECT ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - if ($start || $count) { - if ($this->connection->getAttribute(PDO::ATTR_DRIVER_NAME)=="pgsql") - $sql.=" OFFSET ".$start." LIMIT ".$count; - else - $sql.=" LIMIT ".$start.",".$count; - } - return $sql; - } - - - public function get_next($res){ - $data = $res->next(); - return $data; - } - - protected function get_new_id(){ - return $this->connection->lastInsertId(); - } - - public function escape($str){ - $res=$this->connection->quote($str); - if ($res===false) //not supported by pdo driver - return str_replace("'","''",$str); - return substr($res,1,-1); - } - -} - -class PDOResultSet{ - private $res; - public function __construct($res){ - $this->res = $res; - } - public function next(){ - $data = $this->res->fetch(PDO::FETCH_ASSOC); - if (!$data){ - $this->res->closeCursor(); - return null; - } - return $data; - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php deleted file mode 100644 index 08f1b1aaa79..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/db_postgre.php +++ /dev/null @@ -1,66 +0,0 @@ -connection,$sql); - if ($res===false) throw new Exception("Postgre - sql execution failed\n".pg_last_error($this->connection)); - - return $res; - } - - protected function select_query($select,$from,$where,$sort,$start,$count){ - $sql="SELECT ".$select." FROM ".$from; - if ($where) $sql.=" WHERE ".$where; - if ($sort) $sql.=" ORDER BY ".$sort; - if ($start || $count) - $sql.=" OFFSET ".$start." LIMIT ".$count; - return $sql; - } - - public function get_next($res){ - return pg_fetch_assoc($res); - } - - protected function get_new_id(){ - $res = pg_query( $this->connection, "SELECT LASTVAL() AS seq"); - $data = pg_fetch_assoc($res); - pg_free_result($res); - return $data['seq']; - } - - public function escape($data){ - //need to use oci_bind_by_name - return pg_escape_string($this->connection,$data); - } - - public function tables_list() { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; - $res = pg_query($this->connection, $sql); - $tables = array(); - while ($table = pg_fetch_assoc($res)) { - $tables[] = $table['table_name']; - } - return $tables; - } - - public function fields_list($table) { - $sql = "SELECT * FROM information_schema.constraint_column_usage"; - $result = pg_query($this->connection, $sql); - $field = pg_fetch_assoc($result); - $id = $field['column_name']; - - $sql = "SELECT * FROM information_schema.columns WHERE table_name ='".$table."';"; - $result = pg_query($this->connection, $sql); - $fields = array(); - $id = ""; - while ($field = pg_fetch_assoc($result)) { - $fields[] = $field["column_name"]; - } - return array('fields' => $fields, 'key' => $id ); - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php deleted file mode 100644 index 5167528739f..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/grid_connector.php +++ /dev/null @@ -1,268 +0,0 @@ -row_attrs=array(); - $this->cell_attrs=array(); - $this->userdata=array(); - } - /*! set color of row - - @param color - color of row - */ - function set_row_color($color){ - $this->row_attrs["bgColor"]=$color; - } - /*! set style of row - - @param color - color of row - */ - function set_row_style($color){ - $this->row_attrs["style"]=$color; - } - /*! assign custom style to the cell - - @param name - name of column - @param value - css style string - */ - function set_cell_style($name,$value){ - $this->set_cell_attribute($name,"style",$value); - } - /*! assign custom class to specific cell - - @param name - name of column - @param value - css class name - */ - function set_cell_class($name,$value){ - $this->set_cell_attribute($name,"class",$value); - } - /*! set custom cell attribute - - @param name - name of column - @param attr - name of attribute - @param value - value of attribute - */ - function set_cell_attribute($name,$attr,$value){ - if (!$this->cell_attrs[$name]) $this->cell_attrs[$name]=array(); - $this->cell_attrs[$name][$attr]=$value; - } - - /*! set userdata section for the item - - @param name - name of userdata - @param value - value of userdata - */ - function set_userdata($name, $value){ - $this->userdata[$name]=$value; - } - - /*! set custom row attribute - - @param attr - name of attribute - @param value - value of attribute - */ - function set_row_attribute($attr,$value){ - $this->row_attrs[$attr]=$value; - } - - /*! return self as XML string, starting part - */ - public function to_xml_start(){ - if ($this->skip) return ""; - - $str="row_attrs as $k=>$v) - $str.=" ".$k."='".$v."'"; - $str.=">"; - for ($i=0; $i < sizeof($this->config->text); $i++){ - $str.="config->text[$i]["name"]; - if (isset($this->cell_attrs[$name])){ - $cattrs=$this->cell_attrs[$name]; - foreach ($cattrs as $k => $v) - $str.=" ".$k."='".$this->xmlentities($v)."'"; - } - $str.=">data[$name]."]]>"; - } - foreach ($this->userdata as $key => $value) - $str.=""; - - return $str; - } - /*! return self as XML string, ending part - */ - public function to_xml_end(){ - if ($this->skip) return ""; - - return ""; - } -} -/*! Connector for the dhtmlxgrid -**/ -class GridConnector extends Connector{ - protected $extra_output="";//!< extra info which need to be sent to client side - private $options=array();//!< hash of OptionsConnector - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param res - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="GridDataItem"; - if (!$data_type) $data_type="GridDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); - } - - - protected function parse_request(){ - parent::parse_request(); - - if (isset($_GET["dhx_colls"])) - $this->fill_collections($_GET["dhx_colls"]); - - if (isset($_GET["posStart"]) && isset($_GET["count"])) - $this->request->set_limit($_GET["posStart"],$_GET["count"]); - } - protected function resolve_parameter($name){ - if (intval($name).""==$name) - return $this->config->text[intval($name)]["db_name"]; - return $name; - } - - /*! replace xml unsafe characters - - @param string - string to be escaped - @return - escaped string - */ - private function xmlentities($string) { - return str_replace( array( '&', '"', "'", '<', '>', '’' ), array( '&' , '"', ''' , '<' , '>', ''' ), $string); - } - - /*! assign options collection to the column - - @param name - name of the column - @param options - array or connector object - */ - public function set_options($name,$options){ - if (is_array($options)){ - $str=""; - foreach($options as $k => $v) - $str.=""; - $options=$str; - } - $this->options[$name]=$options; - } - /*! generates xml description for options collections - - @param list - comma separated list of column names, for which options need to be generated - */ - protected function fill_collections($list){ - $names=explode(",",$list); - for ($i=0; $i < sizeof($names); $i++) { - $name = $this->resolve_parameter($names[$i]); - if (!array_key_exists($name,$this->options)){ - $this->options[$name] = new DistinctOptionsConnector($this->get_connection(),$this->names["db_class"]); - $c = new DataConfig($this->config); - $r = new DataRequestConfig($this->request); - $c->minimize($name); - - $this->options[$name]->render_connector($c,$r); - } - - $this->extra_output.=""; - if (!is_string($this->options[$name])) - $this->extra_output.=$this->options[$name]->render(); - else - $this->extra_output.=$this->options[$name]; - $this->extra_output.=""; - } - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - if ($this->dload){ - if ($pos=$this->request->get_start()) - return ""; - else - return ""; - } - else - return ""; - } - - - /*! renders self as xml, ending part - */ - protected function xml_end(){ - return $this->extra_output.""; - } - - public function set_config($config = false){ - if (gettype($config) == 'boolean') - $config = new GridConfiguration($config); - - $this->event->attach("beforeOutput", Array($config, "attachHeaderToXML")); - } -} - -/*! DataProcessor class for Grid component -**/ -class GridDataProcessor extends DataProcessor{ - - /*! convert incoming data name to valid db name - converts c0..cN to valid field names - @param data - data name from incoming request - @return - related db_name - */ - function name_data($data){ - if ($data == "gr_id") return $this->config->id["name"]; - $parts=explode("c",$data); - if ($parts[0]=="" && intval($parts[1])==$parts[1]) - return $this->config->text[intval($parts[1])]["name"]; - return $data; - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php deleted file mode 100644 index 82a1f4601e0..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/scheduler_connector.php +++ /dev/null @@ -1,121 +0,0 @@ -skip) return ""; - - $str=""; - $str.="data[$this->config->text[0]["name"]]."]]>"; - $str.="data[$this->config->text[1]["name"]]."]]>"; - $str.="data[$this->config->text[2]["name"]]."]]>"; - for ($i=3; $iconfig->text); $i++){ - $extra = $this->config->text[$i]["name"]; - $str.="<".$extra.">data[$extra]."]]>"; - } - return $str.""; - } -} - - -/*! Connector class for dhtmlxScheduler -**/ -class SchedulerConnector extends Connector{ - - protected $extra_output="";//!< extra info which need to be sent to client side - private $options=array();//!< hash of OptionsConnector - - - /*! assign options collection to the column - - @param name - name of the column - @param options - array or connector object - */ - public function set_options($name,$options){ - if (is_array($options)){ - $str=""; - foreach($options as $k => $v) - $str.=""; - $options=$str; - } - $this->options[$name]=$options; - } - /*! generates xml description for options collections - - @param list - comma separated list of column names, for which options need to be generated - */ - protected function fill_collections(){ - foreach ($this->options as $k=>$v) { - $name = $k; - $this->extra_output.=""; - if (!is_string($this->options[$name])) - $this->extra_output.=$this->options[$name]->render(); - else - $this->extra_output.=$this->options[$name]; - $this->extra_output.=""; - } - } - - /*! renders self as xml, ending part - */ - protected function xml_end(){ - $this->fill_collections(); - return $this->extra_output.""; - } - - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param res - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="SchedulerDataItem"; - if (!$data_type) $data_type="SchedulerDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); - } - - //parse GET scoope, all operations with incoming request must be done here - function parse_request(){ - parent::parse_request(); - if (count($this->config->text)){ - if (isset($_GET["to"])) - $this->request->set_filter($this->config->text[0]["name"],$_GET["to"],"<"); - if (isset($_GET["from"])) - $this->request->set_filter($this->config->text[1]["name"],$_GET["from"],">"); - } - } -} - -/*! DataProcessor class for Scheduler component -**/ -class SchedulerDataProcessor extends DataProcessor{ - function name_data($data){ - if ($data=="start_date") - return $this->config->text[0]["db_name"]; - if ($data=="id") - return $this->config->id["db_name"]; - if ($data=="end_date") - return $this->config->text[1]["db_name"]; - if ($data=="text") - return $this->config->text[2]["db_name"]; - - return $data; - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php deleted file mode 100644 index c5b92e6ab2b..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tools.php +++ /dev/null @@ -1,254 +0,0 @@ -events=array(); - } - /*! Method check if event with such name already exists. - @param name - name of event, case non-sensitive - @return - true if event with such name registered, false otherwise - */ - public function exist($name){ - $name=strtolower($name); - return (isset($this->events[$name]) && sizeof($this->events[$name])); - } - /*! Attach custom code to event. - - Only on event handler can be attached in the same time. If new event handler attached - old will be detached. - - @param name - name of event, case non-sensitive - @param method - function which will be attached. You can use array(class, method) if you want to attach the method of the class. - */ - public function attach($name,$method){ - $name=strtolower($name); - if (!array_key_exists($name,$this->events)) - $this->events[$name]=array(); - $this->events[$name][]=$method; - } - - public static function attach_static($name, $method){ - $name=strtolower($name); - if (!array_key_exists($name,EventMaster::$eventsStatic)) - EventMaster::$eventsStatic[$name]=array(); - EventMaster::$eventsStatic[$name][]=$method; - } - - public static function trigger_static($name, $method){ - $arg_list = func_get_args(); - $name=strtolower(array_shift($arg_list)); - - if (isset(EventMaster::$eventsStatic[$name])) - foreach(EventMaster::$eventsStatic[$name] as $method){ - if (is_array($method) && !method_exists($method[0],$method[1])) - throw new Exception("Incorrect method assigned to event: ".$method[0].":".$method[1]); - if (!is_array($method) && !function_exists($method)) - throw new Exception("Incorrect function assigned to event: ".$method); - call_user_func_array($method, $arg_list); - } - return true; - } - - /*! Detach code from event - @param name - name of event, case non-sensitive - */ - public function detach($name){ - $name=strtolower($name); - unset($this->events[$name]); - } - /*! Trigger event. - @param name - name of event, case non-sensitive - @param data - value which will be provided as argument for event function, - you can provide multiple data arguments, method accepts variable number of parameters - @return - true if event handler was not assigned , result of event hangler otherwise - */ - public function trigger($name,$data){ - $arg_list = func_get_args(); - $name=strtolower(array_shift($arg_list)); - - if (isset($this->events[$name])) - foreach($this->events[$name] as $method){ - if (is_array($method) && !method_exists($method[0],$method[1])) - throw new Exception("Incorrect method assigned to event: ".$method[0].":".$method[1]); - if (!is_array($method) && !function_exists($method)) - throw new Exception("Incorrect function assigned to event: ".$method); - call_user_func_array($method, $arg_list); - } - return true; - } -} - -/*! Class which handles access rules. -**/ -class AccessMaster{ - private $rules,$local; - /*! constructor - - Set next access right to "allowed" by default : read, insert, update, delete - Basically - all common data operations allowed by default - */ - function __construct(){ - $this->rules=array("read" => true, "insert" => true, "update" => true, "delete" => true); - $this->local=true; - } - /*! change access rule to "allow" - @param name - name of access right - */ - public function allow($name){ - $this->rules[$name]=true; - } - /*! change access rule to "deny" - - @param name - name of access right - */ - public function deny($name){ - $this->rules[$name]=false; - } - - /*! change all access rules to "deny" - */ - public function deny_all(){ - $this->rules=array(); - } - - /*! check access rule - - @param name - name of access right - @return - true if access rule allowed, false otherwise - */ - public function check($name){ - if ($this->local){ - /*! - todo - add referrer check, to prevent access from remote points - */ - } - if (!isset($this->rules[$name]) || !$this->rules[$name]){ - return false; - } - return true; - } -} - -/*! Controls error and debug logging. - Class designed to be used as static object. -**/ -class LogMaster{ - private static $_log=false;//!< logging mode flag - private static $_output=false;//!< output error infor to client flag - private static $session="";//!< all messages generated for current request - - /*! convert array to string representation ( it is a bit more readable than var_dump ) - - @param data - data object - @param pref - prefix string, used for formating, optional - @return - string with array description - */ - private static function log_details($data,$pref=""){ - if (is_array($data)){ - $str=array(""); - foreach($data as $k=>$v) - array_push($str,$pref.$k." => ".LogMaster::log_details($v,$pref."\t")); - return implode("\n",$str); - } - return $data; - } - /*! put record in log - - @param str - string with log info, optional - @param data - data object, which will be added to log, optional - */ - public static function log($str="",$data=""){ - if (LogMaster::$_log){ - $message = $str.LogMaster::log_details($data)."\n\n"; - LogMaster::$session.=$message; - error_log($message,3,LogMaster::$_log); - } - } - - /*! get logs for current request - @return - string, which contains all log messages generated for current request - */ - public static function get_session_log(){ - return LogMaster::$session; - } - - /*! error handler, put normal php errors in log file - - @param errn - error number - @param errstr - error description - @param file - error file - @param line - error line - @param context - error cntext - */ - public static function error_log($errn,$errstr,$file,$line,$context){ - LogMaster::log($errstr." at ".$file." line ".$line); - } - - /*! exception handler, used as default reaction on any error - show execution log and stop processing - - @param exception - instance of Exception - */ - public static function exception_log($exception){ - LogMaster::log("!!!Uncaught Exception\nCode: " . $exception->getCode() . "\nMessage: " . $exception->getMessage()); - if (LogMaster::$_output){ - echo "
\n";
-			echo LogMaster::get_session_log();
-			echo "\n
"; - } - die(); - } - - /*! enable logging - - @param name - path to the log file, if boolean false provided as value - logging will be disabled - @param output - flag of client side output, if enabled - session log will be sent to client side in case of an error. - */ - public static function enable_log($name,$output=false){ - LogMaster::$_log=$name; - LogMaster::$_output=$output; - if ($name){ - set_error_handler(array("LogMaster","error_log"),E_ALL); - set_exception_handler(array("LogMaster","exception_log")); - LogMaster::log("\n\n====================================\nLog started, ".date("d/m/Y h:m:s")."\n===================================="); - } - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php deleted file mode 100644 index 21886548d50..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/tree_connector.php +++ /dev/null @@ -1,274 +0,0 @@ -im0=false; - $this->im1=false; - $this->im2=false; - $this->check=false; - $this->attrs = array(); - $this->userdata = array(); - } - /*! get id of parent record - - @return - id of parent record - */ - function get_parent_id(){ - return $this->data[$this->config->relation_id["name"]]; - } - /*! get state of items checkbox - - @return - state of item's checkbox as int value, false if state was not defined - */ - function get_check_state(){ - return $this->check; - } - /*! set state of item's checkbox - - @param value - int value, 1 - checked, 0 - unchecked, -1 - third state - */ - function set_check_state($value){ - $this->check=$value; - } - - /*! return count of child items - -1 if there is no info about childs - @return - count of child items - */ - function has_kids(){ - return $this->kids; - } - /*! sets count of child items - @param value - count of child items - */ - function set_kids($value){ - $this->kids=$value; - } - - /*! set custom attribute - - @param name - name of the attribute - @param value - new value of the attribute - */ - function set_attribute($name, $value){ - switch($name){ - case "id": - $this->set_id($value); - break; - case "text": - $this->data[$this->config->text[0]["name"]]=$value; - break; - case "checked": - $this->set_check_state($value); - break; - case "im0": - $this->im0=$value; - break; - case "im1": - $this->im1=$value; - break; - case "im2": - $this->im2=$value; - break; - case "child": - $this->set_kids($value); - break; - default: - $this->attrs[$name]=$value; - } - } - - /*! set userdata section for the item - - @param name - name of userdata - @param value - value of userdata - */ - function set_userdata($name, $value){ - $this->userdata[$name]=$value; - } - - /*! assign image for tree's item - - @param img_folder_closed - image for item, which represents folder in closed state - @param img_folder_open - image for item, which represents folder in opened state, optional - @param img_leaf - image for item, which represents leaf item, optional - */ - function set_image($img_folder_closed,$img_folder_open=false,$img_leaf=false){ - $this->im0=$img_folder_closed; - $this->im1=$img_folder_open?$img_folder_open:$img_folder_closed; - $this->im2=$img_leaf?$img_leaf:$img_folder_closed; - } - /*! return self as XML string, starting part - */ - function to_xml_start(){ - if ($this->skip) return ""; - - $str1="has_kids()==true) $str1.="child='".$this->has_kids()."' "; - if ($this->im0) $str1.="im0='".$this->im0."' "; - if ($this->im1) $str1.="im1='".$this->im0."' "; - if ($this->im2) $str1.="im2='".$this->im0."' "; - if ($this->check) $str1.="checked='".$this->check."' "; - foreach ($this->attrs as $key => $value) - $str1.=$key."='".$this->xmlentities($value)."' "; - $str1.=">"; - foreach ($this->userdata as $key => $value) - $str1.=""; - - return $str1; - } - /*! return self as XML string, ending part - */ - function to_xml_end(){ - if ($this->skip) return ""; - return ""; - } - -} - -require_once("filesystem_item.php"); - -/*! Connector for the dhtmlxtree -**/ -class TreeConnector extends Connector{ - private $id_swap = array(); - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param res - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="TreeDataItem"; - if (!$data_type) $data_type="TreeDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); - - $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); - $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); - } - - /*! store info about ID changes during insert operation - @param dataAction - data action object during insert operation - */ - public function parent_id_correction_a($dataAction){ - $this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id(); - } - /*! update ID if it was affected by previous operation - @param dataAction - data action object, before any processing operation - */ - public function parent_id_correction_b($dataAction){ - $relation = $this->config->relation_id["db_name"]; - $value = $dataAction->get_value($relation); - - if (array_key_exists($value,$this->id_swap)) - $dataAction->set_value($relation,$this->id_swap[$value]); - } - - - public function parse_request(){ - parent::parse_request(); - - if (isset($_GET["id"])) - $this->request->set_relation($_GET["id"]); - else - $this->request->set_relation("0"); - - $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode - } - - - - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode juse exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - /*! renders self as xml, starting part - */ - public function xml_start(){ - return ""; - } - - /*! renders self as xml, ending part - */ - public function xml_end(){ - return ""; - } -} - - -class TreeDataProcessor extends DataProcessor{ - - function __construct($connector,$config,$request){ - parent::__construct($connector,$config,$request); - $request->set_relation(false); - } - - /*! convert incoming data name to valid db name - converts c0..cN to valid field names - @param data - data name from incoming request - @return - related db_name - */ - function name_data($data){ - if ($data=="tr_pid") - return $this->config->relation_id["db_name"]; - if ($data=="tr_text") - return $this->config->text[0]["db_name"]; - return $data; - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php deleted file mode 100644 index b410cb46527..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/treegrid_connector.php +++ /dev/null @@ -1,161 +0,0 @@ -im0=false; - } - /*! return id of parent record - - @return - id of parent record - */ - function get_parent_id(){ - return $this->data[$this->config->relation_id["name"]]; - } - /*! assign image to treegrid's item - longer description - @param img - relative path to the image - */ - function set_image($img){ - $this->set_cell_attribute($this->config->text[0]["name"],"image",$img); - } - - /*! return count of child items - -1 if there is no info about childs - @return - count of child items - */ - function has_kids(){ - return $this->kids; - } - /*! sets count of child items - @param value - count of child items - */ - function set_kids($value){ - $this->kids=$value; - if ($value) - $this->set_row_attribute("xmlkids",$value); - } -} -/*! Connector for dhtmlxTreeGrid -**/ -class TreeGridConnector extends GridConnector{ - private $id_swap = array(); - - /*! constructor - - Here initilization of all Masters occurs, execution timer initialized - @param res - db connection resource - @param type - string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided - @param item_type - name of class, which will be used for item rendering, optional, DataItem will be used by default - @param data_type - name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. - */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="TreeGridDataItem"; - if (!$data_type) $data_type="TreeGridDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); - - $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); - $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); - } - - /*! store info about ID changes during insert operation - @param dataAction - data action object during insert operation - */ - public function parent_id_correction_a($dataAction){ - $this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id(); - } - /*! update ID if it was affected by previous operation - @param dataAction - data action object, before any processing operation - */ - public function parent_id_correction_b($dataAction){ - $relation = $this->config->relation_id["db_name"]; - $value = $dataAction->get_value($relation); - - if (array_key_exists($value,$this->id_swap)) - $dataAction->set_value($relation,$this->id_swap[$value]); - } - - /*! process treegrid specific options in incoming request - */ - public function parse_request(){ - parent::parse_request(); - - if (isset($_GET["id"])) - $this->request->set_relation($_GET["id"]); - else - $this->request->set_relation("0"); - - $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode - } - - /*! process treegrid specific options in incoming request - */ - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode juse exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - - /*! renders self as xml, starting part - */ - protected function xml_start(){ - return ""; - } -} - -/*! DataProcessor class for Grid component -**/ -class TreeGridDataProcessor extends GridDataProcessor{ - - function __construct($connector,$config,$request){ - parent::__construct($connector,$config,$request); - $request->set_relation(false); - } - - /*! convert incoming data name to valid db name - converts c0..cN to valid field names - @param data - data name from incoming request - @return - related db_name - */ - function name_data($data){ - - if ($data=="gr_pid") - return $this->config->relation_id["name"]; - else return parent::name_data($data); - } -} -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php deleted file mode 100644 index 014a326b051..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/connector/update.php +++ /dev/null @@ -1,262 +0,0 @@ -config=$config; - $this->data=$data; - $this->index=$index; - $this->skip=false; - $this->child = new $type($data, $config, $index); - } - - /*! returns parent_id (for Tree and TreeGrid components) - */ - public function get_parent_id(){ - if (method_exists($this->child, 'get_parent_id')) { - return $this->child->get_parent_id(); - } else { - return ''; - } - } - - - /*! generate XML on the data hash base - */ - public function to_xml(){ - $str= "data['type'].'" '; - $str .= 'id="'.$this->data['dataId'].'" '; - $str .= 'parent="'.$this->get_parent_id().'"'; - $str .= '>'; - $str .= $this->child->to_xml(); - $str .= ''; - return $str; - } - - /*! return starting tag for XML string - */ - public function to_xml_start(){ - $str="data['type'].'" '; - $str .= 'id="'.$this->data['dataId'].'" '; - $str .= 'parent="'.$this->get_parent_id().'"'; - $str .= '>'; - $str .= $this->child->to_xml_start(); - return $str; - } - - /*! return ending tag for XML string - */ - public function to_xml_end(){ - $str = $this->child->to_xml_end(); - $str .= ''; - return $str; - } - - /*! returns false for outputing only current item without child items - */ - public function has_kids(){ - return false; - } - - /*! sets count of child items - @param value - count of child items - */ - public function set_kids($value){ - if (method_exists($this->child, 'set_kids')) { - $this->child->set_kids($value); - } - } - - /*! sets attribute for item - */ - public function set_attribute($name, $value){ - if (method_exists($this->child, 'set_attribute')) { - LogMaster::log("setting attribute: \nname = {$name}\nvalue = {$value}"); - $this->child->set_attribute($name, $value); - } else { - LogMaster::log("set_attribute method doesn't exists"); - } - } -} - - -class DataUpdate{ - - protected $table; //!< table , where actions are stored - protected $url; //!< url for notification service, optional - protected $sql; //!< DB wrapper object - protected $config; //!< DBConfig object - protected $request; //!< DBRequestConfig object - protected $event; - protected $item_class; - protected $demu; - - //protected $config;//!< DataConfig instance - //protected $request;//!< DataRequestConfig instance - - /*! constructor - - @param connector - Connector object - @param config - DataConfig object - @param request - DataRequestConfig object - */ - function __construct($sql, $config, $request, $table, $url){ - $this->config= $config; - $this->request= $request; - $this->sql = $sql; - $this->table=$table; - $this->url=$url; - $this->demu = false; - } - - public function set_demultiplexor($path){ - $this->demu = $path; - } - - public function set_event($master, $name){ - $this->event = $master; - $this->item_class = $name; - } - - private function select_update($actions_table, $join_table, $id_field_name, $version, $user) { - $sql = "SELECT * FROM {$actions_table}"; - $sql .= " LEFT OUTER JOIN {$join_table} ON "; - $sql .= "{$actions_table}.DATAID = {$join_table}.{$id_field_name} "; - $sql .= "WHERE {$actions_table}.ID > '{$version}' AND {$actions_table}.USER <> '{$user}'"; - return $sql; - } - - private function get_update_max_version() { - $sql = "SELECT MAX(id) as VERSION FROM {$this->table}"; - $res = $this->sql->query($sql); - $data = $this->sql->get_next($res); - - if ($data == false || $data['VERSION'] == false) - return 1; - else - return $data['VERSION']; - } - - private function log_update_action($actions_table, $dataId, $status, $user) { - $sql = "INSERT INTO {$actions_table} (DATAID, TYPE, USER) VALUES ('{$dataId}', '{$status}', '{$user}')"; - $this->sql->query($sql); - if ($this->demu) - file_get_contents($this->demu); - } - - - - - /*! records operations in actions_table - @param action - DataAction object - */ - public function log_operations($action) { - $type = $this->sql->escape($action->get_status()); - $dataId = $this->sql->escape($action->get_new_id()); - $user = $this->sql->escape($this->request->get_user()); - if ($type!="error" && $type!="invalid" && $type !="collision") { - $this->log_update_action($this->table, $dataId, $type, $user); - } - } - - - /*! return action version in XMl format - */ - public function get_version() { - $version = $this->get_update_max_version(); - return "".$version.""; - } - - - /*! adds action version in output XML as userdata - */ - public function version_output() { - echo $this->get_version(); - } - - - /*! create update actions in XML-format and sends it to output - */ - public function get_updates() { - $sub_request = new DataRequestConfig($this->request); - $version = $this->request->get_version(); - $user = $this->request->get_user(); - - $sub_request->parse_sql($this->select_update($this->table, $this->request->get_source(), $this->config->id['db_name'], $version, $user)); - $sub_request->set_relation(false); - - $output = $this->render_set($this->sql->select($sub_request), $this->item_class); - - ob_clean(); - header("Content-type:text/xml"); - - echo $this->updates_start(); - echo $this->get_version(); - echo $output; - echo $this->updates_end(); - } - - - protected function render_set($res, $name){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new DataItemUpdate($data,$this->config,$index, $name); - $this->event->trigger("beforeRender",$data); - $output.=$data->to_xml(); - $index++; - } - return $output; - } - - /*! returns update start string - */ - protected function updates_start() { - $start = ''; - return $start; - } - - /*! returns update end string - */ - protected function updates_end() { - $start = ''; - return $start; - } - - /*! checks if action version given by client is deprecated - @param action - DataAction object - */ - public function check_collision($action) { - $version = $this->sql->escape($this->request->get_version()); - //$user = $this->sql->escape($this->request->get_user()); - $last_version = $this->get_update_max_version(); - if (($last_version > $version)&&($action->get_status() == 'update')) { - $action->error(); - $action->set_status('collision'); - } - } -} - -?> \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css deleted file mode 100644 index 04fd2dd62b1..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details -*/ -html,body{height:100%;padding:0;margin:0;overflow:auto;}.dhx_view{overflow:hidden;vertical-align:top;background-color:#FFF;}.dhx_layout_wide,.dhx_layout_space,.dhx_layout_head{background-color:#c3dbe3;}.dhx_border_space,.dhx_border_vspace{background-color:#adadad;overflow:hidden;}.dhx_border_space{height:1px;width:100%;}.dhx_border_vspace{width:1px;height:100%;display:table-cell;}.dhx_border_vspace.dhx_border_wide{width:10px;background-color:#c3dbe3;border-left:1px solid #adadad;border-right:1px solid #adadad;}.dhx_border_space.dhx_border_wide{height:10px;background-color:#c3dbe3;border-top:1px solid #adadad;border-bottom:1px solid #adadad;}.dhx_border_vspace.dhx_border_clean{width:10px;background-color:#c3dbe3;}.dhx_border_space.dhx_border_clean{height:4px;border-bottom:1px solid #adadad;}.dhx_loading_overlay{width:100%;height:100%;background-color:#D6D6D6;opacity:.5;background-image:url(./imgs/loading.png);background-repeat:no-repeat;background-position:center;}.dhx_multiview{background-color:#a0a0a0;}.dhx_el_icon div{background-image:url(./imgs/bar_icons_sprite.png);width:22px;height:22px;margin:10px;background-repeat:no-repeat;}.dhx_el_icon_refresh{background-position:0 0;}.dhx_el_icon_save{background-position:-22px 0;}.dhx_el_icon_add{background-position:-44px 0;}.dhx_el_icon_delete{background-position:-66px 0;}.dhx_el_icon_open{background-position:-88px 0;}.dhx_el_icon_run{background-position:-110px 0;}.dhx_el_icon_help{background-position:-132px 0;}.dhx_el_icon_new{background-position:-154px 0;}.dhx_el_icon_edit{background-position:-176px 0;}.dhx_el_icon_search{background-position:-198px 0;}.dhx_el_icon_close{background-position:-220px 0;}.dhx_el_label{text-shadow:0 1px 0 #FFF;height:43px;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:bold;font-size:22px;color:#616161;}.dhx_el_label,.dhx_el_button,.dhx_el_segmented,.dhx_el_roundbutton,.dhx_el_nextbutton,.dhx_el_prevbutton,.dhx_el_defaultbutton{padding:5px 5px 0;box-sizing:border-box;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;}.dhx_el_label{padding-top:8px;}.dhx_el_defaultbutton input{font-size:15px;}.dhx_el_button input,.dhx_el_prevbutton input,.dhx_el_nextbutton input,.dhx_el_bigbutton input{height:32px;font-size:15px;font-weight:bold;text-decoration:none;color:#6e6e6e;text-shadow:$inputs_buttons_text_shadow;border:1px solid #93b0ba;-webkit-border-radius:8px;-webkit-border-bottom-right-radius:9px;-webkit-border-bottom-left-radius:9px;-moz-border-radius:8px;-moz-border-radius-bottomright:9px;-moz-border-radius-bottomleft:9px;border-radius:8px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;padding:1px 15px 1px;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);-moz-box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #FFF,0px 1px #ebebeb;}.dhx_el_prevbutton input,.dhx_el_nextbutton input{-moz-box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));-webkit-box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));box-shadow:inset 0 1px 0 #FFF,0px 1px darken(#FFF(15%));}.dhx_touch .dhx_el_button input,.dhx_touch .dhx_el_prevbutton input,.dhx_touch .dhx_el_nextbutton input{background:#e5e5e5;background:-webkit-gradient(linear,left top,left bottom,from(#e5e5e5),to(#dfdfdf));background:-moz-linear-gradient(top,#e5e5e5,#dfdfdf);color:#6e6e6e;text-shadow:$inputs_touch_text_shadow;}.dhx_el_prevbutton input{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-topleft:26px;-moz-border-radius-bottomleft:26px;text-align:center;padding-right:12px;padding-left:0;border-left-width:0;}.dhx_el_nextbutton input{-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-topright:26px;-moz-border-radius-bottomright:26px;border-right-width:0;padding-left:12px;padding-right:0;}.dhx_el_prevbutton,.dhx_el_nextbutton{height:32px;}.dhx_el_prevbutton_input_cont,.dhx_el_nextbutton_input_cont{float:left;}.dhx_el_prevbutton .dhx_el_prevbutton_arrow,.dhx_el_nextbutton .dhx_el_nextbutton_arrow{float:left;height:32px;}.dhx_el_prevbutton .dhx_el_prevbutton_arrow{width:18px;background:-webkit-canvas(dhxArrowLeft) no-repeat top left;}.dhx_el_nextbutton .dhx_el_nextbutton_arrow{width:18px;background:-webkit-canvas(dhxArrowRight) no-repeat top left;}.dhx_touch .dhx_el_prevbutton .dhx_el_prevbutton_arrow{background:-webkit-canvas(dhxArrowLeftT) no-repeat top left;}.dhx_touch .dhx_el_nextbutton .dhx_el_nextbutton_arrow{background:-webkit-canvas(dhxArrowRightT) no-repeat top left;}.dhx_el_segmented{margin:5px;padding:0;border-radius:16px;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:1px solid #598b9b;-moz-box-shadow:0 1px #ebebeb;-webkit-box-shadow:0 1px #ebebeb;box-shadow:0 1px #ebebeb;width:auto;display:inline-block;overflow:hidden;height:34px;}.dhx_el_segmented .segment_0,.dhx_el_segmented .segment_1,.dhx_el_segmented .segment_N{background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);}.dhx_el_segmented .selected.segment_0,.dhx_el_segmented .selected.segment_1,.dhx_el_segmented .selected.segment_N{background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee;-webkit-box-shadow:inset 0 1px 1px #bee2ee;box-shadow:inset 0 1px 1px #bee2ee;}.dhx_el_segmented div,.dhx_el_segmented div.selected{padding:0 12px;text-shadow:0 1px 0 #FFF;color:#747474;border:0;display:inline-block;color:#616161;font-weight:bold;font-size:15px;text-decoration:none;text-align:center;height:32px;line-height:32px;cursor:pointer;}.dhx_el_segmented div.selected{text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#FFF;}.dhx_el_segmented .segment_0,.dhx_el_segmented .selected.segment_0{-webkit-border-top-left-radius:16px;-webkit-border-bottom-left-radius:17px;-moz-border-radius-topleft:16px;-moz-border-radius-bottomleft:17px;border-top-left-radius:16px;border-bottom-left-radius:17px;padding-left:16px;}.dhx_el_segmented .segment_1,.dhx_el_segmented .selected.segment_1{border-left:1px solid #ababab;}.dhx_el_segmented .segment_N,.dhx_el_segmented .selected.segment_N{-webkit-border-top-right-radius:16px;-webkit-border-bottom-right-radius:17px;-moz-border-radius-topright:16px;-moz-border-radius-bottomright:17px;border-top-right-radius:16px;border-bottom-right-radius:17px;padding-right:15px;border-left:1px solid #ababab;}.dhx_el_roundbutton input,.dhx_el_bigroundbutton input{height:32px;font-weight:bold;font-size:15px;text-decoration:none;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);margin:0;padding:1px 18px 1px;border:1px solid #598b9b;border-bottom:1px solid #0a5f7c;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;}.dhx_touch .dhx_el_roundbutton input{margin:0 -1px;background:-webkit-gradient(linear,left top,left bottom,from(#3ba1c3),to(#118ab3));background:-moz-linear-gradient(top,#3ba1c3,#118ab3);}.dhx_el_imagebutton{margin-left:5px;}.dhx_el_imagebutton span{line-height:42px;font-size:20px;}.dhx_el_imagebutton img{vertical-align:middle;margin-top:-4px;}.dhx_el_bigbutton input,.dhx_el_bigroundbutton input{height:46px;line-height:46px;font-size:20px;-webkit-border-radius:22px 22px 22px 22px;-moz-border-radius:22px 22px 22px 22px;-o-border-radiues:22px 22px 22px 22px;border-radius:22px 22px 22px 22px;border-color:#b1b1b0 #b1b1b0 #878787 #b1b1b0;}.dhx_el_bigbutton input{text-shadow:0 1px 0 #FFF;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fcfcfc),color-stop(0.4,#eee),color-stop(0.6,#e0e0e0),to(#c3c3c3));background:-moz-linear-gradient(top,#fcfcfc 0,#eee 40%,#e0e0e0 60%,#c3c3c3 100%);}.dhx_el_select{padding:5px 5px 0;font-size:15px;}.dhx_el_select select{font-size:15px;}.dhx_el_tabbar{height:49px;vertical-align:top;}.dhx_el_tabbar div{display:inline-block;text-align:center;cursor:pointer;height:46px;margin:1px 2px;}.dhx_el_tabbar .selected{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#6c8e99),to(#395a65));background-image:-moz-linear-gradient(top,#6c8e99,#395a65);background-repeat:repeat-x;}.dhx_el_tabbar img{vertical-align:middle;}.dhx_el_tabbar span{margin-top:1px;line-height:12px;padding:0 10px 2px;color:#FFF;font-size:8px;font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.6);display:block;}.dhx_el_datepicker,.dhx_el_text,.dhx_el_datepicker,.dhx_el_checkbox,.dhx_el_richselect,.dhx_el_combo,.dhx_el_counter,.dhx_el_toggle{padding:5px 5px 0;font-size:18px;display:inline-block;}.dhx_el_radio{padding:5px 5px 0;font-size:18px;}.dhx_el_toggle input,.dhx_el_combo input{font-size:18px;}.dhx_el_toggle input{padding-top:0;}.dhx_inp_text_border,.dhx_el_input input{height:31px;line-height:31px;width:auto;padding:0 8px;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;background:-moz-linear-gradient(center bottom,#FFF,#f2f2f2);background:-webkit-linear-gradient(#f2f2f2,#FFF);border:1px solid #adadad;}.dhx_el_input{margin-top:5px;padding:0 5px 0;}.dhx_el_input input{line-height:0;font-size:20px;}.dhx_inp_text_label{float:left;overflow:hidden;font-size:18px;color:#616161;}.dhx_inp_list,.dhx_inp_text,.dhx_inp_combo{display:block;float:left;height:31px;line-height:31px;color:#000;background:#f7f7f7;background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));background-image:-moz-linear-gradient(top,#f7f7f7,#fefefe);border:medium none;padding:0;}.dhx_inp_textarea{border:1px solid #adadad;padding:0 8px;margin:5px 5px 0;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;font-size:18px;color:#000;background:#f7f7f7;background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));background-image:-moz-linear-gradient(top,#f7f7f7,#fefefe);background-image:-webkit-gradient(linear,left top,left bottom,from(#f7f7f7),to(#fefefe));}::-webkit-input-placeholder{font-size:16px;font-weight:bold;color:#bcbcbc;}.dhx_inp_counter_prev,.dhx_inp_counter_next{width:37px;height:33px;background-repeat:no-repeat;background-color:transparent;cursor:pointer;border:none;float:left;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);border:1px solid #598b9b;text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#FFF;font-size:30px;padding-left:10px;line-height:15px;}.dhx_inp_counter_prev{font-size:14px;line-height:10px;}.dhx_inp_counter_prev{border-top-left-radius:16px;border-bottom-left-radius:16px;-moz-border-radius-topleft:16px;-moz-border-radius-bottomleft:16px;-webkit-border-top-left-radius:16px;-webkit-border-bottom-left-radius:16px;}.dhx_inp_counter_next{border-top-right-radius:16px;border-bottom-right-radius:16px;-moz-border-radius-topright:16px;-moz-border-radius-bottomright:16px;-webkit-border-top-right-radius:16px;-webkit-border-bottom-right-radius:16px;}.dhx_inp_counter_value{width:20px;height:23px;background-color:#FFF;border-top:1px solid #598b9b;float:left;text-align:center;padding:4px 8px;overflow:hidden;line-height:24px;}.dhx_inp_counter_prev,.dhx_inp_counter_next,.dhx_inp_counter_value{-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;border-bottom:1px solid #0a5f7c;}.dhx_inp_counter_label,.dhx_inp_toggle_label{float:left;padding:6px 10px;color:#9d9d9d;line-height:24px;}.dhx_el_formbutton{margin:4px 5px;}.dhx_inp_form_button{height:34px;padding-left:14px;padding-right:14px;background:#72a53b;background:-webkit-gradient(linear,left top,left bottom,from(#a0c07c),to(#579418));background:-moz-linear-gradient(top,#a0c07c,#579418);cursor:pointer;outline-style:none;-webkit-appearance:none;-moz-border-radius:17px;-webkit-border-radius:17px;border-radius:17px;border:1px solid #6b8352;border-bottom:1px solid #3a640d;font-weight:bold;font-size:15px;-moz-box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;box-shadow:inset 0 1px 1px #cfdfbd,0px 1px #ebebeb;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);}.dhx_touch .dhx_el_formbutton input{background:#579418;background-image:-moz-linear-gradient(linear,left top,left bottom,color-stop(0%,#72a53b),color-stop(100%,#579418));background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#72a53b),color-stop(100%,#579418));margin-left:-1px;margin-right:-1px;border:1px solid #3a640d;color:#f4f4f4;}.dhx_el_toggle{display:inline-block;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_left_off,.dhx_inp_toggle_right_on,.dhx_inp_toggle_right_off{height:31px;line-height:31px;background-color:transparent;border:none;cursor:pointer;display:block;float:left;margin:0;text-align:center;outline:none;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);padding:0 14px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_right_on{color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);background:#74c1da;background:-webkit-gradient(linear,left top,left bottom,from(#74c1da),to(#118ab3));background:-moz-linear-gradient(top,#74c1da,#118ab3);-moz-box-shadow:inset 0 1px 1px #bee2ee,0px 1px #ebebeb;-webkit-box-shadow:inset 0 1px 1px #bee2ee;box-shadow:inset 0 1px 1px #bee2ee;border:1px solid #598b9b;border-bottom:1px solid #0a5f7c;}.dhx_inp_toggle_left_off,.dhx_inp_toggle_right_off{color:#6e6e6e;background:#ebebeb;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#dfdfdf));background:-moz-linear-gradient(top,#fdfdfd,#dfdfdf);border:1px solid #93b0ba;border-bottom:1px solid #93b0ba;-moz-box-shadow:0 1px #ebebeb;-webkit-box-shadow:0 1px #ebebeb;box-shadow:0 1px #ebebeb;}.dhx_inp_toggle_left_on,.dhx_inp_toggle_left_off{border-top-left-radius:15px;border-bottom-left-radius:15px;-moz-border-radius-topleft:15px;-moz-border-radius-bottomleft:15px;-webkit-border-top-left-radius:15px;-webkit-border-bottom-left-radius:15px;}.dhx_inp_toggle_right_on,.dhx_inp_toggle_right_off{border-top-right-radius:15px;border-bottom-right-radius:15px;-moz-border-radius-topright:15px;-moz-border-radius-bottomright:15px;-webkit-border-top-right-radius:15px;-webkit-border-bottom-right-radius:15px;}.dhx_inp_toggle_left_off{border-right:0;}.dhx_inp_toggle_right_off{border-left:0;}.dhx_inp_checkbox_border{width:24px;height:24px;padding:0;margin-top:5px;border:1px solid #adadad;background-color:#FFF;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;text-align:center;cursor:pointer;float:left;}.dhx_inp_checkbox_on{display:block;width:18px;height:18px;border:none;background-color:transparent;background-image:url(./imgs/images.png);background-position:0 -847px;background-repeat:no-repeat;cursor:pointer;margin:3px 0 0 3px;padding:0;font-size:0!important;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.dhx_inp_checkbox_label,.dhx_inp_radio_label{float:left;padding:0 10px;cursor:pointer;height:35px;line-height:35px;}.dhx_inp_radio_border{width:22px;height:22px;margin-top:6px;border:1px solid #adadad;background-color:#FFF;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px;text-align:center;cursor:pointer;float:left;}.dhx_inp_radio_on{width:12px;height:12px;border:none;background-color:transparent;background-image:url(./imgs/images.png);background-position:0 -937px;background-repeat:no-repeat;cursor:pointer;margin:5px 0 0 5px;display:block;font-size:0!important;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;}.hidden{display:none;}.dhx_inp_toggle_left_on:focus,.dhx_inp_toggle_left_off:focus,.dhx_inp_toggle_right_on:focus,.dhx_inp_toggle_right_off:focus,.dhx_inp_form_button:focus,.dhx_inp_counter_prev:focus,.dhx_inp_counter_next:focus,.dhx_inp_checkbox_on:focus,.dhx_inp_radio_on:focus,.dhx_el_button input:focus,.dhx_el_roundbutton input:focus,.dhx_el_nextbutton:focus,.dhx_el_prevbutton input:focus{outline:none 0;}.dhx_inp_toggle_left_on::-moz-focus-inner,.dhx_inp_toggle_left_off::-moz-focus-inner,.dhx_inp_toggle_right_on::-moz-focus-inner,.dhx_inp_toggle_right_off::-moz-focus-inner,.dhx_inp_form_button::-moz-focus-inner,.dhx_inp_counter_prev::-moz-focus-inner,.dhx_inp_counter_next::-moz-focus-inner,.dhx_inp_checkbox_on::-moz-focus-inner,.dhx_inp_radio_on::-moz-focus-inner,.dhx_el_button input::-moz-focus-inner,.dhx_el_roundbutton input::-moz-focus-inner,.dhx_el_prevbutton input::-moz-focus-inner,.dhx_el_nextbutton input::-moz-focus-inner{border:0;}.invalid,.invalid input,.invalid textarea{color:#F00;}div,input,textarea{font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;}.dhx_form_float,.dhx_form_clear{float:left;width:300px;font-size:18px;padding:5px 0 5px 10px;height:35px;}.dhx_form_float{text-align:center;}.dhx_form_row_delimiter,.dhx_form_clear{clear:both;}.dhx_el_text input{font-size:18px;line-height:28px;}.dhx_toolbar{text-align:center;margin:auto;height:42px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9ecfe0),to(#73bbd4),color-stop(50%,#76a6b7));background-image:-moz-linear-gradient(top,#9ecfe0,#76a6b7,#73bbd4);line-height:normal;}.dhx_toolbar .dhx_view{background-color:transparent;}.dhx_mainbar{background-image:-moz-linear-gradient(top,#FFF,#e1ebee,#cbdce2);background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#FFF),to(#cbdce2),color-stop(50%,#e1ebee));}.dhx_transparentbar{background:transparent!important;font-weight:bold;}.dhx_subbar{background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#FFF),to(#c2c2c2),color-stop(50%,#e8e8e8));background-image:-moz-linear-gradient(top,#FFF,#e8e8e8,#c2c2c2);background-repeat:repeat-x;}.dhx_list_item{cursor:pointer;line-height:22px;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:bold;font-size:16px;text-decoration:none;color:#303030;border-bottom:1px solid #d4d4d4;vertical-align:middle;white-space:nowrap;background:;background:;background:;-moz-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;}.dhx_list__item_selected,.dhx_list_item_selected{color:#FFF;text-shadow:0 -1px 0 #2d6072;background:#0986b0;background:-moz-linear-gradient(top,#8dcee3 4%,#0986b0 85%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0.85,#0986b0),color-stop(0.04,#8dcee3));}.dhx_list_group,.dhx_list_group_selected{position:relative;border-bottom:1px solid #d4d4d4;}.dhx_list_group_back,.dhx_list_group_back_selected{position:relative;background-color:#aeaeae;background-image:url(./imgs/arr_top.png),-webkit-gradient(linear,left bottom,left top,color-stop(0.02,#ccc),color-stop(0.06,#e0e0e0),color-stop(0.90,#fdfdfd));background-image:url(./imgs/arr_top.png),-moz-linear-gradient(center bottom,#ccc 2%,#e0e0e0 6%,#fdfdfd 90%,#FFF 95%);background-repeat:no-repeat,repeat-x;background-position:center 37px,0;border-bottom:1px solid transparent;}.dhx_arrow_icon{position:absolute;top:50%;bottom:50%;margin-top:-6px;right:29px;width:7px;height:11px;background-image:url(./imgs/images.png);background-repeat:no-repeat;}.dhx_list_group .dhx_arrow_icon,.dhx_list_group_selected .dhx_arrow_icon{background-position:0 -677px;}.dhx_list_group_back .dhx_arrow_icon,.dhx_list_group_back_selected .dhx_arrow_icon{background-position:0 -664px;}.dhx_arrow_top_icon{position:absolute;bottom:0;left:50%;width:13px;height:7px;margin-left:-7px;margin-bottom:-1px;background-image:url(./imgs/images.png);background-repeat:no-repeat;}.dhx_list_group_back .dhx_arrow_top_icon{background-position:0 -729px;}.dhx_list_count{float:right;width:25px;font-size:14px;text-align:center;margin-right:45px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#929292;color:#FFF;-webkit-box-shadow:0 1px 0 #000;-moz-box-shadow:0 1px 0 #000;box-shadow:0 1px 0 #000;-webkit-text-shadow:0 -1px 0 rgba(0,0,0,0.6);-moz-text-shadow:0 -1px 0 rgba(0,0,0,0.6);text-shadow:0 -1px 0 rgba(0,0,0,0.6);}.dhx_pagelist{position:relative;}.dhx_pagelist.hidden_scroll .dhx_scroll_x{background-color:transparent!important;}.dhx_pagelist.hidden_scroll .dhx_scroll_y{background-color:transparent!important;}.dhx_mini_calendar{background-color:#ebebeb;cursor:default;color:#616161;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-size:18px;font-weight:bold;text-shadow:0 1px 0 #FFF;overflow:hidden;position:relative;}.dhx_cal_month{border-bottom:1px solid #d4d4d4;height:39px;line-height:39px;text-align:center;vertical-align:middle;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0.05,#c7c7c7),color-stop(0.60,#f5f5f5),color-stop(0.84,#FFF));background-image:-moz-linear-gradient(center bottom,#c7c7c7 5%,#f5f5f5 60%,#FFF 84%);position:relative;}.dhx_cal_header{position:relative;}.dhx_cal_week_header,.dhx_cal_day_name,.dhx_cal_day_num,.dhx_next_month,.dhx_prev_month,.dhx_cal_week_num{border-color:#fcfcfc #fcfcfc #ccc #cccccc;border-width:1px;border-style:solid;text-align:center;}.dhx_cal_week_header,.dhx_cal_day_name{line-height:18px;font-size:12px;position:absolute;background-color:#e3e3e3;}.dhx_cal_day_num,.dhx_next_month,.dhx_prev_month,.dhx_cal_week_num{background-color:#ededed;color:#6a6a6a;font-size:16px;}.dhx_week_numbers .dhx_cal_week_num{font-size:12px;font-weight:bold;color:#303030;background-color:#E4E4E4;}.dhx_cal_day_num{cursor:pointer;}.dhx_cal_day_num.dhx_cal_current_day{background:#539300;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);border-color:#828282;}.dhx_cal_day_num.dhx_cal_selected_day{background-image:;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9dcedf),to(#0986b0),color-stop(34%,#53aac8),color-stop(85%,#0986b0));background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#9dcedf),to(#0986b0),color-stop(34%,#53aac8),color-stop(85%,#0986b0));background-color:#4169e1;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,0.6);border-color:#6c838a;}.dhx_cal_day_num_bborder{border-bottom:0;}.dhx_cal_day_num_rborder{border-right:0;}.dhx_cal_day_name_last{border-right:0;}.dhx_cal_time_select{border-top:1px solid #ccc;height:28px;padding-top:3px;text-align:center;vertical-align:middle;}.dhx_cal_header,.dhx_cal_body{margin-left:-1px;}.dhx_cal_prev_button,.dhx_cal_next_button{cursor:pointer;position:absolute;top:0;width:30px;height:39px;font-size:0;line-height:39px;vertical-align:middle;}.dhx_cal_prev_button{left:10px;}.dhx_cal_next_button{right:10px;}.dhx_cal_prev_button div,.dhx_cal_next_button div{width:7px;height:11px;position:absolute;top:15px;}.dhx_cal_prev_button div{background-image:url(./imgs/images.png);background-repeat:no-repeat;background-position:0 -664px;left:5px;}.dhx_cal_next_button div{background-image:url(./imgs/images.png);background-position:0 -677px;background-repeat:no-repeat;right:5px;}.dhx_window{position:absolute;width:298px;-moz-box-shadow:0 0 20px #878787;-khtml-box-shadow:0 0 20px #878787;}.dhx_win_content{height:auto;width:auto;overflow:hidden;}.dhx_win_body{color:#616161;background-color:#FFF;overflow:hidden;text-align:center;}.dhx_window,.dhx_win_content,.dhx_win_body{-webkit-border-radius:6px;-moz-border-radius:6px;-o-border-radius:6px;border-radius:6px;}.dhx_alert_text{color:#616161;padding:10px;}.dhx_alert_template,.dhx_win_head{line-height:43px;color:#FFF;font-size:16pt;text-align:center;border-bottom:1px solid #adadad;cursor:pointer;}.dhx_alert_template{text-shadow:0 -1px 0 #000;background:#616161;font-weight:bold;background:-webkit-gradient(linear,left top,left bottom,from(#696969),to(#575757));background:-moz-linear-gradient(top,#696969,#575757);}.dhx_modal,.dhx_modal_rich{width:100%;height:100%;position:absolute;top:0;left:0;}.dhx_modal{background-color:#000;opacity:.2;filter:alpha(opacity= 20);}.dhx_modal_rich{background-image:url(./imgs/window/bg.png);background-size:cover;}.dhx_point_top,.dhx_point_right,.dhx_point_bottom,.dhx_point_left{position:absolute;}.dhx_point_top,.dhx_point_bottom{width:13px;height:7px;}.dhx_point_left,.dhx_point_right{width:7px;height:13px;}.dhx_point_top{background-image:url(./imgs/images.png);background-position:0 -729px;}.dhx_point_bottom{background-image:url(./imgs/images.png);background-position:0 -690px;}.dhx_point_right{background-image:url(./imgs/images.png);background-position:0 -714px;}.dhx_point_left{background-image:url(./imgs/images.png);background-position:0 -699px;}.dhx_confirm_message,.dhx_alert_message,.dhx_prompt_message{font-size:18px;padding:14px;}body{-moz-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;}.dhx_scroll_x{width:50px;height:4px!important;padding:0!important;margin:0!important;background:rgba(0,0,0,0.4);position:absolute;left:1px;bottom:3px;border:1px solid transparent;-webkit-border-radius:4px;-webkit-transition:-webkit-transform;}.dhx_scroll_y{width:4px!important;padding:0!important;margin:0!important;height:50px;background:rgba(0,0,0,0.4);position:absolute;top:1px;right:3px;border:1px solid transparent;-webkit-border-radius:4px;-webkit-transition:-webkit-transform;}.dhx_scroll_cont{width:100%;height:auto;overflow:hidden;clear:both;}html,body{-webkit-tap-highlight-color:rgba(0,0,0,0);-moz-user-select:none;-moz-user-select:-moz-none;-khtml-select:none;}.dhx_schedulerbar{background:-webkit-gradient(linear,left top,left bottom,from(#d7d7d7),to(#b7b7b7));background:-moz-linear-gradient(top,#d7d7d7,#b7b7b7);}.dhx_el_button input{border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);text-shadow:0 -1px 0 rgba(0,0,0,0.6);font-size:14px;color:#fff;padding:0 10px;border:1px solid #636363;-moz-box-shadow:0 1px #fff;-webkit-box-shadow:0 1px #fff;box-shadow:0 1px #fff;}.add .dhx_el_button input{background-image:url(./imgs_mobile/add.png),-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background-image:url(./imgs_mobile/add.png),-moz-linear-gradient(top,#9dbcc7,#518a9e);background-position:center center;background-repeat:no-repeat;width:34px;}.dhx_schedulerbar .dhx_el_segmented{border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;float:none!important;border:1px solid #636363;-moz-box-shadow:0 1px #fff;-webkit-box-shadow:0 1px #fff;height:32px;}.dhx_schedulerbar .dhx_el_segmented .segment_0,.dhx_schedulerbar .dhx_el_segmented .segment_1,.dhx_schedulerbar .dhx_el_segmented .segment_N{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),color-stop(0.3,#eee),color-stop(0.6,#dcdcdc),to(#d5d5d5));background:-moz-linear-gradient(top,#f8f8f8,#d5d5d5);}.dhx_schedulerbar .dhx_el_segmented .selected.segment_0,.dhx_schedulerbar .dhx_el_segmented .selected.segment_1,.dhx_schedulerbar .dhx_el_segmented .selected.segment_N{background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);}.dhx_el_segmented .segment_N,.dhx_el_segmented .selected.segment_N{border-left:0;}.dhx_schedulerbar .dhx_el_segmented div{text-shadow:0 1px 0 #fff;font-size:14px;color:#757575;border:0;height:30px;}.dhx_schedulerbar .dhx_el_segmented div.selected{text-shadow:0 -1px 0 rgba(0,0,0,0.6);color:#fff;height:30px;}.dhx_schedulerbar .dhx_el_segmented .segment_0{-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-bottomleft:4px;border-top-left-radius:4px;border-bottom-left-radius:4px;padding:0 11px 0 14px;}.dhx_schedulerbar .dhx_el_segmented .segment_1{border-left:1px solid #ababab;border-right:1px solid #ababab;padding:0 11px;}.dhx_schedulerbar .dhx_el_segmented .segment_N{-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px;border-top-right-radius:4px;border-bottom-right-radius:4px;padding:0 14px 0 11px;}.dhx_dayevents_scale_item{-moz-user-select:-moz-none;border-bottom:1px solid #D4D4D4;color:#303030;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;white-space:nowrap;}.dhx_dayevents_scale_hour{float:left;text-align:center;font-size:16px;vertical-align:middle;font-weight:bold;}.dhx_dayevents_scale_top,.dhx_dayevents_scale_bottom{font-size:10px;float:left;text-align:center;}.dhx_dayevents_scale_top{border-bottom:1px dotted #D4D4D4;}.dhx_dayevents_scale_minute{background-color:#EEE;border-right:1px dotted #D4D4D4;float:left;}.dhx_dayevents_scale_event{float:left;}.dhx_dayevents_event_item{position:absolute;border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;font-size:12px;background-color:#e6f8ff;border:1px solid #78a5b4;font-family:"Helvetica World","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","Helvetica","Tahoma","Geneva","Arial",sans-serif;}.dhx_topbar{font-size:18px;background:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),color-stop(0.5,#ededed),to(#c8c8c8))!important;background:-moz-linear-gradient(top,#fdfdfd,#c8c8c8)!important;}.dhx_list_events_item{position:relative;background-color:#fff;}.dhx_list_events_item .dhx_day_title{height:16px;line-height:16px;width:75px;position:absolute;left:1px;top:0;background:#518A9E;border-radius:2px;text-align:center;-moz-border-radius:2px;-moz-box-shadow:1px 1px 1px #1c2329;-webkit-box-shadow:1px 1px 1px #1c2329;box-shadow:1px 1px 1px #1c2329;-webkit-border-radius:2px;text-shadow:0 -1px 0 rgba(0,0,0,0.6);font-size:14px;color:#fff;}.dhx_list_events_item .dhx_event_marker{display:inline-block;margin-left:5px;margin-top:5px;height:10px;width:10px;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px;background-color:#e6f8ff;border:1px solid #78a5b4;vertical-align:top;}.dhx_list_events_item .dhx_event_time{display:inline-block;width:70px;font-size:16px;padding-top:8px;}.dhx_list_events_item .dhx_event_text{display:inline-block;padding-left:4px;overflow:hidden;height:22px;vertical-align:top;white-space:nowrap;}.dhx_cal_day_num.dhx_cal_selected_day,.dhx_cal_day_num.dhx_cal_current_day.dhx_cal_selected_day{background:-webkit-gradient(linear,left top,left bottom,from(#a0bfc9),to(#4f899d))!important;background:-moz-linear-gradient(top,#a0bfc9,#4f899d);text-shadow:0 1px 0 rgba(0,0,0,0.6);}.dhx_cal_day_num.dhx_cal_current_day{background:-webkit-gradient(linear,left top,left bottom,from(#bababa),to(#eee))!important;background:-moz-linear-gradient(top,#bababa,#eee);border-color:#636363;text-shadow:0 1px 0 rgba(0,0,0,0.6);}.dhx_cal_day_num.dhx_cal_selected_day span{color:#fff;}.dhx_cal_day_num{position:relative;}.dhx_cal_day_num .day_with_events{position:absolute;bottom:0;right:0;background-image:url(./imgs_mobile/event.png);background-repeat:no-repeat;width:12px;height:12px;}.dhx_cal_day_num.dhx_cal_selected_day .day_with_events{background-image:url(./imgs_mobile/event_focus.png);}.dhx_cal_prev_button div{background-image:url("./imgs_mobile/arrow_left.png");background-position:0 0;width:28px;height:29px;top:6px;}.dhx_cal_next_button div{background-image:url("./imgs_mobile/arrow_right.png");background-position:0 0;width:28px;height:29px;top:6px;}.dhx_list_day_events_item{background-color:#fff;}.dhx_list_day_events_item .dhx_event_marker{display:inline-block;margin-top:16px;margin-left:5px;height:10px;width:10px;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px;background-color:#e6f8ff;border:1px solid #78a5b4;}.dhx_list_day_events_item .dhx_event_time{display:inline-block;width:auto;height:42px;line-height:42px;padding-left:5px;}.dhx_list_day_events_item .dhx_event_text{display:inline-block;padding-left:10px;line-height:42px;}.no_events{background-image:url(./imgs_mobile/noevents.png);background-repeat:no-repeat;}.selected_event{width:290px;margin:5px;background-color:#e6f8ff;border:1px solid #78a5b4;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;padding:3px 6px;}.selected_event .event_title{font-weight:bold;}.selected_event .event_text{font-size:12px;}.dhx_el_formbutton.delete .dhx_inp_form_button{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#d4d4d4));background:-moz-linear-gradient(top,#f8f8f8,#d4d4d4);border-top:1px solid #888;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid #8f8f8f;color:#606060;text-shadow:0 1px 0 #fff;height:40px;}.dhx_el_button.cancel input{background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),color-stop(0.3,#eee),color-stop(0.6,#dcdcdc),to(#d5d5d5));background:-moz-linear-gradient(top,#f8f8f8,#d5d5d5);color:#6E6E6E;text-shadow:0 1px 0 #FFF;}.invalid .dhx_inp_text_border{border-color:#c00;}.invalid .dhx_inp_list{color:#c00;}.dhx_win_body{font-weight:bold;color:#3f2317;text-shadow:0 1px #e2d3b6;background:url(../images/confirm_main_bgr.png);}.dhx_win_body .dhx_view{background:transparent;}.dhx_el_bigbutton input,.dhx_el_bigroundbutton input{height:40px;line-height:40px;}.dhx_el_bigroundbutton input,.alert .dhx_el_bigbutton input{background:#83a41f;background:-webkit-gradient(linear,left top,left bottom,from(#9dbcc7),color-stop(0.4,#80a9b8),color-stop(0.6,#6799aa),to(#4f899d));background:-moz-linear-gradient(top,#9dbcc7,#518a9e);}.dhx_el_bigroundbutton{padding-top:0;} \ No newline at end of file diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js deleted file mode 100644 index 9ec9bb0dbfa..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_mobile.js +++ /dev/null @@ -1,318 +0,0 @@ -/* -This software is allowed to use under GPL or you need to obtain Commercial or Enterise License -to use it in not GPL project. Please contact sales@dhtmlx.com for details -*/ -window.dhx||(dhx={});dhx.version="3.0";dhx.codebase="./";dhx.name="Core";dhx.copy=function(a){var b=dhx.copy.Sd;b.prototype=a;return new b};dhx.copy.Sd=function(){};dhx.extend=function(a,b,c){a.Ya&&(a=a.Ya[0]);for(var d in b)if(!a[d]||c)a[d]=b[d];b.defaults&&dhx.extend(a.defaults,b.defaults);b.$init&&b.$init.call(a);return a}; -dhx.fullCopy=function(a){var b=a.length?[]:{};arguments.length>1&&(b=arguments[0],a=arguments[1]);for(var c in a)typeof a[c]=="object"?(b[c]=a[c].length?[]:{},dhx.fullCopy(b[c],a[c])):b[c]=a[c];return b};dhx.single=function(a){var b=null,c=function(c){b||(b=new a({}));b.Yc&&b.Yc.apply(b,arguments);return b};return c}; -dhx.protoUI=function(){var a=arguments,b=a[0].name,c=function(d){if(a){for(var e=[a[0]],f=1;f0;e--){if(typeof a[e]=="function")a[e]=a[e].prototype;a[e].$init&&d.push(a[e].$init);if(a[e].defaults){var f=a[e].defaults;if(!b.defaults)b.defaults={};for(var g in f)dhx.isNotDefined(b.defaults[g])&&(b.defaults[g]=f[g])}if(a[e].type&&b.type)for(g in a[e].type)b.type[g]||(b.type[g]=a[e].type[g]);for(var h in a[e])b[h]||(b[h]=a[e][h])}c&&d.push(b.$init);b.$init=function(){for(var a=0;a=0&&this.splice(a,b||1)},remove:function(a){this.removeAt(this.find(a))},insertAt:function(a,b){if(!b&&b!==0)this.push(a);else{var c=this.splice(b,this.length-b);this[b]=a;this.push.apply(this,c)}},find:function(a){for(var b=0;b")!=-1)switch(b=b.split("->"),b[0]){case "html":b=dhx.html.getValue(b[1]);break;case "http":b=(new dhx.ajax).sync().get(b[1],{uid:dhx.uid()}).responseText}b=(b||"").toString();b=b.replace(/(\r\n|\n)/g,"\\n");b=b.replace(/(\")/g,'\\"');b=b.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,'"+(obj.$1?"$2":"$3")+"');b=b.replace(/\{common\.([^}\(]*)\}/g,"\"+(common.$1||'')+\""); -b=b.replace(/\{common\.([^\}\(]*)\(\)\}/g,'"+(common.$1?common.$1(obj,common):"")+"');b=b.replace(/\{obj\.([^}]*)\}/g,"\"+(obj.$1||'')+\"");b=b.replace(/#([$a-z0-9_\[\]]+)#/gi,"\"+(obj.$1||'')+\"");b=b.replace(/\{obj\}/g,'"+obj+"');b=b.replace(/\{-obj/g,"{obj");b=b.replace(/\{-common/g,"{common");b='return "'+b+'";';try{Function("obj","common",b)}catch(c){}return a[b]=Function("obj","common",b)};dhx.Template.empty=function(){return""};dhx.Template.bind=function(a){return dhx.bind(dhx.Template(a), -this)};dhx.Type=function(a,c){if(a.Ya){if(!a.Ga)a.Ga=[];a.Ga.push(c)}else{if(typeof a=="function")a=a.prototype;if(!a.types)a.types={"default":a.type},a.type.name="default";var d=c.name,e=a.type;d&&(e=a.types[d]=dhx.copy(a.type));for(var f in c)e[f]=f.indexOf("template")===0?dhx.Template(c[f]):c[f];return d}}})(); -dhx.AtomRender={xa:function(a){return this.a.template(a,this)},render:function(){if(this.isVisible(this.a.id)){if(!this.callEvent||this.callEvent("onBeforeRender",[this.data])){if(this.data)this.d.innerHTML=this.xa(this.data);this.callEvent&&this.callEvent("onAfterRender",[])}return!0}return!1},template_setter:dhx.Template}; -dhx.SingleRender=dhx.proto({xa:function(a){return this.type.templateStart(a,this.type)+this.type.template(a,this.type)+this.type.templateEnd(a,this.type)},customize:function(a){dhx.Type(this,a)}},dhx.AtomRender); -dhx.Destruction={$init:function(){dhx.destructors.push(this)},destructor:function(){this.destructor=function(){};if(this.c)for(var a=0;ab+1&&this.showItem(this.idByIndex(b+1))})}},loadNext:function(a,b){this.data.feed&&this.data.feed.call(this,b||this.dataCount(),a)},mb:function(a,b){this.data.ue(this.data.driver.toObject(a,b));this.callEvent("onXLE",[]);if(this.Ub)this.data.detachEvent(this.Ub),this.Ub=null},scheme_setter:function(a){this.data.scheme(a)},dataFeed_setter:function(a){this.data.attachEvent("onBeforeFilter",dhx.bind(function(a,c){if(this.a.dataFeed){var d={};if(a||d){if(typeof a=="function"){if(!c)return; -a(c,d)}else d={text:c};this.clearAll();var e=this.a.dataFeed,f=[],g;for(g in d)f.push("dhx_filter["+g+"]="+encodeURIComponent(d[g]));this.load(e+(e.indexOf("?")<0?"?":"&")+f.join("&"),this.a.datatype);return!1}}},this));return a},Ed:function(){if(this.a.ready){var a=dhx.toFunctor(this.a.ready);a&&a.call&&a.apply(this,arguments)}}},dhx.AtomDataLoader).prototype;dhx.DataStore=function(){this.name="DataStore";dhx.extend(this,dhx.EventSystem);this.setDriver("xml");this.pull={};this.order=dhx.toArray()}; -dhx.DataStore.prototype={setDriver:function(a){this.driver=dhx.DataDriver[a]},ue:function(a){this.callEvent("onParse",[this.driver,a]);this.p&&this.filter();var b=this.driver.getInfo(a),c=this.driver.getRecords(a),d=(b.ia||0)*1;if(d===0&&this.order[0])d=this.order.length;for(var e=0,f=0;fb)var c=b,b=a,a=c;return this.getIndexRange(a,b)},getIndexRange:function(a,b){for(var b=Math.min(b||Infinity,this.dataCount()- -1),c=dhx.toArray(),d=a||0;d<=b;d++)c.push(this.item(this.order[d]));return c},dataCount:function(){return this.order.length},exists:function(a){return!!this.pull[a]},move:function(a,b){if(!(a<0||b<0)){var c=this.idByIndex(a),d=this.item(c);this.order.removeAt(a);this.order.insertAt(c,Math.min(this.order.length,b));this.callEvent("onStoreUpdated",[c,d,"move"])}},scheme:function(a){this.sb=a;this.tb=a.$init;this.ta=a.$update;this.ad=a.$serialize;delete a.$init;delete a.$update;delete a.$serialize}, -sync:function(a,b,c){typeof b!="function"&&(c=b,b=null);if(dhx.debug_bind)this.debug_sync_master=a;if(a.name!="DataStore")a=a.data;var d=dhx.bind(function(){this.order=dhx.toArray([].concat(a.order));this.p=null;this.pull=a.pull;b&&this.silent(b);this.Tc&&this.Tc();c?c=!1:this.refresh()},this);a.attachEvent("onStoreUpdated",d);d()},add:function(a,b){if(this.sb){var a=a||{},c;for(c in this.sb)a[c]=a[c]||this.sb[c];this.tb?this.tb(a):this.ta&&this.ta(a)}var d=this.id(a),e=this.dataCount();if(dhx.isNotDefined(b)|| -b<0)b=e;b>e&&(b=Math.min(this.order.length,b));if(this.callEvent("onBeforeAdd",[d,a,b])===!1)return!1;if(this.exists(d))return null;this.pull[d]=a;this.order.insertAt(d,b);if(this.p){var f=this.p.length;!b&&this.order.length&&(f=0);this.p.insertAt(d,f)}this.callEvent("onafterAdd",[d,b]);this.callEvent("onStoreUpdated",[d,a,"add"]);return d},remove:function(a){if(dhx.isArray(a))for(var b=0;bb?1:ab?1:ab?1:a"+a.innerHTML+""}}; -dhx.DataMove={$init:function(){},copy:function(a,b,c,d){var e=this.item(a);if(e)return c&&(e=c.externalData(e)),c=c||this,c.add(c.externalData(e,d),b)},move:function(a,b,c,d){if(dhx.isArray(a))for(var e=0;ethis.c.length)b=this.c.length;var d=(this.c[b]|| -{}).b;dhx.PowerArray.insertAt.call(this.c,a,b);dhx.html.insertBefore(a.b,d,this.d)}else{var e=dhx.ui.get(b),b=dhx.PowerArray.find.call(this.c,e);e.b.parentNode.insertBefore(a.b,e.b);e.destructor();this.c[b]=a}a.b.style.cssFloat=a.b.style.styleFloat=this.wc;this.c[b].D=this}this.resizeChildren()},reconstruct:function(){for(var a=0;a-1)b=this.a.height,d=0;if(this.a.width>-1)a=this.a.width,c=0;this.r?(a&&(c=0),d&&(b=0)):(b&&(d=0),c&&(a=0));return[c,a,d,b]},$setSize:function(a,b){this.hb=[a,b]; -dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(a,b)},va:function(a,b){for(var c=a-this.jb[1],d=b-this.jb[3],e=this.jb[0],f=this.jb[2],g=this.c.length-1,h=0;h0&&(j+=d))}else j=b,this.U[h][0]?(i=Math.round(this.U[h][0]*c/e),c-=i,e-=this.U[h][0]):(i=this.U[h][1],h==g&&c>0&&(i+=c));this.c[h].$setSize(i,j)}},ef:function(a,b){var c=this.index(a); -return c==-1?null:this.c[c+b]},first:function(){return this.c[0]}},dhx.ui.baseview); -dhx.protoUI({name:"layout",$init:function(){this.fb=0},T:function(){this.b.className+=" dhx_layout_"+(this.a.type||"");if(this.a.margin)this.S=this.a.margin;if(this.a.padding)this.u=this.a.padding;var a=this.Q;if(!this.a.k)this.a.k={top:!0,left:!0,right:!0,bottom:!0};this.mc(a);dhx.ui.baselayout.prototype.T.call(this,a);this.kc(a)},$getSize:function(){var a=dhx.ui.baselayout.prototype.$getSize.call(this),b=this.S*(this.c.length-this.fb-1);this.r?a[3]&&(a[3]+=b):a[1]&&(a[1]+=b);if(this.u&&(a[1]&&(a[1]+= -this.u*2),a[3]&&(a[3]+=this.u*2),this.S>-1)){var c=this.a.k;if(c){var d=(c.left?0:1)+(c.right?0:1),e=(c.top?0:1)+(c.bottom?0:1);a[1]&&d&&(a[1]+=d);a[3]&&e&&(a[3]+=e)}}return a},$setSize:function(a,b){this.hb=[a,b];this.u&&this.S>0?dhx.ui.view.prototype.$setSize.call(this,a,b):dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(this.j,this.m)},va:function(a,b){var c=this.S*(this.c.length-this.fb-1);this.r?(b-=c+this.u*2,a-=this.u*2):(a-=c+this.u*2,b-=this.u*2);return dhx.ui.baselayout.prototype.va.call(this, -a,b)},resizeChildren:function(a){if(a&&this.type!="clean"){for(var b=[],c=0;c1){if(this.a.type!="head")a[0].k.bottom=c;a[a.length-1].k.top=c}}else{for(b=1;b1){if(this.a.type!="head")a[0].k.right=c;a[a.length-1].k.left=c}}}},kc:function(a){for(var b=1,c=0;c0)this.g.style.border="1px solid #AEAEAE";return a},je:{space:10,wide:4, -clean:0,head:4,line:-1},te:{space:10,wide:0,clean:0,head:0,line:0},S:-1,u:0},dhx.ui.baselayout);dhx.ui.layout.call(dhx); -dhx.protoUI({name:"template",$init:function(){this.attachEvent("onXLE",this.render)},setValues:function(a){this.data=a;this.render()},defaults:{template:dhx.Template.empty,loading:!0},Wc:function(){this.Pb||this.render()},src_setter:function(a){this.Pb=!0;this.callEvent("onXLS",[]);dhx.ajax(a,dhx.bind(function(a){this.a.template=dhx.Template(a);this.Pb=!1;this.Wc();this.callEvent("onXLE",[])},this));return a},content_setter:function(a){if(a)this.Pb=!0,this.d.appendChild(dhx.toNode(a))},refresh:function(){this.render()}, -waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.Wc()},se:!0},dhx.Scrollable,dhx.AtomDataLoader,dhx.AtomRender,dhx.EventSystem,dhx.ui.view); -dhx.protoUI({name:"iframe",defaults:{loading:!0},$init:function(){this.d=this.g;this.g.innerHTML=""},load:function(a){this.src_setter(a)},src_setter:function(a){this.g.childNodes[0].src=a;this.callEvent("onXLS",[]);dhx.delay(this.Je,this);return a},Je:function(){try{dhx.event(this.getWindow(),"load",dhx.bind(function(){this.callEvent("onXLS",[])},this))}catch(a){this.callEvent("onXLE",[])}},getWindow:function(){return this.g.childNodes[0].contentWindow}, -waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a}},dhx.ui.view,dhx.EventSystem); -dhx.ui.overlay={$init:function(){if(dhx.isNotDefined(this.ba)&&this.attachEvent)this.attachEvent("onXLS",this.showOverlay),this.attachEvent("onXLE",this.hideOverlay),this.ba=null},showOverlay:function(){if(!this.ba)this.ba=dhx.html.create("DIV",{"class":"dhx_loading_overlay"},""),dhx.html.insertBefore(this.ba,this.b.firstChild,this.b)},hideOverlay:function(){if(this.ba)dhx.html.remove(this.ba),this.ba=null}}; -dhx.protoUI({name:"scrollview",defaults:{scroll:"x",scrollSpeed:"0ms"},$init:function(){this.b.className+=" dhx_scrollview"},content_setter:function(a){this.ha=dhx.ui.Oa(a);this.ha.D=this;this.d.appendChild(this.ha.b)},body_setter:function(a){return this.content_setter(a)},$getSize:function(){this.ga=this.ha.$getSize();if(this.a.scroll=="x"&&this.ga[3]>0)this.a.height=this.ga[3];else if(this.a.scroll=="y"&&this.ga[1]>0)this.a.width=this.ga[1];return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a, -b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))this.ha.$setSize(Math.max(this.ga[1],this.j),Math.max(this.ga[3],this.m)),this.d.style.width=this.ha.j+"px",this.d.style.height=this.ha.m+"px"}},dhx.Scrollable,dhx.ui.view);dhx.CanvasMgr=function(a){var b=dhx.CanvasMgr.prototype.qc;!b[a]&&document.getCSSCanvasContext&&(b[a]=!0,dhx.CanvasMgr.prototype[a](b))}; -dhx.CanvasMgr.prototype={buttonGrd:["#fefefe","#e0e0e0","#e5e5e5","#e0e0e0",32],qc:[],Pa:function(a,b,c,d,e){var f=document.getCSSCanvasContext("2d",d,18,c),g=f.createLinearGradient(0,0,0,c);g.addColorStop(0,a);g.addColorStop(1,b);f.fillStyle=g;f.strokeStyle="#93B0BA";f.lineWidth=2;e?(f.moveTo(0,0.5),f.lineTo(17.5,c/2+0.5),f.lineTo(0,c-0.5),f.lineTo(0,0.5)):(f.moveTo(18,0.5),f.lineTo(0.5,c/2+0.5),f.lineTo(18,c-0.5),f.lineTo(18,0.5));f.stroke();f.fill()},dhxArrowLeftT:function(){this.Pa(this.buttonGrd[2], -this.buttonGrd[3],this.buttonGrd[4],"dhxArrowLeftT")},dhxArrowRightT:function(){this.Pa(this.buttonGrd[2],this.buttonGrd[3],this.buttonGrd[4],"dhxArrowRightT",!0)},dhxArrowLeft:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowLeft");dhx.CanvasMgr("dhxArrowLeftT")},dhxArrowRight:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowRight",!0);dhx.CanvasMgr("dhxArrowRightT")}}; -dhx.attachEvent("onClick",function(a){var b=dhx.ui.get(a);if(b&&b.touchable){b.getNode(a);var c=a.target||a.srcElement,d="",e=null,f=!1;if(!(c.className&&c.className.indexOf("dhx_view")===0)){for(;c&&c.parentNode;){if(c.getAttribute){if(c.getAttribute("view_id"))break;if(d=c.className)if(d=d.split(" "),d=d[0]||d[1],b.on_click[d]){var g=b.on_click[d].call(b,a,b.a.id,c);if(g===!1)return}}c=c.parentNode}if(b.a.click){var h=dhx.toFunctor(b.a.click);h&&h.call&&h.call(b,b.a.id,a)}if(b.a.multiview){var i= -dhx.ui.get(b.a.multiview);i&&i.show&&i.show()}if(b.a.popup){var j=dhx.ui.get(b.a.popup);j.a.master=b.a.id;j.show(b.getInput()||b.getNode(),j.h.a.align||"bottom",!0)}b.callEvent("onItemClick",[b.a.id,a])}}}); -dhx.protoUI({name:"button",touchable:!0,defaults:{template:"
",height:42,label:"label",s:10},$init:function(a){this.data=this.a;this.d=this.b;dhx.sa&&(dhx.sa.elements[a.name||a.id]=this,this.mapEvent({onbeforetabclick:dhx.sa,onaftertabclick:dhx.sa,onitemclick:dhx.sa}));a.type=="prev"&&dhx.CanvasMgr("dhxArrowLeft");a.type=="next"&&dhx.CanvasMgr("dhxArrowRight")},type_setter:function(a){this.a.template=dhx.Template(this.pd[a][0]); -var b=this.pd[a][1];if(b)this.a.s=b},pd:{round:["
"],"default":["
"],form:[function(a){return"
"}],prev:["
",28],next:["
",28],big:["
",28],biground:["
", -28]},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.render()},K:function(a){this.a.label=a;this.getInput().value=a},getValue:function(){return this.d.childNodes.length>0?this.ab():this.a.value},setValue:function(a){var b=this.a.value;this.a.value=a;if(this.d.childNodes.length>0)this.Md=a,this.K(a),this.callEvent("onChange",[a,b])},focus:function(){this.getInput().focus()},ab:function(){return this.a.label||""},getInput:function(){return this.d.getElementsByTagName("input")[0]}, -J:function(){return this.getInput()},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.s+"px":this.J().style.width=this.j-this.a.s+"px"},render:function(){if(dhx.AtomRender.render.call(this)){this.Z();if(this.a.align)switch(this.a.align){case "right":this.d.firstChild.style.cssFloat=this.d.firstChild.style.styleFloat="right";break;case "center":this.d.firstChild.style.display="inline-block";this.d.firstChild.parentNode.style.textAlign="center";break;case "middle":this.d.firstChild.style.marginTop= -Math.round((this.m-40)/2)+"px";break;case "bottom":this.d.firstChild.style.marginTop=this.m-40+"px";break;case "left":this.d.firstChild.parentNode.style.textAlign="left"}this.Aa&&this.Aa(this.data);this.Md!=this.a.value&&this.setValue(this.a.value)}},refresh:function(){this.render()},on_click:{Ib:function(a,b){var c=dhx.html.locate(a,"button_id");if(c&&this.callEvent("onBeforeTabClick",[b,c])){this.a.selected=c;this.refresh();if(this.a.multiview){var d=dhx.ui.get(c);d&&d.show&&d.show()}this.callEvent("onAfterTabClick", -[b,c])}},dhx_el_segmented:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_el_tabbar:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_inp_counter_next:function(){this.next(this.a.step,this.a.min,this.a.max)},dhx_inp_counter_prev:function(){this.prev(this.a.step,this.a.min,this.a.max)},dhx_inp_toggle_left_off:function(){var a=this.a.options;this.setValue(a[0].value)},dhx_inp_toggle_right_off:function(){var a=this.a.options;this.setValue(a[1].value)},dhx_inp_combo:function(a,b,c){c.focus()},dhx_inp_checkbox_border:function(){this.toggle()}, -dhx_inp_checkbox_label:function(){this.toggle()},dhx_inp_radio_border:function(a){var b=dhx.html.locate(a,"radio_id");this.setValue(b)},dhx_inp_radio_label:function(a,b,c){c=c.parentNode.getElementsByTagName("input")[0];return this.on_click.dhx_inp_radio_border.call(this,c,b,c)}},Ba:function(a){for(var b=0;b #label#",label:""},Z:function(){}},dhx.ui.button);dhx.protoUI({name:"label",defaults:{template:"
#label#
"},focus:function(){return!1},J:function(){return this.d.firstChild},K:function(a){this.a.label=a;this.d.firstChild.innerHTML=a}},dhx.ui.button); -dhx.protoUI({name:"icon",defaults:{template:"
",width:42},Z:function(){}},dhx.ui.button); -dhx.protoUI({name:"segmented",defaults:{template:function(a,b){var c=a.options,d="",e;b.Ba(c);if(!a.selected)a.selected=c[0].value;for(var f=0;f"+c[f].label+"";return"
"+d+"
"},s:28,nb:0},K:function(a){if(this.d&& -this.d.firstChild)for(var b=this.d.firstChild.childNodes,c=0;c";d+=h?""+c[f].label+"":"
"+ -c[f].label+"";d+=""}return"
"+d+"
"},s:4}},dhx.ui.segmented); -dhx.protoUI({name:"text",wd:!0,$b:function(a,b,c){c.labelPosition=="left"?a+=b:a=b+a;return"
"+a+"
"},pb:function(a,b,c,d){var e=a.inputAlign||"left",f=a.labelAlign||"left",g=dhx.uid(),h="
";h+="
";var i=this.a.inputWidth-this.a.labelWidth-18;i<0&&(i= -0);h+=d?"
"+(a.text||a.value||"")+"
":"";h+="
";return"
"+h+"
"},qb:function(a, -b){if(!a.label)return"";var c=a.labelAlign||"left";return"
"+a.label+"
"},defaults:{template:function(a,b){return b.pb(a,"text")},labelWidth:80,s:28,nb:0},type_setter:function(a){return a},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.labelWidth-this.a.s+"px":this.J().style.width=this.j-this.a.labelWidth-this.a.s-this.a.nb+"px"},focus:function(){var a=this.d.getElementsByTagName("input")[0]; -a&&a.focus()},K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.button); -dhx.protoUI({name:"toggle",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=b.a.inputWidth/2||"auto",e=[c[0].width||d,c[1].width||d],f=b.qb(a,"toggle"),g="";g+="";return b.$b(f,g,a)},label:"",labelWidth:0,s:20},Z:function(){},Aa:function(a){this.setValue(a.value)},$a:function(){return this.d.getElementsByTagName("input")}, -K:function(a){var b=this.$a(),c=this.a.options;a==c[1].value?(b[0].className="dhx_inp_toggle_left_off",b[1].className="dhx_inp_toggle_right_on"):(b[0].className="dhx_inp_toggle_left_on",b[1].className="dhx_inp_toggle_right_off")},ab:function(){var a=this.$a(),b=this.a.options;return a[0].className=="dhx_inp_toggle_left_on"?b[0].value:b[1].value}},dhx.ui.text); -dhx.protoUI({name:"input",defaults:{attributes:["maxlength","disabled","placeholder"],template:function(a,b){for(var c=""+c+""},s:28,labelWidth:0}},dhx.ui.text); -dhx.protoUI({name:"select",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=""+c[e].label+"";d+="";return"
"+d+"
"},labelWidth:0,nb:0,s:10},getInput:function(){return this.d.firstChild.firstChild}},dhx.ui.text); -dhx.protoUI({name:"textarea",defaults:{template:function(a){return"
"},cssContant:28},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.cssContant+"px":this.J().style.width=this.j-this.a.nb-this.a.cssContant+"px";this.a.inputHeight?this.J().style.height=this.a.inputHeight+"px":this.J().style.height=this.m-9+"px"},getInput:function(){return this.d.firstChild.firstChild}, -K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.text); -dhx.protoUI({name:"counter",defaults:{template:function(a,b){var c=a.value||0,d=b.qb(a,"counter"),e="";e+="
"+c+"
";e+="";return b.$b(d,e,a)},min:1,step:1,labelWidth:0,label:"",s:145},J:function(){return this.getInput().parentNode},getLabel:function(){return this.getInput().previousSibling||this.getInput().parentNode.lastChild},Z:function(){if(this.a.label&& -!this.a.labelWidth){var a=this.getLabel();if(a)a.style.width=(this.a.inputWidth||this.j)-this.a.s+"px"}},K:function(a){this.getInput().nextSibling.innerHTML=a},getValue:function(){return(this.a.value||0)*1},next:function(a,b,c){a=a||1;this.kd(a,b,c)},prev:function(a,b,c){a=-1*(a||1);this.kd(a,b,c)},kd:function(a,b,c){var b=typeof b=="undefined"?-Infinity:b,c=typeof c=="undefined"?Infinity:c,d=this.getValue()+a;d>=b&&d<=c&&this.setValue(d)}},dhx.ui.text); -dhx.protoUI({name:"checkbox",defaults:{template:function(a,b){var c=a.value?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden",d="
",e=b.qb(a,"checkbox");return b.$b(e,d,a)}},K:function(a){var b=this.getInput();b.className=a?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden"},toggle:function(){this.setValue(!this.getValue())},getLabel:function(){var a=this.getInput().parentNode;return a.nextSibling||a.previousSibling}, -getValue:function(){return this.a.value?1:0},J:function(){return this.getInput().parentNode.parentNode}},dhx.ui.counter); -dhx.protoUI({name:"radio",defaults:{template:function(a,b){b.Ba(a.options);for(var c=[],d=0;d");var e="
";a.label=a.options[d].label;var f=b.qb(a,"radio");a.labelPosition=="left"?c.push(f+e):c.push(e+f)}return"
"+ -c.join("
")+"
"}},$getSize:function(){var a=dhx.ui.button.prototype.$getSize.call(this);if(this.a.options){for(var b=1,c=0;c]*>/g,""):this.getInput().innerHTML=c},getValue:function(){return this.a.value}},dhx.ui.text); -dhx.protoUI({name:"combo",defaults:{template:function(a,b){return b.pb(a,"combo")},filter:function(a,b){return a.value.toString().toLowerCase().indexOf(b.toLowerCase())===0?!0:!1}},Y:function(a){a.popup||this.Cb("list",a);this.dc();dhx.event(this.d,"keydown",function(b){var b=b||event,c=b.target||b.srcElement,d=dhx.ui.get(a.popup);window.clearTimeout(d.key_timer);var e=this;d.key_timer=window.setTimeout(function(){d.h.filter(function(a){return e.a.filter.apply(e,[a,c.value])});var a=dhx.ui.get(d.a.master); -a.a.value=d.h.dataCount()==1&&d.h.type.template(d.h.item(d.h.first()))==c.value?d.h.first():""},200);d.show(c,d.h.a.align||"bottom",!0)},this);this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)}},dhx.ui.richselect); -dhx.protoUI({name:"datepicker",defaults:{template:function(a,b){return b.pb(a,"list",!0,!0)}},Y:function(a){a.popup||this.Cb("calendar",a);var b=dhx.ui.get(a.popup);b.h.attachEvent("onDateSelect",function(a){var b=dhx.ui.get(this.getParent().a.master);this.getParent().hide();b.setValue(a)});this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)},K:function(a){var b=dhx.ui.get(this.a.popup.toString()),c=b.h;typeof a=="string"&&a&&(a=(this.a.dateFormat||dhx.i18n.dateFormatDate)(a)); -c.selectDate(a,!0);this.a.value=a?c.config.date:"";this.getInput().innerHTML=a?(this.a.dateFormatStr||dhx.i18n.dateFormatStr)(this.a.value):""},dateFormat_setter:function(a){this.a.dateFormatStr=dhx.Date.dateToStr(a);return dhx.Date.strToDate(a)},getValue:function(){return this.a.value||null}},dhx.ui.richselect); -dhx.ValidateData={validate:function(a){var b=!0,c=this.a.rules;if(c){var d=c.$obj;!a&&this.getValues&&(a=this.getValues());if(d&&!d.call(this,a))return!1;var e=c.$all,f;for(f in c)f.indexOf("$")!==0&&(c[f].call(this,a[f],a,f)&&(!e||e.call(this,a[f],a,f))?this.callEvent("onValidationSuccess",[f,a])&&this.tc&&this.tc(f,a):(b=!1,this.callEvent("onValidationError",[f,a])&&this.Lc&&this.Lc(f,a)))}return b}}; -dhx.rules={isNumber:function(a){return parseFloat(a)==a},isNotEmpty:function(a){return a=="0"||a}}; -dhx.RenderStack={$init:function(){this.F=document.createElement("DIV");this.data.attachEvent("onIdChange",dhx.bind(this.Zb,this));this.attachEvent("onItemClick",this.Dd);if(!this.types)this.types={"default":this.type},this.type.name="default";this.type=dhx.copy(this.types[this.type.name])},customize:function(a){dhx.Type(this,a)},type_setter:function(a){this.types[a]?(this.type=dhx.copy(this.types[a]),this.type.css&&(this.g.className+=" "+this.type.css)):this.customize(a);return a},template_setter:function(a){this.type.template= -dhx.Template(a)},xa:function(a){this.callEvent("onItemRender",[a]);return this.type.templateStart(a,this.type)+(a.$template?this.type["template"+a.$template]:this.type.template)(a,this.type)+this.type.templateEnd(a,this.type)},ld:function(a){this.F.innerHTML=this.xa(a);return this.F.firstChild},Zb:function(a,b){var c=this.pa(a);c&&(c.setAttribute(this.ma,b),this.B[b]=this.B[a],delete this.B[a])},Dd:function(){if(this.a.click){var a=dhx.toFunctor(this.a.click);a&&a.call&&a.apply(this,arguments)}}, -pa:function(a){if(this.B)return this.B[a];this.B={};for(var b=this.d.childNodes,c=0;c0&&(!this.r||!this.a.scroll))this.a.height=a[3];if(a[1]>0&&(this.r||!this.a.scroll))this.a.width=a[1];a=dhx.ui.view.prototype.$getSize.call(this);if(a[3]<=0&&this.Db> -0)a[3]=this.Db,a[2]=0;return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.apply(this,arguments);dhx.ui.baselayout.prototype.$setSize.call(this,this.j,this.m)},render:function(){if(this.isVisible(this.a.id)&&this.fc)this.setValues(this.fc),this.fc=null},refresh:function(){this.render()},type_setter:function(a){this.g.className+=" dhx_"+a.toLowerCase()}},dhx.Scrollable,dhx.AtomDataLoader,dhx.Values,dhx.ui.baselayout,dhx.EventSystem,dhx.ValidateData); -dhx.protoUI({name:"form",defaults:{scroll:!0},Db:-1,Vc:function(a){this.g.className+=" dhx_form";if(a.elements)this.Q=a.elements,this.r=!0;delete a.elements;dhx.sa=this},type_setter:function(){}},dhx.ui.toolbar); -dhx.MouseEvents={$init:function(){this.on_click&&dhx.event(this.g,"click",this.me,this);this.on_context&&dhx.event(this.g,"contextmenu",this.ne,this);this.on_dblclick&&dhx.event(this.g,"dblclick",this.oe,this);this.on_mouse_move&&(dhx.event(this.g,"mousemove",this.Rc,this),dhx.event(this.g,dhx.env.isIE?"mouseleave":"mouseout",this.Rc,this))},me:function(a){return this.Ja(a,this.on_click,"ItemClick")},oe:function(a){return this.Ja(a,this.on_dblclick,"ItemDblClick")},ne:function(a){if(this.Ja(a,this.on_context, -"BeforeContextMenu"))return this.Ja(a,{},"AfterContextMenu"),dhx.html.preventEvent(a)},Rc:function(a){dhx.env.isIE&&(a=document.createEventObject(event));this.Nc&&window.clearTimeout(this.Nc);this.callEvent("onMouseMoving",[a]);this.Nc=window.setTimeout(dhx.bind(function(){a.type=="mousemove"?this.pe(a):this.qe(a)},this),500)},pe:function(a){this.Ja(a,this.on_mouse_move,"MouseMove")||this.callEvent("onMouseOut",[a||event])},qe:function(a){this.callEvent("onMouseOut",[a||event])},Ja:function(a,b,c){for(var a= -a||event,d=a.target||a.srcElement,e="",f=null,g=!1;d&&d.parentNode;){if(!g&&d.getAttribute&&(f=d.getAttribute(this.ma))){d.getAttribute("userdata")&&this.callEvent("onLocateData",[f,d]);if(!this.callEvent("on"+c,[f,a,d]))return;g=!0}if(e=d.className)if(e=e.split(" "),e=e[0]||e[1],b[e]){var h=b[e].call(this,a,f||dhx.html.locate(a,this.ma),d);if(typeof h!="undefined"&&h!==!0)return}d=d.parentNode}return g}}; -dhx.SelectionModel={$init:function(){this.i=dhx.toArray();this.data.attachEvent("onStoreUpdated",dhx.bind(this.Pd,this));this.data.attachEvent("onStoreLoad",dhx.bind(this.Od,this));this.data.attachEvent("onAfterFilter",dhx.bind(this.Nd,this));this.data.attachEvent("onChangeId",dhx.bind(this.Zd,this))},Zd:function(a,b){for(var c=this.i.length-1;c>=0;c--)this.i[c]==a&&(this.i[c]=b)},Nd:function(){for(var a=this.i.length-1;a>=0;a--){if(this.data.indexById(this.i[a])<0)var b=this.i[a];var c=this.item(b); -c&&delete c.$selected;this.i.splice(a,1);this.callEvent("onSelectChange",[b])}},Pd:function(a,b,c){if(c=="delete")this.i.remove(a);else if(!this.data.dataCount()&&!this.data.p)this.i=dhx.toArray()},Od:function(){this.a.select&&this.data.each(function(a){a.$selected&&this.select(a.id)},this)},ub:function(a,b,c){if(!c&&!this.callEvent("onBeforeSelect",[a,b]))return!1;this.data.item(a).$selected=b;c?c.push(a):(b?this.i.push(a):this.i.remove(a),this.Vb(a));return!0},select:function(a,b,c){if(!a)return this.selectAll(); -if(dhx.isArray(a))for(var d=0;d100||a.length>this.data.dataCount/ -2},Vb:function(a){typeof a!="object"&&(a=[a]);if(a.length){if(this.ee(a))this.data.refresh();else for(var b=0;b=0?b[c]:null},nextSibling:function(a){var b=this.branch[this.item(a).$parent],c=dhx.PowerArray.find.call(b,a)+1;return c0&&this.groupBy(g,f[l],!0,l,e+1)}else{var n= -arguments,g=[];this.branch={0:[]};for(l=n.length-1;l>=0;l--)g.push(n[l]);this.groupBy(g,this.pull,!0,"0",0);this.refresh()}}};dhx.animate=function(a,b){if(dhx.isArray(a))for(var c=0;c1){for(var d=0;d=0;b--)dhx.html.remove(a[b])}}; -dhx.protoUI({name:"list",$init:function(){this.data.provideApi(this,!0)},defaults:{select:!1,scroll:!0},ma:"dhx_l_id",on_click:{dhx_list_item:function(a,b){if(this.a.select)this.ra=!0,this.a.select=="multiselect"?this.select(b,a.ctrlKey,a.shiftKey):this.select(b),this.ra=!1}},$getSize:function(){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+this.type.margin)*2;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+1)*(this.a.yCount=="auto"? -this.dataCount():this.a.yCount);return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments)},type:{css:"",widthSize:function(a,b){return b.width+(b.width>-1?"px":"")},heightSize:function(a,b){return b.height+(b.height>-1?"px":"")},template:dhx.Template("#value#"),width:"auto",height:22,margin:0,padding:10,border:1,templateStart:dhx.Template("
"), -templateEnd:dhx.Template("
")}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.ui.proto); -dhx.protoUI({name:"grouplist",defaults:{animate:{}},$init:function(){dhx.extend(this.data,dhx.TreeStore,!0);this.data.provideApi(this,!0);this.data.attachEvent("onClearAll",dhx.bind(this.Qc,this));this.b.className+=" dhx_grouplist";this.Qc()},Qc:function(){this.aa=[];this.z=[]},on_click:{dhx_list_item:function(a,b){if(this.oa)return!1;for(var c=0;c"), -templateBack:dhx.Template("< #value#"),templateItem:dhx.Template("#value#"),templateGroup:dhx.Template("#value#"),templateEnd:function(a){var b="";a.$count&&(b+="
");b+="";return b}},showItem:function(a){var b,c;if(a&&(b=this.item(a),c=b.$parent,b.$count))c=b.id;this.aa=this.data.branch[c||0];for(this.z=[];c;)this.item(c).$template="Back",this.z.unshift(c),c=this.item(c).$parent;this.ra=!0;this.render();this.ra=!1;dhx.RenderStack.showItem.call(this,a)}},dhx.ui.list); -dhx.Type(dhx.ui.grouplist,{}); -dhx.protoUI({name:"pagelist",defaults:{scroll:"x",panel:!1,scrollOffset:0},Yd:!0,$init:function(a){this.b.className+=" dhx_pagelist";a.scroll=a.scroll=="y"?"y":"x";this.type.layout=a.scroll;this.attachEvent("onAfterRender",this.Ie);this.$ready.push(this.zb);this.l=0},zb:function(){if(this.a.scroll=="x")this.d.style.height="100%";this.type.layout=this.a.scroll;this.attachEvent("onAfterScroll",this.Ld)},Ie:function(){if(this.a.scroll=="x")this.d.style.width=(this.type.width+(this.type.padding+this.type.margin)* -2+this.type.border)*this.dataCount()+"px";this.a.panel&&this.Wb()},panel_setter:function(a){a&&(this.b.className+=" hidden_scroll",a===!0&&(a={}),this.Ia(a,{size:16,itemSize:16,align:"bottom"}));return a},bd:function(a){var b=this.indexById(a);if(typeof b!="undefined"&&this.a.panel)this.l=b,this.Xb()},getActive:function(){return this.l?this.data.order[this.l]:this.first()},Ld:function(a){var b=(this.a.scroll=="y"?this.type.height:this.type.width)+(this.type.padding+this.type.margin)*2+this.type.border, -c=this.a.scroll=="y"?this.d.scrollHeight-this.m:this.d.scrollWidth-this.j,d;this.a.scroll=="y"?(d=Math.round(a.f/b),a.f=d*b,a.f=this.uc(a.f,c)):(d=Math.round(a.e/b),a.e=d*b,a.e=this.uc(a.e,c));this.l=-d;this.a.panel&&this.Xb();return!0},uc:function(a,b){var c=this.a.scrollOffset;if(c&&Math.abs(a)>c){var d=dhx.Touch.A[dhx.Touch.H]>dhx.Touch.w[dhx.Touch.H];a+=d?c:1-c}Math.abs(a)>b&&(a=-b);return a},$getSize:function(){if(this.a.scroll=="y"){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+ -this.type.margin)*2+this.type.border;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+this.type.border)*(this.a.yCount=="auto"?this.dataCount():this.a.yCount)}else if(this.type.height!="auto")this.a.height=this.type.height+(this.type.padding+this.type.margin)*2+this.type.border;return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.apply(this,arguments)){if(this.type.fullScreen)this.type.width=this.j,this.type.height= -this.m,this.type.padding=0,this.render();this.a.panel&&this.Wb()}},type:{templateStart:function(a,b){var c="dhx_list_item dhx_list_"+b.css+"_item"+(a.$selected?"_selected":""),d="width:"+b.width+"px; height:"+b.height+"px; padding:"+b.padding+"px; margin:"+b.margin+"px; overflow:hidden;"+(b.layout&&b.layout=="x"?"float:left;":"");return"
"}}},dhx.ui.list,dhx.CarouselPanel); -dhx.protoUI({name:"multiview",defaults:{animate:{}},$init:function(){this.l=0;this.r=1;this.b.style.position="relative";this.b.className+=" dhx_multiview";this.M=[]},xd:function(a,b){var c=dhx.ui.get(a);if(!c.La)c.rb=[],c.La={};c.La[b]||(c.La[b]=!0,c.rb.push(b))},Yb:function(a){var b=dhx.ui.get(a);this.M[this.M.length-2]!=a?(this.M.length==10&&this.M.splice(0,1),this.M.push(a)):this.M.splice(this.M.length-1,1);if(b.La){for(var c=0;c-1)a[3]=this.a.height,a[2]= -0;if(this.a.width>-1)a[1]=this.a.width,a[0]=0;a[0]&&(a[1]=0);a[2]&&(a[3]=0);return a},$setSize:function(a,b){dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.c[this.l].$setSize(a,b)},isVisible:function(a,b){return b&&b!=this.getActive()?(a&&this.xd(b,a),!1):dhx.ui.view.prototype.isVisible.call(this,a,this.a.id)},getActive:function(){return this.c.length?this.c[this.l].a.id:null},back:function(a){a=a||1;if(this.callEvent("onBeforeBack",[this.getActive(),a])&&this.M.length>a){var b=this.M[this.M.length- -a-1];dhx.ui.get(b).show();return b}return null}},dhx.ui.baselayout,dhx.EventSystem);dhx.html.addMeta=function(a,b){document.getElementsByTagName("head").item(0).appendChild(dhx.html.create("meta",{name:a,content:b}))}; -(function(){var a=function(){var a=!!(window.orientation%180);if(dhx.ui.orientation!==a)dhx.ui.orientation=a,dhx.callEvent("onRotate",[a])};dhx.ui.orientation=!!((dhx.isNotDefined(window.orientation)?90:window.orientation)%180);dhx.event(window,"onorientationchange"in window?"orientationchange":"resize",a);dhx.ui.fullScreen=function(){dhx.html.addMeta("apple-mobile-web-app-capable","yes");dhx.html.addMeta("viewport","initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no");if(dhx.env.touch){var b= -document.body.offsetHeight,c=navigator.userAgent.indexOf("iPhone")!=-1,d=c&&(b==356||b==208||b==306||b==158),e=function(){if(c)dhx.ui.orientation?(b=480,e=d?268:300):(b=320,e=d?416:460);else{document.body.style.width=document.body.style.height="1px";document.body.style.overflow="hidden";var a=window.outerWidth/window.innerWidth,b=window.outerWidth/a,e=window.outerHeight/a}document.body.style.height=e+"px";document.body.style.width=b+"px";dhx.ui.yc=!1;dhx.ui.resize();dhx.delay(function(){window.scrollTo(0, -1)})},f=function(){dhx.ui.yc=!0;dhx.env.isSafari?e():dhx.delay(e,null,[],500)};dhx.attachEvent("onClick",function(a){a.target.tagName=="INPUT"||a.target.tagName=="TEXTAREA"||a.target.tagName=="SELECT"||(d&&window.innerHeight<416||!d&&window.innerHeight0;)c=this.Ve[a%16]+c,a=Math.floor(a/16);for(;c.length0?c[0].substr(f,e):c[0].substr(0,e+f),d=g+(d?b.groupDelimiter+d:"")}while(f>0);return d+b.decimalDelimeter+c[1]},numToStr:function(a){return function(b){return dhx.Number.format(b,a)}}}; -dhx.Date={Locale:{month_full:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),month_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),day_full:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(",")},weekStart:function(a){var b=a.getDay();this.config.start_on_monday&&(b===0?b=6:b--);return this.date_part(this.add(a,-1*b,"day"))},monthStart:function(a){a.setDate(1);return this.date_part(a)}, -yearStart:function(a){a.setMonth(0);return this.month_start(a)},dayStart:function(a){return this.date_part(a)},dateToStr:function(a,b){a=a.replace(/%[a-zA-Z]/g,function(a){switch(a){case "%d":return'"+dhx.math.toFixed(date.getDate())+"';case "%m":return'"+dhx.math.toFixed((date.getMonth()+1))+"';case "%j":return'"+date.getDate()+"';case "%n":return'"+(date.getMonth()+1)+"';case "%y":return'"+dhx.math.toFixed(date.getFullYear()%100)+"';case "%Y":return'"+date.getFullYear()+"';case "%D":return'"+dhx.Date.Locale.day_short[date.getDay()]+"'; -case "%l":return'"+dhx.Date.Locale.day_full[date.getDay()]+"';case "%M":return'"+dhx.Date.Locale.month_short[date.getMonth()]+"';case "%F":return'"+dhx.Date.Locale.month_full[date.getMonth()]+"';case "%h":return'"+dhx.math.toFixed((date.getHours()+11)%12+1)+"';case "%g":return'"+((date.getHours()+11)%12+1)+"';case "%G":return'"+date.getHours()+"';case "%H":return'"+dhx.math.toFixed(date.getHours())+"';case "%i":return'"+dhx.math.toFixed(date.getMinutes())+"';case "%a":return'"+(date.getHours()>11?"pm":"am")+"'; -case "%A":return'"+(date.getHours()>11?"PM":"AM")+"';case "%s":return'"+dhx.math.toFixed(date.getSeconds())+"';case "%W":return'"+dhx.math.toFixed(dhx.Date.getISOWeek(date))+"';default:return a}});b===!0&&(a=a.replace(/date\.get/g,"date.getUTC"));return new Function("date",'return "'+a+'";')},strToDate:function(a,b){for(var c="var temp=date.split(/[^0-9a-zA-Z]+/g);",d=a.match(/%[a-zA-Z]/g),e=0;e50?1900:2000);";break;case "%g":case "%G":case "%h":case "%H":c+="set[3]=temp["+e+"]||0;";break;case "%i":c+="set[4]=temp["+e+"]||0;";break;case "%Y":c+="set[0]=temp["+e+"]||0;";break;case "%a":case "%A":c+="set[3]=set[3]%12+((temp["+e+"]||'').toLowerCase()=='am'?0:12);";break;case "%s":c+="set[5]=temp["+e+"]||0;"}var f="set[0],set[1],set[2],set[3],set[4],set[5]";b&&(f=" Date.UTC("+f+")");return new Function("date", -"var set=[0,0,1,0,0,0]; "+c+" return new Date("+f+");")},getISOWeek:function(a){if(!a)return!1;var b=a.getDay();b===0&&(b=7);var c=new Date(a.valueOf());c.setDate(a.getDate()+(4-b));var d=c.getFullYear(),e=Math.floor((c.getTime()-(new Date(d,0,1)).getTime())/864E5),f=1+Math.floor(e/7);return f},getUTCISOWeek:function(a){return this.getISOWeek(a)},add:function(a,b,c){var d=new Date(a.valueOf());switch(c){case "day":d.setDate(d.getDate()+b);break;case "week":d.setDate(d.getDate()+7*b);break;case "month":d.setMonth(d.getMonth()+ -b);break;case "year":d.setYear(d.getFullYear()+b);break;case "hour":d.setHours(d.getHours()+b);break;case "minute":d.setMinutes(d.getMinutes()+b)}return d},datePart:function(a){var b=this.copy(a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);return b},timePart:function(a){var b=this.copy(a);return(b.valueOf()/1E3-b.getTimezoneOffset()*60)%86400},copy:function(a){return new Date(a.valueOf())}};dhx.i18n.setLocale("en");dhx.format=function(a){a=a||{};this.$init(a)}; -dhx.format.prototype={$init:function(a){this.a={};this.a.groupDelimiter=a.groupDelimiter||" ";this.a.groupNumber=a.groupNumber||3;this.a.decimalPoint=a.decimalPoint||",";this.a.fractNumber=a.fractNumber||5;this.a.dateFormat=a.dateFormat||"%Y/%m/%d";this.a.stringTemplate=a.stringTemplate||"{value}";this.ff=dhx.Date.str_to_date(this.a.dateFormat);this.Qd=dhx.Date.date_to_str(this.a.dateFormat)},define:function(a,b){this.a[a]=b},format:function(a,b){b=b||this.formatAutoDefine(a);return this["format__"+ -b]?this["format__"+b](a):a},formatAutoDefine:function(a){return typeof a=="number"||a instanceof Number?"number":a instanceof Date?"date":typeof a=="string"||a instanceof String?isNaN(parseFloat(a))?"string":"number":!1},format__number:function(a){var b="";typeof a=="number"||a instanceof Number||(a=parseFloat(a));var c=a.toFixed(this.a.fractNumber).toString(),c=c.split("."),d=this.add_delimiter_to_int(c[0]),e=this.str_reverse(this.add_delimiter_to_int(this.str_reverse(c[1])));return b=d+this.a.decimalPoint+ -e},add_delimiter_to_int:function(a){for(var b=0,c="",d=a.length-1;d>=0;d--)c=a[d]+c,b++,b==this.a.groupNumber&&(c=this.a.groupDelimiter+c,b=0);return c},str_reverse:function(a){for(var b="",c=a.length-1;c>=0;c--)b+=a[c];return b},format__date:function(a){var b=this.Qd(a);return b},attachFormat:function(a,b){this["format__"+a]=b},format__string:function(a){var b=this.a.stringTemplate.replace("{value}",a);return b},format__bold:function(a){return typeof a=="string"||a instanceof String?a.bold():a}}; -dhx.i18n.setLocale(); -dhx.protoUI({name:"calendar",defaults:{date:null,startOnMonday:!0,navigation:!0,weekHeader:!1,weekNumber:!1,timeSelect:!1,skipEmptyWeeks:!0,cellHeight:36,minuteStep:15,hourStart:6,hourEnd:24,hourFormat:"%H",calendarHeader:"%F %Y",calendarDay:"%d",calendarWeekHeader:"W#",calendarWeek:"%W",width:300,height:300,selectedCss:"dhx_cal_selected_day"},skin:{monthHeaderHeight:40,weekHeaderHeight:20,timeSelectHeight:32},hourFormat_setter:dhx.Date.dateToStr,calendarHeader_setter:dhx.Date.dateToStr,calendarDay_setter:dhx.Date.dateToStr, -calendarWeekHeader_setter:dhx.Date.dateToStr,calendarWeek_setter:dhx.Date.dateToStr,date_setter:function(a){typeof a=="string"&&(a=dhx.i18n.fullDateFormatDate(a));this.L=this.L||a;return a},$init:function(){this.fa={};this.ec=[];var a="%Y-%m-%d";this.rc=dhx.Date.dateToStr(a);this.Cd=dhx.Date.strToDate(a)},$getSize:function(){var a=this.a;if(a.cellHeight>0)a.height=this.Xd();return dhx.ui.view.prototype.$getSize.call(this)},cellHeight_setter:function(a){return a=="auto"?0:a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this, -a,b)&&this.render()},Ac:function(){var a=this.a;if(!this.L)this.L=new Date;var b=new Date(this.L);b.setDate(1);var c=b.getDay();this.ke=new Date(b);this.vd=a.startOnMonday?1:0;this.lb=(c-this.vd+7)%7;this.Nb=32-(new Date(b.getFullYear(),b.getMonth(),32)).getDate();var d=42-this.lb-this.Nb;this.df=new Date(b.setDate(this.Nb));this.G=a.skipEmptyWeeks?6-Math.floor(d/7):6;this.Ob=this.G*7-this.lb-this.Nb;this.cf=new Date(b.setDate(b.getDate()+d));this.Dc=this.skin.monthHeaderHeight+(a.weekHeader?this.skin.weekHeaderHeight: -0)+(a.timeSelect?this.skin.timeSelectHeight:0)},Xd:function(){this.Ac();return this.Dc+this.G*this.a.cellHeight},Td:function(){this.Ac();var a=this.a;this.Da=[];this.W=[];var b=this.j;b+=1;for(var c=this.m,d=a.weekNumber?8:7,e=0;e";a.weekHeader&&(b+="
"+this.Xe()+"
");b+="
"+this.Bd()+"
";a.timeSelect&&(b+="
"+this.Ue()+"
");b+="
";this.g.innerHTML=b;if(a.timeSelect){for(var c=this.g.getElementsByTagName("select"),d=this.ec,e=0;e"+f+"";d+=this.W[0]}for(var g=0;g<7;g++){var h=(c+g)%7,i=dhx.Date.Locale.day_short[h], -j="dhx_cal_day_name",k=this.W[g+e]-1;g==6&&(j+=" dhx_cal_day_name_last",k+=1);h===0&&(j+=" dhx_sunday");h==6&&(j+=" dhx_saturday");b+="
"+i+"
";d+=this.W[g+e]}return b},Bd:function(){var a=this.a,b=0,c=dhx.Date.add(this.ke,-this.lb,"day"),c=dhx.Date.datePart(c),d=0,e="";if(a.weekNumber){var d=1,f=dhx.Date.add(c,(this.vd+1)%2,"day");e+='';for(var g= -0;g=7||g==this.G-2&&this.Ob==14))k="dhx_next_month",j="";g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="";f=dhx.Date.add(f,7,"day")}e+="
";e+="
"+j+"
";e+="
"}var o=dhx.Date.datePart(new Date);e+='';for(var m= -this.G*7-1,g=0;g";for(var l=0;l<7;l++){var n=a.calendarDay(c),p=this.rc(c),k="dhx_cal_day_num";bm-this.Ob&&(k="dhx_next_month",p=n="");h=this.Da[g]-2;i=this.W[l+d]-2;l==6&&(k+=" dhx_cal_day_num_rborder",i+=1);g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+=""; -c=dhx.Date.add(c,1,"day");b++}e+=""}e+="
";o.valueOf()==c.valueOf()&&(k+=" dhx_cal_current_day");e+="
"+n+"
";e+="
";return e},Ue:function(){for(var a=this.a,b="";b+="";return b},le:function(){var a="
";return a+"prev"+b+a+"next"+b},on_click:{dhx_cal_arrow:function(a,b,c){var d=c.className.match(/prev/i)?-1:1,e=new Date(this.L),f=new Date(e);f.setDate(1);f=dhx.Date.add(f,d,"month");this.callEvent("onBeforeMonthChange",[e,f])&&(this.showCalendar(f),this.selectDate(this.a.date,!1),this.callEvent("onAfterMonthChange",[f,e]))},dhx_cal_day_num:function(a,b,c){var d=c.getAttribute("date"),e=this.Cd(d);if(this.a.timeSelect){var f=this.ec;e.setMinutes(f[0].value*60+f[1].value* -1)}this.selectDate(e);this.callEvent("onDateSelect",[e]);this.callEvent("onChange",[e])}}},dhx.MouseEvents,dhx.Settings,dhx.EventSystem,dhx.Movable,dhx.ui.view);dhx.Modality={modal_setter:function(a){if(a){if(!this.qa)this.qa=dhx.html.create("div",{"class":a=="rich"?"dhx_modal_rich":"dhx_modal"}),this.qa.style.zIndex=dhx.ui.zIndex(),this.b.style.zIndex=dhx.ui.zIndex(),document.body.appendChild(this.qa)}else this.qa&&dhx.html.remove(this.qa),this.qa=null;return a}}; -dhx.protoUI({name:"window",$init:function(a){this.b.innerHTML="
";this.g=this.b.firstChild;this.eb=this.g.childNodes[0];this.pc=this.g.childNodes[1];this.b.className+=" dhx_window";this.R=this.h=null;this.a.k={top:!1,left:!1,right:!1,bottom:!1};if(!a.id)a.id=dhx.uid()},Zc:function(){this.h={destructor:function(){}}},ac:function(a){this.h.destructor();this.h=a;this.h.D=this;this.pc.appendChild(this.h.b); -this.resize()},show:function(a,b,c){this.a.hidden=!1;this.b.style.zIndex=dhx.ui.zIndex();this.a.modal&&this.modal_setter(!0);var d,e,f;if(a){typeof a=="object"&&!a.tagName?(d={x:a.clientX-this.$[0]/2,y:a.clientY},e=document.body.offsetWidth,f=1):a=dhx.toNode(a);var g=document.body.offsetWidth,h=document.body.offsetHeight;e=e||a.offsetWidth;f=f||a.offsetHeight;var i=this.$;d=d||dhx.html.offset(a);var j=6,k=6,o=6,c="top",m=0,l=0,n=0,p=0;b=="right"?(p=d.x+j+e,k=-f,c="left",m=Math.round(d.y+f/2),l=p- -o):b=="left"?(p=d.x-j-i[0]-1,k=-f,c="right",m=Math.round(d.y+f/2),l=p+i[0]+1):(p=g-d.x>i[0]?d.x:g-j-i[0],l=Math.round(d.x+e/2),l>p+i[0]&&(l=p+i[0]/2));h-f-d.y-k>i[1]?(n=f+d.y+k,m||(c="top",m=n-o)):(n=d.y-k-i[1],n<0?(n=0,c=!1):m||(c="bottom",n--,m=n+i[1]+1));this.setPosition(p,n);c&&this.cd&&this.cd(c,l,m)}this.Le=new Date;this.b.style.display="block";if(this.la){for(var q=0;q250&&this.hide()},$getSize:function(){var a=this.h.$getSize();if(a[3])this.a.height=a[3]+this.a.padding*2;if(a[1])this.a.width=a[1]+this.a.padding*2;if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)}, -$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j-this.a.padding*2,b=this.m-this.a.padding*2,this.g.style.padding=this.a.padding+"px",this.eb.style.display="none",this.h.$setSize(a,b)},body_setter:function(a){a=dhx.ui.window.prototype.body_setter.call(this,a);this.h.a.k={top:!1,left:!1,right:!1,bottom:!1};return a},defaults:{padding:8},head_setter:null,cd:function(a,b,c){this.Fc();document.body.appendChild(this.Ka=dhx.html.create("DIV",{"class":"dhx_point_"+a},"")); -this.Ka.style.zIndex=dhx.ui.zIndex();this.Ka.style.top=c+"px";this.Ka.style.left=b+"px"},Fc:function(){this.Ka=dhx.html.remove(this.Ka)}},dhx.ui.window); -dhx.protoUI({name:"alert",defaults:{position:"center",head:{template:"Info",css:"dhx_alert_template"},height:170,modal:!0,callback:null,body:{type:"clean",rows:[{template:"
#text#
",data:{text:"You have forgot to define the text :) "}},{view:"button",height:60,id:"dhx_alert_ok",type:"big",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}}]}},$init:function(){(!this.b.parentNode||!this.b.parentNode.tagName)&&document.body.appendChild(this.b);this.$ready.push(this.resize)}, -Yc:function(a){typeof a=="string"&&(a={title:this.defaults.head.template,message:a});dhx.extend(a,this.defaults);delete a.head;delete a.body;this.Rb(a,{});this.resize();this.show()},title_setter:function(a){this.R.define("template",a);this.R.render()},message_setter:function(a){var b=this.h.c[0];b.data={text:a};b.render()},labelOk_setter:function(a){var b=this.h.c[1];b.config.label=a;b.render()},labelCancel_setter:function(a){var b=this.h.c[2];b.config.label=a;b.render()},Bb:function(a){this.hide(); -this.a.callback&&dhx.toFunctor(this.a.callback).call(this,a,this.a.details)}},dhx.ui.window);dhx.alert=dhx.single(dhx.ui.alert); -dhx.protoUI({name:"confirm",defaults:{height:210,body:{type:"clean",rows:[{id:"dhx_confirm_message",template:"
#text#
",data:{text:"You have forgot to define the text :) "}},{height:53,view:"button",type:"big",id:"dhx_confirm_ok",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}},{height:55,view:"button",type:"biground",id:"dhx_confirm_cancel",label:"Cancel",click:function(){this.getParent().getParent().Bb(!1)}}]}}},dhx.ui.alert);dhx.confirm=dhx.single(dhx.ui.confirm); -dhx.dp=function(a){if(typeof a=="object"&&a.a)a=a.a.id;if(dhx.dp.Tb[a])return dhx.dp.Tb[a];if(typeof a=="string"||typeof a=="number")a={master:dhx.ui.get(a)};var b=new dhx.DataProcessor(a);return dhx.dp.Tb[b.a.master.a.id]=b};dhx.dp.Tb={}; -dhx.DataProcessor=dhx.proto({defaults:{autoupdate:!0,mode:"post"},$init:function(){this.V=[];this.bf=[];this.X=null;this.na=!1;this.name="DataProcessor";this.$ready.push(this.zb)},master_setter:function(a){var b=a;if(a.name!="DataStore")b=a.data;this.a.store=b;return a},zb:function(){this.a.store.attachEvent("onStoreUpdated",dhx.bind(this.Sc,this))},ignore:function(a,b){var c=this.na;this.na=!0;a.call(b||this);this.na=c},off:function(){this.na=!0},on:function(){this.na=!1},Kd:function(a){var b={}, -c;for(c in a)c.indexOf("$")!==0&&(b[c]=a[c]);return b},save:function(a,b){b=b||"update";this.Sc(a,this.a.store.item(a),b)},Sc:function(a,b,c){if(this.na===!0||!c)return!0;var d={id:a,data:this.Kd(b)};switch(c){case "update":d.operation="update";break;case "add":d.operation="insert";break;case "delete":d.operation="delete";break;default:return!0}if(d.operation!="delete"&&!this.validate(d.data))return!1;this.Gd(d)&&this.V.push(d);this.a.autoupdate&&this.send();return!0},Gd:function(a){for(var b=0;b< -this.V.length;b++){var c=this.V[b];if(c.id==a.id){if(a.operation=="delete")c.operation=="insert"?this.V.splice(b,1):c.operation="delete";c.data=a.data;return!1}}return!0},send:function(){this.Ge()},Ge:function(){if(this.a.url){for(var a=this.V,b=[],c=0;c=0&&this.V.splice(i,1),h.tid!=h.sid&&this.a.store.changeId(h.sid,h.tid),this.callEvent("onAfter"+h.type,[h])}this.callEvent("onAfterSync",[f,a,b,c])},escape:function(a){return this.a.escape?this.a.escape(a):encodeURIComponent(a)}},dhx.Settings,dhx.EventSystem,dhx.ValidateData); -(function(){var a=dhx.Touch={config:{longTouchDelay:1E3,scrollDelay:150,gravity:500,deltaStep:30,speed:"0ms",finish:1500},disable:function(){a.Fb=!0},enable:function(){a.Fb=!1},$init:function(){dhx.env.touch?(dhx.event(document.body,"touchstart",a.nd),dhx.event(document.body,"touchmove",a.gc),dhx.event(document.body,"touchend",a.md)):(a.bb=a.Wd,dhx.event(document.body,"mousedown",a.nd),dhx.event(document.body,"mousemove",a.gc),dhx.event(document.body,"mouseup",a.md),document.body.style.overflowX= -document.body.style.overflowY="hidden");dhx.event(document.body,"dragstart",function(a){return dhx.html.preventEvent(a)});dhx.event(document.body,"touchstart",function(b){if(!a.Fb&&dhx.env.isSafari)return b.srcElement.tagName=="SELECT"?!0:dhx.html.preventEvent(b)});a.Ca()},Ca:function(){a.A=a.w=a.ca=null;a.H=a.v=a.n=null;a.I={wb:0,xb:0,Na:0};if(a.Xa)dhx.html.removeCss(a.Xa,"dhx_touch"),a.Xa=null;window.clearTimeout(a.Kc);a.ud=!0;a.Sa=!0;a.Ta=!0;a.ic||a.ua()},md:function(b){if(a.A){if(a.H){var c=a.Hb(a.v), -d=c.e,e=c.f,f=a.config.finish,g=a.Bc(b,!0);if(g.Na){var h=d+a.config.gravity*g.wb/g.Na,i=e+a.config.gravity*g.xb/g.Na,j=a.q[0]?a.Wa(h,!1,!1,a.n.dx,a.n.px):d,k=a.q[1]?a.Wa(i,!1,!1,a.n.dy,a.n.py):e,o=Math.max(Math.abs(j-d),Math.abs(k-e));o<150&&(f=f*o/150);if(j!=d||k!=e)f=Math.round(f*Math.max((j-d)/(h-d),(k-e)/(i-e)));var m={e:j,f:k},l=dhx.ui.get(a.v);l&&l.callEvent&&l.callEvent("onAfterScroll",[m]);f=Math.max(100,f);d!=m.e||e!=m.f?(a.wa(a.v,m.e,m.f,f+"ms"),a.dd(m.e,m.f,f+"ms")):a.ua()}else a.ua()}else if(a.Ta&& -!a.Sa)a.ya("onSwipeX");else if(a.Sa&&!a.Ta)a.ya("onSwipeY");else if(dhx.env.isSafari){var n=a.A.target;dhx.delay(function(){var a=document.createEvent("MouseEvents");a.initEvent("click",!0,!0);n.dispatchEvent(a)})}a.ya("onTouchEnd");a.Ca()}},gc:function(b){if(a.A){var c=a.Bc(b);a.ya("onTouchMove");if(a.H)a.ed(c);else if(a.Sa=a.lc(c.Ye,"x",a.Sa),a.Ta=a.lc(c.Ze,"y",a.Ta),a.H){var d=a.Cc("onBeforeScroll");if(d){var e={};d.callEvent("onBeforeScroll",[e]);if(e.update)a.config.speed=e.speed,a.config.scale= -e.scale}a.ce(c)}return dhx.html.preventEvent(b)}},ed:function(){if(a.v){var b=a.Hb(a.v),c=b.e,d=b.f,e=a.ca||a.A;if(a.q[0])b.e=a.Wa(b.e-e.x+a.w.x,!0,b.e,a.n.dx,a.n.px);if(a.q[1])b.f=a.Wa(b.f-e.y+a.w.y,!0,b.f,a.n.dy,a.n.py);a.wa(a.v,b.e,b.f,"0ms");a.dd(b.e,b.f,"0ms")}},dd:function(b,c,d){var e=a.n.px/a.n.dx*-b,f=a.n.py/a.n.dy*-c;a.q[0]&&a.wa(a.q[0],e,0,d);a.q[1]&&a.wa(a.q[1],0,f,d)},wa:function(b,c,d,e){a.ic=!0;b.style[dhx.env.transformPrefix+"Transform"]=dhx.env.translate+"("+Math.round(c)+"px, "+ -Math.round(d)+"px"+(dhx.env.translate=="translate3d"?", 0":"")+")";b.style[dhx.env.transformPrefix+"TransitionDuration"]=e},Hb:function(a){var c=window.getComputedStyle(a)[dhx.env.transformPrefix+"Transform"];if(c=="none")return{e:0,f:0};else{if(window.WebKitCSSMatrix)return new WebKitCSSMatrix(c);for(var d=c.replace(/(matrix\()(.*)(\))/gi,"$2"),d=d.replace(/\s/gi,""),d=d.split(","),e={},f="a,b,c,d,e,f".split(","),g=0;g0)return c?d+h*Math.sqrt(g):0;var i=e-f;return i+a<0?c?d-Math.sqrt(-(a-d)):-i:a},ce:function(){a.H.indexOf("x")!=-1&&(a.q[0]=a.vc("x",a.n.dx,a.n.px,"width"));a.H.indexOf("y")!=-1&&(a.q[1]=a.vc("y",a.n.dy,a.n.py,"height"));if(!a.v.scroll_enabled){a.v.scroll_enabled=!0;a.v.parentNode.style.position="relative";var b=dhx.env.transformCSSPrefix;a.v.style.cssText+=b+"transition: "+b+"transform; "+b+"user-select:none; "+b+"transform-style:flat;";a.v.addEventListener(dhx.env.transitionEnd, -a.ua,!1)}window.setTimeout(a.ed,1)},vc:function(b,c,d,e){if(c-d<2)return a.H="";var f=dhx.html.create("DIV",{"class":"dhx_scroll_"+b},"");f.style[e]=d*d/c-7+"px";a.v.parentNode.appendChild(f);return f},lc:function(b,c,d){if(b>a.config.deltaStep){if(a.ud&&(a.he(c),(a.H||"").indexOf(c)==-1))a.H="";return!1}return d},ua:function(){if(!a.H)dhx.html.remove(a.q),a.q=[null,null];a.ic=!1},he:function(b){window.clearTimeout(a.Kc);a.ud=!1;a.Jc(b)},nd:function(b){if(!a.Fb){a.A=a.bb(b);a.ya("onTouchStart");a.q[0]|| -a.q[1]?a.Re(b,a.q[0]?"x":"y"):a.Kc=window.setTimeout(a.ie,a.config.longTouchDelay);var c=dhx.ui.get(b);if(c&&c.touchable&&(!b.target.className||b.target.className.indexOf("dhx_view")!==0))a.Xa=c.getNode(b),dhx.html.addCss(a.Xa,"dhx_touch")}},ie:function(){a.ya("onLongTouch");dhx.callEvent("onClick",[a.A]);a.Ca()},Re:function(b,c){a.Jc(c);var d=a.q[0]||a.q[1];if(d&&(!a.v||d.parentNode!=a.v.parentNode))a.Ca(),a.ua(),a.A=a.bb(b);a.gc(b)},Bc:function(b){a.ca=a.w;a.w=a.bb(b);a.I.Ye=Math.abs(a.A.x-a.w.x); -a.I.Ze=Math.abs(a.A.y-a.w.y);if(a.ca)a.w.time-a.ca.time";this.g=this.b.firstChild;this.map=null;this.$ready.push(this.render)},render:function(){var a=this.a,b={zoom:a.zoom,center:a.center,mapTypeId:a.mapType};this.map=new google.maps.Map(this.g,b)},center_setter:function(a){typeof a!="object"&&(a={});this.Ia(a,{x:48.724,y:8.215});a=new google.maps.LatLng(a.x,a.y);this.map&&this.map.setCenter(a);return a}, -mapType_setter:function(a){a=google.maps.MapTypeId[a];this.map&&this.map.setMapTypeId(a);return a},zoom_setter:function(a){this.map&&this.map.setZoom(a);return a},defaults:{zoom:5,center:{},mapType:"ROADMAP"},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments);google.maps.event.trigger(this.map,"resize")}},dhx.ui.view);if(!window.scheduler)window.scheduler={config:{},templates:{},xy:{},locale:{}};if(!scheduler.locale)scheduler.locale={}; -scheduler.locale.labels={list_tab:"List",day_tab:"Day",month_tab:"Month",icon_today:"Today",icon_save:"Save",icon_delete:"Delete event",icon_cancel:"Cancel",icon_edit:"Edit",icon_back:"Back",icon_close:"Close form",icon_yes:"Yes",icon_no:"No",confirm_closing:"Your changes will be lost, are your sure ?",confirm_deleting:"Event will be deleted permanently, are you sure?",label_event:"Event",label_start:"Start",label_end:"End",label_details:"Notes",label_from:"from",label_to:"to"}; -scheduler.config={init_date:new Date,form_date:"%d-%m-%Y %H:%i",xml_date:"%Y-%m-%d %H:%i",item_date:"%d.%m.%Y",header_date:"%d.%m.%Y",hour_date:"%H:%i",scale_hour:"%H",calendar_date:"%F %Y"};scheduler.config.form_rules={end_date:function(a,b){return b.start_date.valueOf()";if(dhx.Date.datePart(a.start_date).valueOf()==dhx.Date.datePart(a.end_date).valueOf()){var c=dhx.i18n.dateFormatStr(a.start_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
"+c+"
";b+="
"+scheduler.locale.labels.label_from+" "+d+" "+scheduler.locale.labels.label_to+ -" "+e+"
"}else{var f=dhx.i18n.longDateFormatStr(a.start_date),g=dhx.i18n.longDateFormatStr(a.end_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
"+scheduler.locale.labels.label_from+" "+d+" "+f+"
";b+="
"+scheduler.locale.labels.label_to+" "+e+" "+g+"
"}a.details&&a.details!==""&&(b+="
"+scheduler.locale.labels.label_details+"
",b+="
"+a.details+"
"); -b+="";return b},calendar_event:function(a){return a+"
"},event_date:function(a){return dhx.i18n.dateFormatStr(a)},event_long_date:function(a){return dhx.i18n.longDateFormatStr(a)},event_time:function(a){return dhx.i18n.timeFormatStr(a)},event_color:function(a){return a.color?"background-color:"+a.color:""},event_marker:function(a,b){return"
"},event_title:function(a,b){return"
"+ -b.dateStart(a.start_date)+"
"+b.timeStart(a.start_date)+"
"+b.marker(a,b)+"
"+a.text+"
"},month_event_title:function(a,b){return b.marker(a,b)+"
"+b.timeStart(a.start_date)+"
"+a.text+"
"},day_event:function(a){return a.text}};scheduler.config.views=[]; -dhx.ready(function(){if(scheduler.locale&&scheduler.locale.date)dhx.Date.Locale=scheduler.locale.date;if(!scheduler.config.form)scheduler.config.form=[{view:"text",label:scheduler.locale.labels.label_event,name:"text"},{view:"datepicker",label:scheduler.locale.labels.label_start,name:"start_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"datepicker",label:scheduler.locale.labels.label_end,name:"end_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"textarea",label:scheduler.locale.labels.label_details, -name:"details",width:300,height:150},{view:"button",label:scheduler.locale.labels.icon_delete,id:"delete",type:"form",css:"delete"}];if(!scheduler.config.bottom_toolbar)scheduler.config.bottom_toolbar=[{view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today,align:"left",width:scheduler.xy.icon_today+6},{view:"segmented",id:"buttons",selected:"list",align:"center",multiview:!0,options:[{value:"list",label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab}, -{value:"day",label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab},{value:"month",label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab}]},{view:"button",css:"add",id:"add",align:"right",label:"",inputWidth:42,width:50},{view:"label",label:"",inputWidth:42,width:50,batch:"readonly"}];if(!scheduler.config.day_toolbar)scheduler.config.day_toolbar=[{view:"label",id:"prev",align:"left",label:"
"},{view:"label",id:"date",align:"center", -width:200},{view:"label",id:"next",align:"right",label:"
"}];if(!scheduler.config.selected_toolbar)scheduler.config.selected_toolbar=[{view:"button",inputWidth:scheduler.xy.icon_back,type:"prev",id:"back",align:"left",label:scheduler.locale.labels.icon_back},{view:"button",inputWidth:scheduler.xy.icon_edit,id:"edit",align:"right",label:scheduler.locale.labels.icon_edit}];if(!scheduler.config.form_toolbar)scheduler.config.form_toolbar=[{view:"button", -inputWidth:scheduler.xy.icon_cancel,id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel},{view:"button",inputWidth:scheduler.xy.icon_save,id:"save",align:"right",label:scheduler.locale.labels.icon_save}];scheduler.types={event_list:{name:"EventsList",css:"events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.list_height,width:"auto",dateStart:scheduler.templates.event_date,timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker, -template:scheduler.templates.event_title},day_event_list:{name:"DayEventsList",css:"day_events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.month_list_height,width:"auto",timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,template:scheduler.templates.month_event_title}};dhx.Type(dhx.ui.list,scheduler.types.event_list);dhx.Type(dhx.ui.list,scheduler.types.day_event_list);dhx.DataDriver.scheduler={records:"/*/event"};dhx.extend(dhx.DataDriver.scheduler, -dhx.DataDriver.xml);var a=[{id:"list",view:"list",type:"EventsList",startDate:new Date},{id:"day",rows:[{id:"dayBar",view:"toolbar",css:"dhx_topbar",elements:scheduler.config.day_toolbar},{id:"dayList",view:"dayevents"}]},{id:"month",rows:[{id:"calendar",view:"calendar",dayWithEvents:scheduler.templates.calendar_event,calendarHeader:scheduler.config.calendar_date},{id:"calendarDayEvents",view:"list",type:"DayEventsList"}]},{id:"event",animate:{type:"slide",subtype:"in",direction:"top"},rows:[{id:"eventBar", -view:"toolbar",type:"TopBar",css:"single_event",elements:scheduler.config.selected_toolbar},{id:"eventTemplate",view:"template",template:scheduler.templates.selected_event}]},{id:"form",rows:[{id:"editBar",view:"toolbar",type:"TopBar",elements:scheduler.config.form_toolbar},{id:"editForm",view:"form",elements:scheduler.config.form,rules:scheduler.config.form_rules}]}].concat(scheduler.config.views);dhx.protoUI({name:"scheduler",defaults:{rows:[{view:"multiview",id:"views",cells:a},{view:"toolbar", -id:"bottomBar",type:"SchedulerBar",visibleBatch:"default",elements:scheduler.config.bottom_toolbar}],color:"#color#",textColor:"#textColor#"},$init:function(){this.name="Scheduler";this.b.className+=" dhx_scheduler";dhx.i18n.dateFormat=scheduler.config.item_date;dhx.i18n.timeFormat=scheduler.config.hour_date;dhx.i18n.fullDateFormat=scheduler.config.xml_date;dhx.i18n.headerFormatStr=dhx.Date.dateToStr(scheduler.config.header_date);dhx.i18n.setLocale();this.data.provideApi(this);this.data.extraParser= -dhx.bind(function(a){a.start_date=dhx.i18n.fullDateFormatDate(a.start_date);a.end_date=dhx.i18n.fullDateFormatDate(a.end_date)},this);this.$ready.push(this.$d);this.data.attachEvent("onStoreUpdated",dhx.bind(this.Oe,this))},$d:function(){this.ae();this.de();this.coreData=new dhx.DataValue;this.coreData.setValue(scheduler.config.init_date);this.$$("dayList").define("date",this.coreData);this.selectedEvent=new dhx.DataRecord;this.config.readonly?this.define("readonly",this.config.readonly):scheduler.config.readonly&& -this.define("readonly",!0);if(this.config.save){var a=new dhx.DataProcessor({master:this,url:this.config.save});a.attachEvent("onBeforeDataSend",this.re)}this.$$("date")&&this.$$("date").bind(this.coreData,null,dhx.i18n.headerFormatStr);this.$$("list").sync(this);this.$$("list").bind(this.coreData,function(a,b){return ba.start_date}); -this.$$("calendar").bind(this.coreData);this.$$("calendarDayEvents").sync(this,!0);this.$$("calendarDayEvents").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return ea.start_date});this.$$("eventTemplate").bind(this);this.$$("editForm").bind(this);this.$$("list").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("dayList").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("calendarDayEvents").attachEvent("onItemClick",dhx.bind(this.Qb, -this))},Qb:function(a){this.setCursor(a);this.$$("event").show()},Oe:function(){this.data.blockEvent();this.data.sort(function(a,b){return a.start_date";e+="
"+a+"
";e+="
";e+="
"+c+"
";e+="
"+d+"
";e+="
";e+="
";e+="
";e+="
";e+="
";e+="";return e},type:{templateStart:dhx.Template("
"),template:scheduler.templates.day_event,templateEnd:dhx.Template("
"),templateCss:dhx.Template(""),templateColor:dhx.Template("#color#"), -templateTextColor:dhx.Template("#textColor#"),padding:2},we:function(){var a=this.data.getRange(),b=[],c,d,e,f,g;for(d=0;dg)g=b[e].$sorder;c.$sorder=g+1;c.$inner=!1}else c.$sorder=0;b.push(c);if(b.length>(b.max_count||0))b.max_count=b.length}for(d=0;ddhx.Date.datePart(d).valueOf()&&(d=c);dhx.Date.datePart(c).valueOf()dhx.Date.datePart(b).valueOf()&&(d=dhx.Date.datePart(b),d.setMinutes(0),d.setHours(this.config.lastHour));if(e=this.config.lastHour)e=this.config.lastHour&&(d.setMinutes(0), -d.setHours(this.config.lastHour));var g=Math.floor((this.j-this.config.timeScaleWidth-this.config.eventOffset-8)/a.$count);a.$left=a.$sorder*g+this.config.timeScaleWidth+this.config.eventOffset;a.$inner||(g*=a.$count-a.$sorder);a.$width=g-this.config.eventOffset-this.type.padding*2;var h=c.getHours()*60+c.getMinutes(),i=d.getHours()*60+d.getMinutes()||this.config.lastHour*60;a.$top=Math.round((h-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60);a.$height=Math.max(10,(i-h)*(this.config.timeScaleHeight+ -1)/60-2)-this.type.padding*2}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings); diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png deleted file mode 100644 index f874fa321f76c0160b4b8f48a9daedd36cee8bd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-K!2~3QS7wv~DYlXzzhEE@1bNHYCjzN8o-U3d z9-VKm8gd;nkZ60jT|%I+@bbcQPDi;T_O`Hp6$;Z=5S?@TU|y`(N|Rpai&^>LliG7K>pl(rSzno3KoOa=R6OQ;>i`)H-Zq+|- rem;NCMy?*i15f`I>27?rBbrhEz?;bOtEaj?aro^_LoO#n0oLiZ?RyuPUpS?GqslgVeZo@nfDPL>Z59ly6Z$XQd?Wp%_+|rv zAin+&({_B_Y(4LETD{imw~SIs%Zs#+$MK)Oc_XY_)5OIud&1wMy*F!&Hls+*7R9w&bR`KG0FOwjF-VBE?4X&3fUtYA4 zZOCxh+_YJ5b5rp9hAQ(dF0b>sFK%4)^arb~S3yWRWAq}R%Naaf{an^LB{Ts5d(dK@ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif deleted file mode 100644 index dd6595e5d9ef43bd03c486ff87079f398267e085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmZ?wbhEHblw#0e_|Cu(?klqTfBEyoYklCmVoqenVS|Pe!)>e59cFWsU9>AW zZP8U{yyh;8RlNr303RUE2#_d#_^)>0%x$Xs10t-?UO*$CP9jc$w;rijn>#HZ* ziuOA9HrlOUoN#1EY26vWko7W`kGGuIQyH^LXXo0ihgT<^dANV+jn?#K4u`fCUwwP* z-M5!ZXNH}5yl>s2_-m)ym(2>l`}us|%dq{M3y$q7@2KifR>Y}Mw6)3c8m-~M#w=7-a1 z2lYB02kd$=@8hpG|NsAI7zM*O1QdU=FfuSCFzA512+9-e9RC>(a>#gWSa7hJLs%<@ z!>y62jYpg%f??u==`spD872Y>4UJt1VGkBu+W4e}lTpRt$^pd#JWK}3LKB3T9*Ht> z{5N>MH5zv}sFyVmL)JDz@z9|n~A2ze=aoMTfc#?RCTa!a?fk(jUuvRNSo+m#7 zABgF&Eo)ezv2bzAcA+K}&I`<}M+6xCroGv*gqxjLp!QVD$^#6OloTdwc^t4{g{)f>K6CCawk>Cl{7Cw?#BK3K$BV zSs5kRIOOdXxUhBTvni|)Xl*QJN-QjLPzCavSUfPI0sfDy@jpkeH{?dy!N3 zhQbX7(}VJFMYr8B{IE5rQKCY`;NikW%s2R0UNrDKaC~s&6i8KY$lHF<>b{ktD z&gisyeO}}wWwu=IPQcysynfG5*AoY441ID30dRqYbB2hDj*oeU0SAKw43?OemjIca zmy8XQ2$l?`rlkO-{A0vp~mdytYTbG?msW^U zr#j6lvq09dT+^yuJJf1X0dM0fC;-4L+`9_kQoUzXuU`e6%*y?X_HW+7hz~0^%s6r5 zqF(Vz#(P-uVW*ZU-_3lP;(^MbIg1WWdbDW)xdf)NP2)85Uy zx9{J;VH*OpAUN;?ZyFFc{+kM-;>@E-IQ3E2UV#jV2dz}|K7IbH;;QNrz*VAWT z&%M2R_w3)xkI!-mk0eEOoX77&KNJ1{1{YYw5-_xof)G1|V4wyF7P#Pp5RRZj1OPka Cm_4ij diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif deleted file mode 100644 index 67257083540f7ea06881718da65d749f7284e165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmZ?wbhEHb6k-r!c*ek>prLT)%o*dfGgj$`HW)Az6cjY9_^@!{!iEJG{{Q%I;E^z4 z!G;SD{sW1G2@e`(9Qfam@FBrq!iozH0SOHY9(?%lzo28ogbn{4Djqzr5a{jgov`A= zh65M&@85s>_U->O8UiXVBt#?>EcoD1aG_wvg9k7EH#9UXSaD#%jt2)U1ZK{h8PM>c zVZn$0|NmdSa?Qab;lPOt4J-aPEI9Dt$A5={2S5dnpFCc$;lTAP*C%YaV3lz(dCI*9 z4g$qf)-Kp_;lhmv7j9e#Xtg?cw=gYN-LX^L zkc~}ezmnDRmHU*|uGiL?1^(|-fE8lblbd4od4L*O>-Nnixo_MTBMAhPt^YXsC%yN=J0u$6;9q86(1O;^YnlA`!OMrv9(1`BVyeag@*_CuyPgcJ8^Pz`Z*T|W<~~U06^u> AiU0rr diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif deleted file mode 100644 index 61f7dc2e5ac32fc064ffb4e231f344df03d07baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmeH``!m}I0KmVIhu6+xXQh>06V%F?qh)EkZW3)hs&#ZarWvxNoo;QVXEiO_5K$#2 z#3Qb$#AB(~2ueM&NkRnmh*v}-2#b)=1sRIUu7ARQ-{<$wFQ2=Qf1ux~)A*ynQDB=1 z7>!1;SX|9t2@eksi-{YQYbGWpD%+Ooy0mdgS<1zCJfSY5{B?FQxA1qBY<91EWb?-a zY8rbwzjh9PJ6SZWBoGLOt+$f#1qQo*dVaraXydP?75Us=W`#mAuhFjQXBQ7zgwj7H zW17`X{rYA`ei^f}d1T@>wM?E_P*GGfRK%{yd9KW5)d%C^N}J`67;V{XQ8rguRaM1p z=*(bL)_3$%*i-#7jbe7Os&koL+aZu@cm^7wXN@X-Xe8PN?$>z29$mX=EIjrQ&;<*L&i(WN_EhjyG@vvlM zVrG|C$maLSMy7XEnzc#gZu(Qn+TR;gmL!W=PhrdQN*g*QvP4=#R@q>yX!J>8Wo_F) zgFwd@_T@dRlT5CZ)^lYoT|sVFFT;WtZ~AVk=f!jOFMXfDCf7J;?tQP z5%C`}U?5*ByZ}z^p*jFrIHdJ;4H9K?#)Xs)cZ{N1@4aZ2nl#MPhsy56Hr+^JoodF;gB)*blVN`(U9opG zg#^RL$q+kY!O!_tBK$bY7vcjlyJm!XVe*uEfFDFU_%yX* zBpYUP0@)s#hIx?ggB9V?0Qis;U5pAiJBn~N^+G`r2k&g>aq$78=Sj?4a6hoO*D{Cv z^`sPI*MctxtcXOw_a`=p`S@ET5d*XO*gT#5!C_1p3doCqUVxp5`J8S`X!C$rpo6I* zxI0Y+y%=3Z&#dh{Q3Xy-~T6X|NCUj z-+AKAj$^O4oc%v(-P4P=e*FLcf6~g^o6r1jUwo^5;nm*dx0CC)-F@*tt7XTEoe$67 z_;%s`|Hp6s*U!GR{=kbx`@T+Hb}p-J@5KlIx1IZ+(X#u*#rLa^|4XUcG-vJAQ(#*m&j9|EU{aOxyJG*p2@MJ%=AY`_F&_DE?$& zWMD97&;iMV{KUYv@WAW>4;`s~kH?3FUzRA%b1$-r3GorDP~irs!TK&W1KgS zYyNz(**XTyD^~EWWH!*5t)a)Vc?;hbJ&oC#61;5t_V44B(41|qt0=^I>a>ue?olUw ebzx;08D(L0{R_^j3Wi)SnAsUe&p%Yv$JM$_W8+`K+vL zQy1@KV`DF|zZPaRp-Va7Es`fWH{!n_taqfi)L%}l+!NRT_gf~c5vTfPAO=yP@zY`zB-u?Ry@*U>$I(GcT$y28*)fmoQIDhHFx$tYDF7dZ+ zoj;d(|GrD{K0OuZ-`~Uy| diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png deleted file mode 100644 index 24957208fdcb6ec0fdc02a6468100c686eb9ecf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 zcmV+u3+(iXP)eI3b~U|9Lw@OaL0=-?F-$J$v?G>(;HhdOLUSWc=Euekkkj zGgZlDI8+qDuC{u3+`a+m3yDN;_(BX$^LuRIm$j6!GEEs)2Cme-LmKTkZ2s~N3k?kw zASsnfkq8{(bdQJt85|rGpb)1-_sYx5@#!1EHg`TPEsZTnOaS}q-w?ETj#;4c^Yd9| zW+oOaSU`ERJTWnm@@D&|x{}SDa=(UhsxzeN(*X~U;RhNG*u#eyZ0kaI+zRx*94|c% zfIcbyMC6af9g_@N5(&Jzy4og7qPi0Ws9Dp3te_wye0m)I@o$-|)7I8z)jKRH?~tF# z9Mk^=#q-ZY^ZoZ|K6w(Yw{MGQZv39-3opQZ)(kkFIReIpSl@!gNdu}>Q_6M}?!eNe zOL6w>S>w|k34Z@O5jMT#%{{p`)oaUrj&0a*7bu*K6Ir`)@7_K5r>C18Jhu!fH8quy zm5f-HNj`ciH0VJ+sA2Z$$Dj-dK>f9A(6sizC3zG4Ut1;WHGTMN=ER8Y~`kY;3Hsa0dqmoyAikWut!e z_V$WoN#CTaxsdD?Xs@kBd)E*=x9x+{*I)F-Ir}T-t>^|45>U8h3+60e4izs;b&#~y zWV>Hfe8IxJ!w}{bW^i0Lnr^U&_ELyi z@R;xb!Q)>J#gc{dME=LGMBpcJQKHV+hOGstun>s*puuXbB%t#0@(>Xbfph21AtWRO zIXO894-W@rPpyfZG#*XjY}oRg*l$UAAZC_`nbjyXC~dIX!#Z$?Q& z2^;&2?$I*>sI|3~8)zR+pFWLUKip*+q<${^o8M`mQUb-5^(d&QLw?zPaecn1Qt*t+ zr8tvUBJ%&vEfjUE0co-TB5N_kZK3``_JD?4UdXIzx@UA9 zJ%5hiu~GAM_Yz{FtO9AW0MgSm#l-jI{al!QzJbcw8O8u||IHsnKSdc{mg*?YwaevF zQ&WTFtk#lzyodJ& zln?Mz3m!5%;88h#9UT#_cWus+yubdKd9R;*fJR%AF^jSUL`7r_+OyN(>Ei|tDT^$thKR4U%zSs6)!>J93i;F{9S(yMw?1^}uC^t732a*mTQXMH-bap2; zseC*S8a0B~)YYT6{(xqZ^XgB+D}SwQ=NNd?H% znxwt9WID9}(d%gG89)zhTDcoe0L}f~BY+$V&ok%ad*M`9CCX4)s$-6#XGBW`LPkc0 zP~_{^uZu)^x<}8bjK#-7S{K}d@3M(cn>M^AQ9dBxktNYJc~8Wn_`ZR-x#{j8{d{nc zYf{vtThOGOkNF2ns^oWB?Y`|$a{)$?S9q%cP9ML?Ml_hF3v_UR>i9-i_3jQ)$C9=Q zgwI!e&eon-D=bQDK}UXZ#4JGLK#G{9#ILp=f~&I%Q(c_k<~p2Qom6mC*$*FN_VSK) z_oB6ve(fQrQix>4avZFV%Jv}`l z9}^Q}(Yc*&jjgI+otY=motJ^WiW|d6Mj>Hvid_Pi#Gk=FFyw!Fx-Q9IW}kkNKl;fa z$s~g$gCvs-l1!HG;hvR&$bl$wAc`D_LL>*G$bl$wAPSKjh+;d*fhckyiX4byj%*1; zIhAxuG6|9#i1K6uQPNkWn~rgi15uuAAj*X`7tF^v$bl$NE)XUE?R?3i&Fqs1MBxHv zBxG$Os~Fh=NY+}?(-??C!jJrCBr_F=Qnay1vgquNBhDroh(c``d(qfHlsT)5$kbUa z_onLjfGN@3+|tq_zNqr{m`Tka_1uy`6jBCL?K!Ray<{j5Mft{WX;Ei}0#T@rB}zmf z7z;!(2auj6k#{lCK$Pa@X83ST9827_WTOL7YSsV1J>EfgiXm`y#gr*ibX<}oOQsOk z(a~YmT14(Gw*aP8DviFthh#8v$|LE4L|Qk|KoqT?KbALit;cB!ljA3T9$ zYLF%z1x6FMcWVKx_tLPUEJnhmttX~;6EE#f2xYJc(B&-4OOG85Ke=FFKwvB>JD z^1TvqE>y|bluY1LAKKg7g`yB(Bu_UtHz5ZCWb|37c1<2F7ad46aP2u9B?3UV8y^8@ z^tIkba0EDdp*0KsM2M7%)-wX0-aod_x)W_aa8d}eA}$o8!XyujKq46sCxGdmaK}g7 zavGynfRsqvN&78PGOdH8wR}U$V)Qgbjuv|QN&Ye`gCx^q1&O|rdS@SEvWT8M8C;Xh zeI>nGrD4q-edFqRx;h{_(8K1kGFfmeqyuP4BHxE-jD960p~pr3U|eIlMYqQ9XL#9H zBgU6KSA0vBzAe+;@K@4A1UAn`R#ukDucSQ#3e0d<>TzSlBnA9DlzLny8!XA%ucW;L zK-mL^+1`@iy(SL9X%|u3%HZoJ2`-ZjmP9Ai)_y`DQ0DqbD8A1GHwBU%e+vOr-#!eK zooqGrPwWzF2 lR=D6Y$tMmnSxNsDU;ytXnYZ<(0)+qo002ovPDHLkV1l_%QG@^h diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png deleted file mode 100644 index f0ffbdabc108e650383ef3df89eacc043db5d9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+B%Uefj_Yf7JdxSwIm! mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$Uo3K%*7 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png deleted file mode 100644 index 9f371b4df716915175019c9422df7c12c27f64ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+C3xefj_Yf8N#)Y(Nn{ mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$UeBp3Vu diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png deleted file mode 100644 index a3bae3e018613bfa0c160ea6a36723d641e3a415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hcwlasB`Q|B`)I{(pP)|LfiV zpKt#Ebmjkt3;*Ar{{Qy)|2K#JzuNo%<<9@lxBP#$;s2A>$=A-j2WnLEba4#fn3)`q yV31Idz>(mQpplS~Fyp|6hD7GWjBVUJ{0z3Y*cxAN?N9-#X7F_Nb6Mw<&;$TzL__TW diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png deleted file mode 100644 index 31d6626cdd40848c6d900eeb8e8d4057f6dfd553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmVsi?L4DSwy6=Gyw9+ zFovGaHzsTy&(`(mA|C-TpGSSX^ClSheK+Y%@EY4KGI}?S^dBdHlI7}ny*~iZxu7XL g^hQK^3Fvj(FC=_u*5-+h;{X5v07*qoM6N<$f}pKl{{R30 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png deleted file mode 100644 index 22d630927f32a8d4c66b4cbb851f20002aad0e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^#z4%(!2~3$o)(t^DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MID|ljv*DdZ2WHv9#-I)EPr>QcFBix7yH*t@Vh9Pq$SxT zu<3%V-R-{5>$oF!%xaa|x+_&9hR3^f$)(@tYA>xRzwqPwv(VfP!nqvDPIKS5)_mcq ep0}TYnc VW}y=sH5X_cgQu&X%Q~loCII&SCFTGC diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png deleted file mode 100644 index f0314fa609946421251eeafe1bd88b61216e671d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{S!3-q3+C<%eR8)XZi0hJlSN;RRw?{v|y!`n2 z!>f?N^}pM%{@r@@@5al2*I)d*`uyLO=l?E0`*-o_ zzY9v zum3Ng%&d+z7H&;jaY@O1TaS?83{1OTQT Bb#(v$ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif deleted file mode 100644 index f5e71df6aa432e63b71dc708a929027822689ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3951 zcmc(iXH*l|w#Oqe7GM&`C^Co&I;dm2%rFjeMX#u+IM_x-utcd!QIMgFv=BOkE;T^t z1VTwjC8Sq+Cxiq-3rH_g6&}u7_rt7r%Y1q3?N4W&bOz5mxuuAMWm3;;j? za{$1`W{CCHKeepSG1muPZmt1;g!YEYZQ}>`uNd7m{^^V^aLeYV_PWLuS6fRrTN^D; zd$(6wmJXI)PR^D#XYAkDIRms;w(eBkJay{p^{d4ahOC7h>j}W4MdA!TRX4TF37~VV5toY{8&jyL>s7Khd zXWlB|uVA z!Ra58vf^`+(^7I{3o`)esQhd!x*{*LpsI*aQid<5R?={o(i$e4!l~smcy-luVk5ah z$SUq2bvAdmwQyVOSt8khbV$%QGB`Ti-=mO^H%TVPraz+Dbd6=xX&U^RpXar9X~l3JCkRd2i=$ z=N)M8>FWN*B`Q4nTSP#7P)L|Z1Uys&l#vPA1I$4KvvYIu3yN|}(4~ctf^u+WUPUFg z8dr(RB-Ij%85mX>rwV|lQL~+v~d(}VP_k@B}+ac>*^mJ=onY@ z_EB3V#2;tICYKf@i(lqy)+l4|6y>nmpwD2LQkb?x4+16|^)6Ou8;7fb%xpkfTekdL zDy0{WIb^mgt1j>k?h8sYk55iTKjN5T6Qk!X%9lQQ`K+%%W#w#@IjgPa^*4_Ef-p_L zuPohL)`Wo+yBWW|@3J>6-+_H$!KHNMaa8pZ&I`w%?8ngU-MwAmfu24Zettn= z!O|!n9XcHgj3Mf-rCtwCvO;R8g6Nmc1d_evM~jHcDlcBU~y=9 zWEC^fBc5*uX$tPZjC_{*_bw;`It{eg*$E;kmnkj+|U5wL& zZffd(tLBf)*;I|t?XW^+p%%qJ)wGCozc zN>d}VXb`847<5?-$2BhTWGk-ocj@6p4g)jH+GJG|EK;J5RixGhE5I(ChDWB|`ZvUNdi z()1;HfSK=AS3`Fnn=rcwPdF^tImj>8KR)DLly_)o;M3$RRE~p5N_u`uW-c0$U4lIT zs;mM*aaGj>JcLXE1L+JPl*wRoSP;ITme1ofGMgDSBti$SizsZ6G)Y_fxN>^y&|n=v z)J`RfE2n56dKlo}Nc1IIPDZq;?krvJXN`|wl2^mC@iM5!@{cNcaca!Gfj zjf6aDP4_-{=;odsaYHwd%KOa>i>h=)2}k>$1(?L5fBt6Qth~Nx{_^eU^N~9LjbDi` zVyS1lhn0DJRx0|1j%CNt z;E_NYbsYTuO2cnQ9!7Umk*7}96gr{CtseW0uMuc({eE|JJ?QnyIyAyE=zSnEATBss zDbhCCGb%PA-9ID#aEkpqkK8byMBgjUG1+j`VNewg1jXYB#A*nI3Z_AUEH;qIVe$Av z&Ss$!K=>?14TVhX!iz~Qtxa61NM1kKINS_w1-8>WJG!TPW_!nEivCXnD?@7|Uq%7# zl|bE!Y^ul1x?JVe9XT;{srEb58#6DABY+)7Zt9h%k6cGUhqd>3$Jy{gR6pep5nG@C z8lZ9HH_b6eR7k3h<6>L3s{(;K?OoNI`rip+)U=inEcLVjES!~*Cr1NuGVnQ+EaC#C?f=#wC&Ns?Zwmg z7E(`1_bM(ry9EXMyDNF!_xAO%wu=b~Hj1}!Nel>!MB0Yir#ZysIHBK|WEDmfqxAEV z%i!f&ARHb9t;Q2c1PHYTTuUKAfm|Mt!{-V`_54O&GnYxDvZ}kt9c)QAL{!(;-zper z7-<^iwKF=UJ(In&viTW6|1fxY=<`SUYJc~ZT{oJa(JaKfR_i>Sds%*fCSyahyRu90 zeW%Uxy6);(@!g=g7c{?f)!;=h-aTQsJf16vS6zy8TR|TEDe}|L{q>}|%-b>AXT4N? zEQ@~4Y1;i4I4*wBis-o!VwZ{@+-6l?$Hdi}CSC1AiWe_3zdycpHH4V~if5lq{V`u} z)ooYY^+AyaCoQj8!>bUN#2?Yor^=MDJ z-}zZ|Ao8L|#LJNI)X0Q4?=xJpVy-5oeMoljvP?&n#zqDFS;?ECW#InIkxnJEh;7U+ zwz#vl{SS`Ka&W(3K-4Pjp6HqC1&q(hW-5n9M+V25KJ%96l{#~~V*1a+XGb#G{O0Ed z0L50dM6XyYR-np(5jg42ndf@ZYSXWw_T~F7#~-_OVnQ&R%lG@+hW*u|9IcwP?ar_Y zllh=u{Wbh}s;j5|Q-9qj{O82A^ZVkY5rpzFN}&4Z2tB=rznKoI1tU*(9y#u|EAXUj zQjzdO`uT#!ZTTAT8(q7ow{AKbxHxP0#q$U9C%QXekHql?&rbU*me)Rf@c=IS8+qUM z2@bgzY8L47TIcN#?_CjLi4pK5567o*v5|gPKO`rh!&6gU1r(>FbU@g05VWGa3Rejs z5W(bX9Ib+mhX6TTAe6@y2>I;#O{Pq28wJozZEdNQFdBt*{e3(+ue+;9-1|{B!J2B9 zPLGZQ>KnjI!=gd1VqbDZ&T{!>_)K*hH{^LPI$DQ*(T8A|qlj%ih zK|-R=xmwYp4sz`uq{ctJ;Hd%I9c8d<1eE%d1=fjl2T1z&6WiCm`%iX(2`|!m!eJ#9 zapmfI*0x3--$?Wc3S_59+YN*;%sdsoX7J(Cp*?1&c9xwkNbJn;AwMx8=|evVJFHbO zt*E4aPyH$E^47|qhZ#^OT0;D>@p%s=4 z-#NzKBj;XN{v&cj^F+HKcK@@haHvkJ^@rO)q32O)QjJSh{!M`PxP3~>Uy3(^~ z@sfN89m^p#s@hQU{A)#xupr@3M2OzEp4SeX5?k-dyis)J_zq>{uf=5l86CM?25s~;9 z{_-E7>>Lmjos*ZJ3n?lFV+!-j(Uk=yMYwDzkU|BLYbe<23RV>dUq;}OM5O?xfZfam z(-*uuPgg)*6^6g_UGatCWjc-K2{h$!!``~ayT$mNq4V0D+f@Y+nvN9p)TyTC) zR&fR`2uVUjV%o;(hh*3=<@BuAtta?r-ucNi6T_}+? zHTMq6q;-9Yk%o_5qYZNM(AeDg!sLW_co9FdjN9M>te~S)vf7<9z4kLaCpkG}pZbZY pWf!ZHp$(dbz}SD8G>Wgb=uaa1zqEv)*f`MtlO;U=)dv3&{{wX{9B%*s diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png deleted file mode 100644 index 15681b311e095bcf71a016c10b98215d2f62fdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hBeias3Yj{~rDSclZCloB#h^ z`TzIA|G%gI|2_Wy@1g&H_x}I8^Z%bM|Nm_G|7SJho#WC#T}qxVjv*W~lLZn25)2Xw s5;zh(5;PJr5@sCO(2&S{n6ZtU!Ptv+qi^c>nLyPHp00i_>zopr08)lQEdT%j diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png deleted file mode 100644 index f43a46357b2b8a44c62bb6955413ca6c422397b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^j6n2-gBi#={doIQAhj#NC&cyt|NoEQ|GW3*->p~w zu0H>F@#()akD%!6<9|SO4vfw}`3FH4p8UJ;6r>D-E%CiATwRVHQB_&GBsJyf6H$?=Q$jla?0-X33{vuFPP+`eJUrfnOyZZ0n`!f@W=oF diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png deleted file mode 100644 index 8f9a4f6da021cb45908bfe9e8d904e042b2f047a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#!3HFY>I`du6lZ})WHAE+-w_aIoT|+y4HUHT zba4#fxSkxb>HVqtw*L+XN*+8aW?NSO|37nQJx{^4`Zq~BXM7Zz1ZN)Ya^*R*tKh#R ivt*e81LI3EMh3oTj_Eal|F_ZNmx0r(h1H*=|U3OfpzvHi}DR`OfUbAABv-upo?U|K(>>jf7 X&0u(ba8}zzpe_baS3j3^P6`1px&CF4n_O8yr)Fq>iQ?Oe~R- ZJN}%psYOZYWQNhg04>pOR|ysdYXG(YZ0G<0 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png deleted file mode 100644 index 7ee9285229449c6b3361135be958566c494f600b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^HbAVx!2~3uq|aRjQfwtbe!)N*2=bP(PXtoeJzX3_ zB3j>G-OY8#K%(uTzJx$wVG#S=qhjd?Up>&>QB}RGinHtkLtax@;ku5}S3yfIH9KFl zY%=}#!9Mud^!^DP4Bp4T{&^th_9K7kqBWtXYBy_6>*GFPB(-bulr??_@=7O=S3O<*T-G@yGywp3=X(MG diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png deleted file mode 100644 index 6e5ffb852f02941eeb6e6b7bf27e6509c93ad44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^Q9!K1!3HEb8+12=r~;43Vg?4jBOuH;Rhv&5D0t7) z#W5t~-rMWD`3@$?w0*2!+}Uxor7<$&j8OYQ-H5w#tGzEARNUyPVJLhsMNrZ9#q!Mc z2d+!ZyMO8Mk0)oRUz>2@jwRdm-_G;&!#`N>T%)K=Dy9 z8UiCN1S$f&%o!LM8A^iug8wrB^T7xPYptJY1LL2wz$3Dlfr0M`2s2LA=92~rvX^-J zy0YJ9;TPmqcHKEq1uWzmQQ}xyl96A;uyWlQ51tBm$KdF>F7ur5`BF0TK>REXvEwOJ_JB{j41*#tzY6T9lm1@b!Q5 zYnU?U{M_8syb^|QXQu53im`!|g=CiGq%y2{cS#*6qVMVA7$Pw>IpGMG1P7@BN BaBTnp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png deleted file mode 100644 index 651215a15ae456fa3036d74224e7eddb127d51de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmaJ?Yfuws6paBQW5HUB2vX`2Dqw}Ykc6Z}3~T}nCcH8V29%I2BuaKeb|DeP2M)m( zTD1jfttbMmyiAe$2m+=ff{Kbr!BTA%N)>D|AjYB-+l>|NkJ6pl{a)vsd+&G8%2JgaK(#h7#tIA2+p<0i~Qv zUKJ#y3Dx0{LK&H>ff8~>Vp;Bb8Cy;cT?T~cIJkfc!lZysl?kI99hdw{mxIr3+f*{} z3WBZYlK)96Q5Xw^BN_+@qR;|lG$svT(kb-7r7RZ9A7IevG%Afjr85HPEKVSUL!$w& zA2J?IBTwhVgM!zw@D-P=z%Vt3O4Vw$6m1{{(PU8RY&P4b!C(a7hyZj0j7fC?FzP*} z079rtqf}!`1O{x1(ljI+KbefvAD-gdkv* z5|$%c^c7ktZBHcxHg-my*Jm=<5Wu{{LiUf1BJzB%_u9D!i(9tHBmy8hadwJUC|a%qp* zV$F_S+?C(xvZK*2i}(hM?Hr`rL)Afr(^W~_6mLpHjJ-CC8vV$t(7k5jn zR_lw&L6@spu7OvNO~h%|0!?l#Ju_QAJ^5^e$;eVBsjjmc4f_< zTsNn9^8TZ3ZT#`vW|vt7Ys`HmM~#bs?KxxZDf-5qo*u_oMyX4_)!lQu2>|0U9fQcn8$`+p`n@OX=LcRhC#m>~&0 zmhy?pm}^K8i^cCb+H=H|ku_gl^Kp@Ea->@5=hI<6*vOQE!bo zI;%77+lPAd@I|NWHO<0;Vo%ICN$@K4UY)$7bKce&#S4lAU!|Yga4W&*z+$82iR}5< zkLbv{{+QFmK)(Cl-) zwy}Lq;lS;dy90s78HyzrI>XD=#(00%pA7osPwKFtOkdBtk6bTY1FO5ZbjdspsiZ!#L6hj4pPCt8_eCF( z8Tqr)M(pS%g4P>$j=#^Zb0`i8J7mf<(S~Smay2tt&+y``2lKm9^6Q>I2SS0Uy%Zk7qpmoM1=zVJxRP Tx#+8xw%=wHUj){NrRM()d4nQp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png deleted file mode 100644 index 901b5b7fb79f2623717d8673f12eb26e2ca35e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1975 zcmaJ?YfuyC8V=>A2-Q}Of(2cpsYr9(++a;WAkqYr2qZ|FgG$IQ5J|EjSs>g7VPqIA zMFjK+Eyt=EDbOlsEK)!UUXZ4c0#+;tXg!wE3XT*wV7=hkSh4+aIJ>j^UFLb7_kF+j znfZz%r5}2@t#cy~2p%G#AQ~Ti@XvRd3;u73a%bR!H?~88$8i0SQQwM$accZtEZd z8kkRvWlQK1Ll}~*5oQ??S(a3;&Pq`S!o=VpfM0S<%8V6wPeE*Svn3_6Vt(ik9x!G)M0M5hC< zA0i&j2q!|(g7DX|@D-n!j9~_dM$5>^pk^?ss4O#diBXLuv4H@!Y4{J>~tm4U{f((NTJ0wt3F57p`3 zpiNjb@@KyPQ`jWWG$6ES#Du09)p+9)H`zlOpfDq%!ce0eMYW5k7@3S>s3{pW0AVsV z5UbI{Xol$(S|Wi&dK0G7s}YfaPsI6DjRuA|V4#2%4zk(d0Rarg4tgj9WQ5=^$YF%i z!`b1BTmh<1(;<3nkqiIHSlGZ)}g~ajzS3Q$M{~9!VfLQAC0ex%rkQcBfdT@eFDo zRr*sXK&6}V&?%>fr@y=6deHCE6Jg2W2!pzWajo!L;RmbNR)~pzPhwl)(c|KTGm>lK zL`Ja{7Jk+X69)u}-uV8hmw%prCMud# z@w;!?_9u>Y%swYgxZbS&vg1k4x3S9YE*_y}v%}g8V=*x?@~Ef~XJ==)d8F&`p;M7i z&6&Eot<}emf36_UZ3zCh`)Yp9^5*kFiREEUO-%)U71m{Y;^I90OFUdomTz9}QFMg` zf}!{B-OHQlYZvqCiyA9J{>kESZcRLVn5`}VR|EO~O=&^tA8R}f))#>K+R?U0wv<8xQDV53+1VJvJ*Luyw487&3 z=!B!^lMa679?WI2hJH&3+B-hIM$zdsrwrYP%Iaa75@Z>mpHy4F0s_Og;(`001D zNBukYgH?X(K2f^5xGYqD^Tj#l$+J_I0B`?CyIWJA)A?C*1!r>}Zy_y&{DTtENlL9v zZdQ<6rPYyZ51#VxYkov(K$vNF@`Nwl5AVNK;238FtFUTYVyYWO1P(_GkCV3)*&?_b zUWBi$e(%8#b?N?P?h|(0)T*XaACNy<8C!4llRbWi_Tt(5!u#u=3(zYAX}U`eRPRai zfeRLrU-2iF%x+G(*QWE8RVk#A^@ucfpmeGV6~=xawad3=?xsv!d`NnJw>;)=KH$DH zP;f9xrc!Ut8GM0;VZl$OzMEr<3(wps;%aAm^RGrB(!u`8$;ov1$T7=}+4_$8)(h7M zPg5$Ty|T^kS~WdBejk^~mCC0juC+fv;uT%|J-mx2^y`C#sie@~%yB=i@rnC5PsC=k zgMW5nGMUv)mTBx<<3|rhZdcscJ7J0R``rb;kmHe!-xqp=D!Z+JYQw{RvV~ o=Y}NKLi3ZOY1>y!oF+IDTK_c`b0jYRw*4vDX4gA6@@CTake(qgK=SYet7SF@B8MPv5xjV zwW~L-rYNd55tmbB_PC>_n*4k62R@Ri0Y@{q3*~S@u^|=KP!@uOq4dENRJ5TZ&tWS? zRRKMn!I|VjxEI^yAa)vu_dx> zp-^B7%?z^pSY8kWSHtJ?5`@7Ugk>CQg5+U|7qt zrn6KgQZTltSS-(QZc1ffGWma~VJxE^oPvM+{!`dV4_S~+K?mh+m0VnIvm441B^xRj z*=d9hm#f&(k1%rjkp-kKKj_s>4HcY4bTTO>Ob08b3KMdOCVWQMH8JRyq-Z22`D4K# z&quk46pjf&UW)hvd^8dcl({le^9D3=nXCQb$`!e8BN!HmEJIsA3bmMx46vB6s8{w9 zuBf-f)hc_5ROGV64C`L&U)NkdBE91-mz$PsmfIehq}OfI)GxlzKOzs}aY7EKi*K@X zrBYkf{h%N`xH>i(pO~C{&D=(*r;(e}Ok&fGl(OEaZp^Mbt2bQwvVDM?pZj)Y^z=kF zoL@+_3*BdCrb;8vGP6w|I$t%xi#^%7H7yO*8LKJR`*H`o(6PJoTz6HRKYwTcr-QuU zc~-x1Wc*kuackW|-6iGFlk4@-s`zJi)%)vjBddZIJeA|v* zq&i8L@KOh(f}l%S5lGRG6?E`Y5FwG8mr4*tjF6&o`(|~uL)*YN-w)68ywCf7?>E{R zKT%tAw1yyv+Gs>f;Ca6@_EzKnseJDuo{peU3U$E@Do7?E+7*}vWK@%~AOR$0XmA>| z5=0fLCQ~RCJ1NLeb4w1!ZEFT*6GUs9ZAfxIKx7(ZRXsqhKAxgTRS8hto){A|f*_|x zhE32l98b!_{W7mmZO6%0TfhPuKoV(d1G**H0ji`c;I(s1Q)CH(`UBLasZ^|!3_=r- z9yjBX881V6SvT9<;`8~MNRD9{n&D`cbFn_5nG+a>-1;aS%~Uc%LJV)k!n**KL&y+l zx=<*%3(an5W@(n^c}IieTo~c9hIAy^F5PMxL50$4C_%J||k4NfRS2%11b z&`d%&P_ANU4kBpfpg{(^JY=`3E3jad(6N{h)h#6HGKh)+3iI8nstA0jBkT<|cX+~n zKg)&~p7V#q4v`H9InL{C;mTYQ%6SdwsLWM%xWS5Crx7#*M;3vpo&!qQgc?~&SWqi_ z;VbHGah1wm+ADHtY=(BO^{;C#AK~6{mfKB>H`{FwblmGEZfctS`Wioo@u=9Iv_GW3 z7mICG_x(Ko=-TM{$mOxIw|X|)-F|2K%%ysIW8~-hO0h}2I`?^bxwlVM_kDR#msnm} z>gm(8+IsoL?f3KZPv6bV914x^xss;oyNMge*iWf@jq7V`jd{a(u6ufN-}JeMYsJMk z*9X%FUY(vC_)%P$^*uQ}Vb4x##gUC)(YlKV;li`u#npwW(U-)oY9jJ+cQF&cdCPgZ M(NJ8R=s0`f4|MHo@c;k- diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png deleted file mode 100644 index 05da890fe1cf4b98f8c955cfedeb53be9cba4462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1687 zcma)+c~sI_6vuyAxsaliCrivNCoFTxG)4EhJfHhXo8l|ZQjqe%C-O!{(^9W)90K84*Yi?P=kr31XJ%2u;F|Zb{=WM`n zem(LX9l?WcOpr{a1Ep1+9uU$7A%rC{&eAC~kV1_HHffn{hd4~d4^wFgbV@iG1S)hp zT_6hoPU)mjmDCiZM3Df;1zjyDqNR!iP|t&Lp>z^JpslLp8@?x}FwRDXLQ*w z<_!t})`xjw-Ei>*(}QB~fKVfiFGN{!mm||!|2K3~{CM5IJiioJ_GQaPJ#)Tu90B}X z%YJUd_v2;GOrLi`?78ldX~Ey`Jh9QF*3;_fmdb)eMC{yO=_w3Z@mk&91;(C2*;GHZ zJ-1ra(Q+1zMy~^|J;q6Z7PgMoI$y0H^in^$&XU-_RNrYvB9Od(?I%8HZ_gX5EATDF zVJ?2F;q#NE@2qch%r)mAY0 zD=y>WCvjXZxBZ4mwWDc~sJgN;D5tlt&maSPq6k9}gkXw@c)Xtbmb93aB_-M6)v{D7 zySx_H)TbnjNa&L$!D(? zqK*pfYzU1tvw>^mP!pe|(nq_!H4&N5=8e95lS}jRwnm@MAqBm=WffROcyg*d#D%-r zopxH&EESK(KaQIW2lyEt7Nvq~tKBB}%yD=Ioj3=SUO7yjNDhc?5y zaO;RLvnlraAeExjNyH>{{5hGq* zUH$l5e$0qELdz^ZDInl&17qSUnaQj@W3$Px;Y=`r@Dq>h@S&%thPwVqh#fh9yo=+c zyqO)DUt$!Jzk~QnkynziFhhuDkcVIVekdFSL0Xl>>nLt^A&Xu zAGZFAHNPWGq*85($xDhXWWgcxZ%fKYNfzcpJ2>7AmM(0p>L}%8S4bO;{*<~9FXTUW zB?^+KCnxRM1B+-ijg*u3_8KCQn=;y_rlxv&aPqRq*w`E-|8VwVP2@h-L^pTxf=nhG z+=4_tS`Z}2#wUBrv7<8OXrq%6Tm~9sJ{#Q#N?`sG5mt!a{${VHrlx0MSy%0$Bgt+^ zUQV>wIGiiY3WbBmSuFG_U2t)+?%nOQG(2%K*9QzMc?AQ(CTVBP&=I!sHB-cB}uChvDYVsKepkD zdskOidKnF0in{=U{|pP$FC7}1>VGu2)2V>waCACi}TZ1 z^QUMZb3+r8Tp@I`;CQ|H)O9YM)3LgpO@|KwEG z%F0SzU7devTjtAi_Wfe<#mSzXi*^EuX#XDV?RuI^~J@-r=lnt~IW6I)=tan0ou6VSU#UK$c12R?jIbTT3$B3LXA zS{%KQu?cm+*k`#~ZSt_%8eFTV_Ag!@ra$Hapi6;W-`XXmLjNz|dE^AP%01-rzn2#b AcK`qY diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt deleted file mode 100644 index 67cb13ff468..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ -There are a lot of files here, but you need only part of them - -Desctop scheduler, default skin - dhtmlxscheduler.js - dhtmlxscheduler.css - imgs\ - -Desctop scheduler, glossy skin - dhtmlxscheduler.js - dhtmlxscheduler_glossy.css - imgs_glossy\ - -Mobile scheduler - dhtmlxscheduler_mobile.js - dhtmlxscheduler_mobile.css - imgs_mobile\ \ No newline at end of file