');
}
- // preview in start only for selection fields, because of the dynamic behavior of many2one fields.
- if (this.field.type in ['selection']) {
- this.render_list();
- }
},
set_value: function(value_) {
var self = this;
@@ -4709,115 +4705,72 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
}
// trick to be sure all values are loaded in the form, therefore
// enabling the evaluation of dynamic domains
+ self.selection = [];
$.async_when().then(function() {
- return self.render_list();
+ self.get_selection();
});
+ return this.loaded;
},
-
- /** Get the status list and render them
- * to_show: [[identifier, value_to_display]] where
- * - identifier = key for a selection, id for a many2one
- * - display_val = label that will be displayed
- * - ex: [[0, "New"]] (many2one) or [["new", "In Progress"]] (selection)
- */
- render_list: function() {
- var self = this;
- // get selection values, filter them and render them
- var selection_done = this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements'));
- },
-
- /** Get the selection list to be displayed in the statusbar widget.
+ /** Get the selection and render it
+ * selection: [[identifier, value_to_display], ...]
* For selection fields: this is directly given by this.field.selection
- * For many2one fields :
- * - perform a search on the relation of the many2one field (given by
- * field.relation )
- * - get the field domain for the search
- * - self.build_domain() gives the domain given by the view or by
- * the field
- * - if the optional statusbar_fold attribute is set to true, make
- * an AND with build_domain to hide all 'fold=true' columns
- * - make an OR with current value, to be sure it is displayed,
- * with the correct order, even if it is folded
+ * For many2one fields: perform a search on the relation of the many2one field
*/
get_selection: function() {
var self = this;
if (this.field.type == "many2one") {
- this.selection = [];
- // get fold information from widget
- var fold = ((this.node.attrs || {}).statusbar_fold || true);
- // build final domain: if fold option required, add the
- if (fold == true) {
- var domain = new instance.web.CompoundDomain(['|'], ['&'], self.build_domain(), [['fold', '=', false]], [['id', '=', self.selected_value]]);
- } else {
- var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]);
+ var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]);
+ var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
+ ds.read_slice(['name'], {}).done( function (records) {
+ for(var i = 0; i < records.length; i++) {
+ self.selection.push([records[i].id, records[i].name]);
+ }
+ self.render_elements();
+ self.loaded.resolve();
+ });
+ } else {
+ this.loaded.resolve();
+ // For field type selection filter values according to
+ // statusbar_visible attribute of the field. For example:
+ // statusbar_visible="draft,open".
+ var selection = this.field.selection;
+ console.log(selection);
+ for(var i=0; i< selection.length; i++) {
+ var key = selection[i][0];
+ if(key == this.selected_value || !this.options.visible || this.options.visible.indexOf(key) != -1) {
+ this.selection.push(selection[i]);
+ }
}
- // get a DataSetSearch on the current field relation (ex: crm.lead.stage_id -> crm.case.stage)
- var model_ext = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
- // fetch selection
- var read_defer = model_ext.read_slice(['name'], {}).pipe( function (records) {
- _(records).each(function (record) {
- self.selection.push([record.id, record.name]);
- });
- });
- } else {
- this.selection = this.field.selection;
- var read_defer = new $.Deferred().resolve();
- }
- return read_defer;
- },
-
- /** Filters this.selection, according to values coming from the statusbar_visible
- * attribute of the field. For example: statusbar_visible="draft,open"
- * Currently, the key of (key, label) pairs has to be used in the
- * selection of visible items. This feature is not meant to be used
- * with many2one fields.
- */
- filter_selection: function() {
- var self = this;
- var shown = _.map(((this.node.attrs || {}).statusbar_visible || "").split(","),
- function(x) { return _.str.trim(x); });
- shown = _.select(shown, function(x) { return x.length > 0; });
-
- if (shown.length == 0) {
- this.to_show = this.selection;
- } else {
- this.to_show = _.select(this.selection, function(x) {
- return _.indexOf(shown, x[0]) !== -1 || x[0] === self.selected_value;
- });
+ console.log(this.selection);
+ this.render_elements();
}
},
-
/** Renders the widget. This function also checks for statusbar_colors='{"pending": "blue"}'
* attribute in the widget. This allows to set a given color to a given
* state (given by the key of (key, label)).
*/
render_elements: function () {
var self = this;
- var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_});
+ var content = instance.web.qweb.render("FieldStatus.content", {widget: this});
this.$element.html(content);
- if (this.clickable) {
- this.$element.addClass("oe_form_steps_clickable");
- $('.oe_form_steps_arrow').remove();
- var elemts = this.$element.find('.oe_form_steps_button');
- _.each(elemts, function(element){
- $item = $(element);
- if ($item.attr("data-id") != self.selected_value) {
- $item.click(function(event){
- var data_id = parseInt($(this).attr("data-id"))
- self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() {
- return self.view.reload();
- });
- });
- }
- });
- } else {
- this.$element.addClass("oe_form_steps");
- }
var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}");
var color = colors[this.selected_value];
- if (color) {
- var elem = this.$element.find("li.oe_form_steps_active span");
- elem.css("color", color);
+ if (color) {
+ this.$("oe_active").css("color", color);
+ }
+ },
+ on_click_stage: function (ev) {
+ var self = this;
+ var $li = $(ev.currentTarget);
+ var val = parseInt($li.data("id"));
+ if (val != self.selected_value) {
+ this.view.recursive_save().then(function() {
+ var change = {};
+ change[self.name] = val;
+ self.view.dataset.write(self.view.datarecord.id, change).then(function() {
+ self.view.reload();
+ });
+ });
}
},
});
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 61a1a834d0d..05d921bc679 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -1021,12 +1021,12 @@
-
-
+
+
- /
-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/addons/web_rpc/__init__.py b/addons/web_api/__init__.py
similarity index 100%
rename from addons/web_rpc/__init__.py
rename to addons/web_api/__init__.py
diff --git a/addons/web_api/__openerp__.py b/addons/web_api/__openerp__.py
new file mode 100644
index 00000000000..efc99afb7a9
--- /dev/null
+++ b/addons/web_api/__openerp__.py
@@ -0,0 +1,13 @@
+{
+ "name" : "OpenERP Web API",
+ "category" : "Hidden",
+ "description":"""Openerp Web API.""",
+ "version" : "2.0",
+ "depends" : ['web'],
+ "installable" : True,
+ 'auto_install': False,
+ 'js' : [
+ ],
+ 'css' : [
+ ],
+}
diff --git a/addons/web_rpc/i18n/es_CR.po b/addons/web_api/i18n/es_CR.po
similarity index 100%
rename from addons/web_rpc/i18n/es_CR.po
rename to addons/web_api/i18n/es_CR.po
diff --git a/addons/web_rpc/i18n/web_rpc.pot b/addons/web_api/i18n/web_rpc.pot
similarity index 100%
rename from addons/web_rpc/i18n/web_rpc.pot
rename to addons/web_api/i18n/web_rpc.pot
diff --git a/addons/web_api/static/src/example.html b/addons/web_api/static/src/example.html
new file mode 100644
index 00000000000..9c920e31fa2
--- /dev/null
+++ b/addons/web_api/static/src/example.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+ OpenERP web_api example
+
+
+
+
+
+
+
+
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]."]]>".$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 "
",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()";b+="
- var c = openerp.init(); // get a new webclient
- c._modules_loaded = true; // Hack to prevent loading of additional modules
-
- var s = new c.base.Session(); // setup a Session
- s.login("web-trunk", "admin", "admin", function() {
-
- var ds = new c.base.DataSetSearch(s, "ir.model"); // DataSetSearch used to search, read
- ds.read_slice(['name','model'], {}, function(users){
- for(var i in users) {
- $("#ex1res").append("<li>" + users[i].model + " (" + users[i].name + ") </li>")
- }
- });
- }
- );
-
</script>
-
-
Div for output:
-
-
-
-
Help me to complete this example page on launchpad