[ADD] Updated dhtmlxSheduler to version 3.0. (Fixed dhtmlx core initialization)

bzr revid: fme@openerp.com-20110803140914-5qjtozi94i4ruica
This commit is contained in:
Fabien Meghazi 2011-08-03 16:09:14 +02:00
parent 01aba99be5
commit dd456159b4
196 changed files with 11510 additions and 6828 deletions

View File

@ -3,7 +3,7 @@
"version": "2.0",
"depends": ['base'],
"js": [
'static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js',
'static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler_debug.js',
'static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_minical.js',
'static/src/js/calendar.js'
],

View File

@ -1,73 +0,0 @@
<h1>GNU GENERAL PUBLIC LICENSE</h1>
Version 2, June 1991 </p>
</p>
<p>Copyright (C) 1989, 1991 Free Software Foundation, Inc. </p>
<p>59 Temple Place - Suite 330, Boston, MA 02111-1307, USA</p>
</p>
<p>Everyone is permitted to copy and distribute verbatim copies</p>
<p>of this license document, but changing it is not allowed.</p>
</p>
</p>
<p>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</p>
<p>0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". </p>
</p>
<p>Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. </p>
</p>
<p>1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. </p>
</p>
<p>You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. </p>
</p>
<p>2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: </p>
</p>
</p>
<p>a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. </p>
</p>
<p>b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. </p>
</p>
<p>c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) </p>
<p>These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. </p>
</p>
<p>Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. </p>
</p>
<p>In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. </p>
</p>
<p>3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: </p>
</p>
<p>a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, </p>
</p>
<p>b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, </p>
</p>
<p>c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) </p>
<p>The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. </p>
</p>
<p>If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. </p>
</p>
<p>4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. </p>
</p>
<p>5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. </p>
</p>
<p>6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. </p>
</p>
<p>7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. </p>
</p>
<p>If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. </p>
</p>
<p>It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. </p>
</p>
<p>This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. </p>
</p>
<p>8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. </p>
</p>
<p>9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. </p>
</p>
<p>Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. </p>
</p>
<p>10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. </p>
</p>
<p>NO WARRANTY</p>
</p>
<p>11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. </p>
</p>
<p>12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. </p>
</p>
<p>

View File

@ -0,0 +1,706 @@
<?php
require_once("tools.php");
require_once("db_common.php");
require_once("dataprocessor.php");
require_once("update.php");
//enable buffering to catch and ignore any custom output before XML generation
//because of this command, it strongly recommended to include connector's file before any other libs
//in such case it will handle any extra output from not well formed code of other libs
ini_set("output_buffering","On");
ob_start();
class OutputWriter{
private $start;
private $end;
private $type;
public function __construct($start, $end = ""){
$this->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( '&amp;' , '&quot;', '&apos;' , '&lt;' , '&gt;', '&apos;' ), $string);
}
/*! return starting tag for self as XML string
*/
public function to_xml_start(){
$str="<item";
for ($i=0; $i < sizeof($this->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 "</item>";
}
}
/*! 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( '&amp;' , '&quot;', '&apos;' , '&lt;' , '&gt;', '&apos;' ), $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="<?xml version='1.0' encoding='".$this->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 "<data>";
}
/*! renders self as xml, ending part
*/
protected function xml_end(){
return "</data>";
}
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);
}
}
?>

View File

@ -0,0 +1,89 @@
<?php
require_once("base_connector.php");
/*! DataItem class for Combo component
**/
class ComboDataItem extends DataItem{
private $selected;//!< flag of selected option
function __construct($data,$config,$index){
parent::__construct($data,$config,$index);
$this->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 "<option ".($this->selected?"selected='true'":"")."value='".$this->get_id()."'><![CDATA[".$this->data[$this->config->text[0]["name"]]."]]>";
}
/*! return self as XML string, ending part
*/
function to_xml_end(){
if ($this->skip) return "";
return "</option>";
}
}
/*! 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 "<complete add='true'>";
else
return "<complete>";
}
/*! renders self as xml, ending part
*/
public function xml_end(){
return "</complete>";
}
}
?>

View File

@ -0,0 +1,141 @@
/*
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; i<inds.length; i++)
inds[i]="dhx_filter["+inds[i]+"]="+encodeURIComponent(vals[i]);
this._connector_filter="&"+inds.join("&");
return combine_urls.call(this,url);
}
this.attachEvent("onCollectValues",function(ind){
if (this._con_f_used[ind]){
if (typeof(this._con_f_used[ind]) == "object")
return this._con_f_used[ind];
else
return false;
}
return true;
});
this.attachEvent("onDynXLS",function(){
this.xmlFileUrl=combine_urls.call(this,this.xmlFileUrl);
return true;
});
this.attachEvent("onBeforeSorting",function(ind,type,dir){
if (type=="connector"){
var self=this;
this.clearAndLoad(sorting_url.call(this,this.xmlFileUrl,ind,dir),function(){
self.setSortImgState(true,ind,dir);
});
return false;
}
return true;
});
this.attachEvent("onFilterStart",function(a,b){
if (this._con_f_used.length){
this.clearAndLoad(filtering_url.call(this,this.xmlFileUrl,a,b));
return false;
}
return true;
});
this.attachEvent("onXLE",function(a,b,c,xml){
if (!xml) return;
});
if (this._init_point_connector) this._init_point_connector();
}
dhtmlXGridObject.prototype._con_f_used=[];
dhtmlXGridObject.prototype._in_header_connector_text_filter=function(t,i){
if (!this._con_f_used[i])
this._con_f_used[i]=1;
return this._in_header_text_filter(t,i);
}
dhtmlXGridObject.prototype._in_header_connector_select_filter=function(t,i){
if (!this._con_f_used[i])
this._con_f_used[i]=2;
return this._in_header_select_filter(t,i);
}
dhtmlXGridObject.prototype.load_connector=dhtmlXGridObject.prototype.load;
dhtmlXGridObject.prototype.load=function(url, call, type){
if (!this._colls_loaded && this.cellType){
var ar=[];
for (var i=0; i < this.cellType.length; i++)
if (this.cellType[i].indexOf("co")==0 || this._con_f_used[i]==2) ar.push(i);
if (ar.length)
arguments[0]+=(arguments[0].indexOf("?")!=-1?"&":"?")+"connector=true&dhx_colls="+ar.join(",");
}
return this.load_connector.apply(this,arguments);
}
dhtmlXGridObject.prototype._parseHead_connector=dhtmlXGridObject.prototype._parseHead;
dhtmlXGridObject.prototype._parseHead=function(url, call, type){
this._parseHead_connector.apply(this,arguments);
if (!this._colls_loaded){
var cols = this.xmlLoader.doXPath("./coll_options", arguments[0]);
for (var i=0; i < cols.length; i++){
var f = cols[i].getAttribute("for");
var v = [];
var combo=null;
if (this.cellType[f] == "combo")
combo = this.getColumnCombo(f);
if (this.cellType[f].indexOf("co")==0)
combo=this.getCombo(f);
var os = this.xmlLoader.doXPath("./item",cols[i]);
for (var j=0; j<os.length; j++){
var val=os[j].getAttribute("value");
if (combo){
var lab=os[j].getAttribute("label")||val;
if (combo.addOption)
combo.addOption([[val, lab]]);
else
combo.put(val,lab);
v[v.length]=lab;
} else
v[v.length]=val;
}
if (this._con_f_used[f*1])
this._con_f_used[f*1]=v;
};
this._colls_loaded=true;
}
}
}
if (window.dataProcessor){
dataProcessor.prototype.init_original=dataProcessor.prototype.init;
dataProcessor.prototype.init=function(obj){
this.init_original(obj);
obj._dataprocessor=this;
this.setTransactionMode("POST",true);
this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true";
}
}
dhtmlxError.catchError("LoadXML",function(a,b,c){
alert(c[0].responseText);
});

View File

@ -0,0 +1,120 @@
<?php
class DelayedConnector extends Connector{
protected $init_flag=false;//!< used to prevent rendering while initialization
private $data_mode=false;//!< flag to separate xml and data request modes
private $data_result=false;//<! store results of query
public function dataMode($name){
$this->data_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;
}
}
}
?>

View File

@ -0,0 +1,465 @@
<?php
/*! Base DataProcessor handling
**/
class DataProcessor{
protected $connector;//!< Connector instance
protected $config;//!< DataConfig instance
protected $request;//!< DataRequestConfig instance
/*! constructor
@param connector
Connector object
@param config
DataConfig object
@param request
DataRequestConfig object
*/
function __construct($connector,$config,$request){
$this->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 "<?xml version='1.0' ?>";
echo "<data>";
for ($i=0; $i < sizeof($results); $i++)
echo $results[$i]->to_xml();
echo "</data>";
}
}
/*! 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("<![CDATA[".$text."]]>");
}
/*! 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="<action type='{$this->status}' sid='{$this->id}' tid='{$this->nid}' ";
foreach ($this->attrs as $k => $v) {
$str.=$k."='".$v."' ";
}
$str.=">{$this->output}</action>";
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};";
}
}
?>

View File

@ -0,0 +1,959 @@
<?php
require_once("tools.php");
/*! manager of data request
**/
class DataRequestConfig{
private $filters; //!< array of filtering rules
private $relation=false; //!< ID or other element used for linking hierarchy
private $sort_by; //!< sorting field
private $start; //!< start of requested data
private $count; //!< length of requested data
private $user;
private $version;
//for render_sql
private $source; //!< souce table or another source destination
private $fieldset; //!< set of data, which need to be retrieved from source
/*! constructor
@param proto
DataRequestConfig object, optional, if provided then new request object will copy all properties from provided one
*/
public function __construct($proto=false){
if ($proto)
$this->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; $i<sizeof($this->text); $i++)
$str.="{$this->text[$i]['db_name']}({$this->text[$i]['name']}),";
$str.="\nExtra:";
for ($i=0; $i<sizeof($this->data); $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; $i<sizeof($collection); $i++)
if ($collection[$i]["name"] == $name || $collection[$i]["db_name"] == $name) return $i;
return -1;
}
}
/*! Base abstraction class, used for data operations
Class abstract access to data, it is a base class to all DB wrappers
**/
abstract class DataWrapper{
protected $connection;
protected $config;//!< DataConfig instance
/*! constructor
@param connection
DB connection
@param config
DataConfig instance
*/
public function __construct($connection,$config){
$this->config=$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.'`';
}
}
?>

View File

@ -0,0 +1,66 @@
<?php
require_once("db_common.php");
/*! MSSQL implementation of DataWrapper
**/
class MsSQLDBDataWrapper extends DBDataWrapper{
private $last_id=""; //!< ID of previously inserted record
private $insert_operation=false; //!< flag of insert operation
private $start_from=false; //!< index of start position
public function query($sql){
LogMaster::log($sql);
$res = mssql_query($sql,$this->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");
}
}
?>

View File

@ -0,0 +1,53 @@
<?php
require_once("db_common.php");
class MySQLiDBDataWrapper extends MySQLDBDataWrapper{
public function query($sql){
LogMaster::log($sql);
$res = $this->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;
}
}
?>

View File

@ -0,0 +1,79 @@
<?php
require_once("db_common.php");
/*! Implementation of DataWrapper for Oracle
**/
class OracleDBDataWrapper extends DBDataWrapper{
private $last_id=""; //id of previously inserted record
private $insert_operation=false; //flag of insert operation
public function query($sql){
LogMaster::log($sql);
$stm = oci_parse($this->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);
}
}
?>

View File

@ -0,0 +1,65 @@
<?php
require_once("db_common.php");
/*! Implementation of DataWrapper for PDO
if you plan to use it for Oracle - use Oracle connection type instead
**/
class PDODBDataWrapper extends DBDataWrapper{
private $last_result;//!< store result or last operation
public function query($sql){
LogMaster::log($sql);
$res=$this->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;
}
}
?>

View File

@ -0,0 +1,66 @@
<?php
require_once("db_common.php");
/*! Implementation of DataWrapper for PostgreSQL
**/
class PostgreDBDataWrapper extends DBDataWrapper{
public function query($sql){
LogMaster::log($sql);
$res=pg_query($this->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 );
}
}
?>

View File

@ -0,0 +1,268 @@
<?php
require_once("base_connector.php");
require_once("grid_config.php");
//require_once("grid_dataprocessor.php");
/*! DataItem class for Grid component
**/
class GridDataItem extends DataItem{
protected $row_attrs;//!< hash of row attributes
protected $cell_attrs;//!< hash of cell attributes
protected $userdata;
function __construct($data,$name,$index=0){
parent::__construct($data,$name,$index);
$this->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 id='".$this->get_id()."'";
foreach ($this->row_attrs as $k=>$v)
$str.=" ".$k."='".$v."'";
$str.=">";
for ($i=0; $i < sizeof($this->config->text); $i++){
$str.="<cell";
$name=$this->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.="><![CDATA[".$this->data[$name]."]]></cell>";
}
foreach ($this->userdata as $key => $value)
$str.="<userdata name='".$key."'><![CDATA[".$value."]]></userdata>";
return $str;
}
/*! return self as XML string, ending part
*/
public function to_xml_end(){
if ($this->skip) return "";
return "</row>";
}
}
/*! 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( '&amp;' , '&quot;', '&apos;' , '&lt;' , '&gt;', '&apos;' ), $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.="<item value='".$this->xmlentities($k)."' label='".$this->xmlentities($v)."' />";
$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.="<coll_options for='{$names[$i]}'>";
if (!is_string($this->options[$name]))
$this->extra_output.=$this->options[$name]->render();
else
$this->extra_output.=$this->options[$name];
$this->extra_output.="</coll_options>";
}
}
/*! renders self as xml, starting part
*/
protected function xml_start(){
if ($this->dload){
if ($pos=$this->request->get_start())
return "<rows pos='".$pos."'>";
else
return "<rows total_count='".$this->sql->get_size($this->request)."'>";
}
else
return "<rows>";
}
/*! renders self as xml, ending part
*/
protected function xml_end(){
return $this->extra_output."</rows>";
}
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;
}
}
?>

View File

@ -0,0 +1,121 @@
<?php
require_once("base_connector.php");
/*! DataItem class for Scheduler component
**/
class SchedulerDataItem extends DataItem{
/*! return self as XML string
*/
function to_xml(){
if ($this->skip) return "";
$str="<event id='".$this->get_id()."' >";
$str.="<start_date><![CDATA[".$this->data[$this->config->text[0]["name"]]."]]></start_date>";
$str.="<end_date><![CDATA[".$this->data[$this->config->text[1]["name"]]."]]></end_date>";
$str.="<text><![CDATA[".$this->data[$this->config->text[2]["name"]]."]]></text>";
for ($i=3; $i<sizeof($this->config->text); $i++){
$extra = $this->config->text[$i]["name"];
$str.="<".$extra."><![CDATA[".$this->data[$extra]."]]></".$extra.">";
}
return $str."</event>";
}
}
/*! 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.="<item value='".$this->xmlentities($k)."' label='".$this->xmlentities($v)."' />";
$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.="<coll_options for='{$name}'>";
if (!is_string($this->options[$name]))
$this->extra_output.=$this->options[$name]->render();
else
$this->extra_output.=$this->options[$name];
$this->extra_output.="</coll_options>";
}
}
/*! renders self as xml, ending part
*/
protected function xml_end(){
$this->fill_collections();
return $this->extra_output."</data>";
}
/*! 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;
}
}
?>

View File

@ -0,0 +1,254 @@
<?php
/*!
@file
Inner classes, which do common tasks. No one of them is purposed for direct usage.
*/
/*! Class which allows to assign|fire events.
*/
class EventMaster{
private $events;//!< hash of event handlers
private static $eventsStatic=array();
/*! constructor
*/
function __construct(){
$this->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 "<pre><xmp>\n";
echo LogMaster::get_session_log();
echo "\n</xmp></pre>";
}
die();
}
/*! enable logging
@param name
path to the log file, if boolean false provided as value - logging will be disabled
@param output
flag of client side output, if enabled - session log will be sent to client side in case of an error.
*/
public static function enable_log($name,$output=false){
LogMaster::$_log=$name;
LogMaster::$_output=$output;
if ($name){
set_error_handler(array("LogMaster","error_log"),E_ALL);
set_exception_handler(array("LogMaster","exception_log"));
LogMaster::log("\n\n====================================\nLog started, ".date("d/m/Y h:m:s")."\n====================================");
}
}
}
?>

View File

@ -0,0 +1,274 @@
<?php
require_once("base_connector.php");
/*! DataItem class for Tree component
**/
class TreeDataItem extends DataItem{
private $im0;//!< image of closed folder
private $im1;//!< image of opened folder
private $im2;//!< image of leaf item
private $check;//!< checked state
private $kids=-1;//!< checked state
private $attrs;//!< collection of custom attributes
function __construct($data,$config,$index){
parent::__construct($data,$config,$index);
$this->im0=false;
$this->im1=false;
$this->im2=false;
$this->check=false;
$this->attrs = array();
$this->userdata = array();
}
/*! get id of parent record
@return
id of parent record
*/
function get_parent_id(){
return $this->data[$this->config->relation_id["name"]];
}
/*! get state of items checkbox
@return
state of item's checkbox as int value, false if state was not defined
*/
function get_check_state(){
return $this->check;
}
/*! set state of item's checkbox
@param value
int value, 1 - checked, 0 - unchecked, -1 - third state
*/
function set_check_state($value){
$this->check=$value;
}
/*! return count of child items
-1 if there is no info about childs
@return
count of child items
*/
function has_kids(){
return $this->kids;
}
/*! sets count of child items
@param value
count of child items
*/
function set_kids($value){
$this->kids=$value;
}
/*! set custom attribute
@param name
name of the attribute
@param value
new value of the attribute
*/
function set_attribute($name, $value){
switch($name){
case "id":
$this->set_id($value);
break;
case "text":
$this->data[$this->config->text[0]["name"]]=$value;
break;
case "checked":
$this->set_check_state($value);
break;
case "im0":
$this->im0=$value;
break;
case "im1":
$this->im1=$value;
break;
case "im2":
$this->im2=$value;
break;
case "child":
$this->set_kids($value);
break;
default:
$this->attrs[$name]=$value;
}
}
/*! set userdata section for the item
@param name
name of userdata
@param value
value of userdata
*/
function set_userdata($name, $value){
$this->userdata[$name]=$value;
}
/*! assign image for tree's item
@param img_folder_closed
image for item, which represents folder in closed state
@param img_folder_open
image for item, which represents folder in opened state, optional
@param img_leaf
image for item, which represents leaf item, optional
*/
function set_image($img_folder_closed,$img_folder_open=false,$img_leaf=false){
$this->im0=$img_folder_closed;
$this->im1=$img_folder_open?$img_folder_open:$img_folder_closed;
$this->im2=$img_leaf?$img_leaf:$img_folder_closed;
}
/*! return self as XML string, starting part
*/
function to_xml_start(){
if ($this->skip) return "";
$str1="<item id='".$this->get_id()."' text='".$this->xmlentities($this->data[$this->config->text[0]["name"]])."' ";
if ($this->has_kids()==true) $str1.="child='".$this->has_kids()."' ";
if ($this->im0) $str1.="im0='".$this->im0."' ";
if ($this->im1) $str1.="im1='".$this->im0."' ";
if ($this->im2) $str1.="im2='".$this->im0."' ";
if ($this->check) $str1.="checked='".$this->check."' ";
foreach ($this->attrs as $key => $value)
$str1.=$key."='".$this->xmlentities($value)."' ";
$str1.=">";
foreach ($this->userdata as $key => $value)
$str1.="<userdata name='".$key."'><![CDATA[".$value."]]></userdata>";
return $str1;
}
/*! return self as XML string, ending part
*/
function to_xml_end(){
if ($this->skip) return "";
return "</item>";
}
}
require_once("filesystem_item.php");
/*! Connector for the dhtmlxtree
**/
class TreeConnector extends Connector{
private $id_swap = array();
/*! constructor
Here initilization of all Masters occurs, execution timer initialized
@param res
db connection resource
@param type
string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided
@param item_type
name of class, which will be used for item rendering, optional, DataItem will be used by default
@param data_type
name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default.
*/
public function __construct($res,$type=false,$item_type=false,$data_type=false){
if (!$item_type) $item_type="TreeDataItem";
if (!$data_type) $data_type="TreeDataProcessor";
parent::__construct($res,$type,$item_type,$data_type);
$this->event->attach("afterInsert",array($this,"parent_id_correction_a"));
$this->event->attach("beforeProcessing",array($this,"parent_id_correction_b"));
}
/*! store info about ID changes during insert operation
@param dataAction
data action object during insert operation
*/
public function parent_id_correction_a($dataAction){
$this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id();
}
/*! update ID if it was affected by previous operation
@param dataAction
data action object, before any processing operation
*/
public function parent_id_correction_b($dataAction){
$relation = $this->config->relation_id["db_name"];
$value = $dataAction->get_value($relation);
if (array_key_exists($value,$this->id_swap))
$dataAction->set_value($relation,$this->id_swap[$value]);
}
public function parse_request(){
parent::parse_request();
if (isset($_GET["id"]))
$this->request->set_relation($_GET["id"]);
else
$this->request->set_relation("0");
$this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode
}
protected function render_set($res){
$output="";
$index=0;
while ($data=$this->sql->get_next($res)){
$data = new $this->names["item_class"]($data,$this->config,$index);
$this->event->trigger("beforeRender",$data);
//there is no info about child elements,
//if we are using dyn. loading - assume that it has,
//in normal mode juse exec sub-render routine
if ($data->has_kids()===-1 && $this->dload)
$data->set_kids(true);
$output.=$data->to_xml_start();
if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){
$sub_request = new DataRequestConfig($this->request);
$sub_request->set_relation($data->get_id());
$output.=$this->render_set($this->sql->select($sub_request));
}
$output.=$data->to_xml_end();
$index++;
}
return $output;
}
/*! renders self as xml, starting part
*/
public function xml_start(){
return "<tree id='".$this->request->get_relation()."'>";
}
/*! renders self as xml, ending part
*/
public function xml_end(){
return "</tree>";
}
}
class TreeDataProcessor extends DataProcessor{
function __construct($connector,$config,$request){
parent::__construct($connector,$config,$request);
$request->set_relation(false);
}
/*! convert incoming data name to valid db name
converts c0..cN to valid field names
@param data
data name from incoming request
@return
related db_name
*/
function name_data($data){
if ($data=="tr_pid")
return $this->config->relation_id["db_name"];
if ($data=="tr_text")
return $this->config->text[0]["db_name"];
return $data;
}
}
?>

View File

@ -0,0 +1,161 @@
<?php
require_once("grid_connector.php");
/*! DataItem class for TreeGrid component
**/
class TreeGridDataItem extends GridDataItem{
private $kids=-1;//!< checked state
function __construct($data,$config,$index){
parent::__construct($data,$config,$index);
$this->im0=false;
}
/*! return id of parent record
@return
id of parent record
*/
function get_parent_id(){
return $this->data[$this->config->relation_id["name"]];
}
/*! assign image to treegrid's item
longer description
@param img
relative path to the image
*/
function set_image($img){
$this->set_cell_attribute($this->config->text[0]["name"],"image",$img);
}
/*! return count of child items
-1 if there is no info about childs
@return
count of child items
*/
function has_kids(){
return $this->kids;
}
/*! sets count of child items
@param value
count of child items
*/
function set_kids($value){
$this->kids=$value;
if ($value)
$this->set_row_attribute("xmlkids",$value);
}
}
/*! Connector for dhtmlxTreeGrid
**/
class TreeGridConnector extends GridConnector{
private $id_swap = array();
/*! constructor
Here initilization of all Masters occurs, execution timer initialized
@param res
db connection resource
@param type
string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided
@param item_type
name of class, which will be used for item rendering, optional, DataItem will be used by default
@param data_type
name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default.
*/
public function __construct($res,$type=false,$item_type=false,$data_type=false){
if (!$item_type) $item_type="TreeGridDataItem";
if (!$data_type) $data_type="TreeGridDataProcessor";
parent::__construct($res,$type,$item_type,$data_type);
$this->event->attach("afterInsert",array($this,"parent_id_correction_a"));
$this->event->attach("beforeProcessing",array($this,"parent_id_correction_b"));
}
/*! store info about ID changes during insert operation
@param dataAction
data action object during insert operation
*/
public function parent_id_correction_a($dataAction){
$this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id();
}
/*! update ID if it was affected by previous operation
@param dataAction
data action object, before any processing operation
*/
public function parent_id_correction_b($dataAction){
$relation = $this->config->relation_id["db_name"];
$value = $dataAction->get_value($relation);
if (array_key_exists($value,$this->id_swap))
$dataAction->set_value($relation,$this->id_swap[$value]);
}
/*! process treegrid specific options in incoming request
*/
public function parse_request(){
parent::parse_request();
if (isset($_GET["id"]))
$this->request->set_relation($_GET["id"]);
else
$this->request->set_relation("0");
$this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode
}
/*! process treegrid specific options in incoming request
*/
protected function render_set($res){
$output="";
$index=0;
while ($data=$this->sql->get_next($res)){
$data = new $this->names["item_class"]($data,$this->config,$index);
$this->event->trigger("beforeRender",$data);
//there is no info about child elements,
//if we are using dyn. loading - assume that it has,
//in normal mode juse exec sub-render routine
if ($data->has_kids()===-1 && $this->dload)
$data->set_kids(true);
$output.=$data->to_xml_start();
if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){
$sub_request = new DataRequestConfig($this->request);
$sub_request->set_relation($data->get_id());
$output.=$this->render_set($this->sql->select($sub_request));
}
$output.=$data->to_xml_end();
$index++;
}
return $output;
}
/*! renders self as xml, starting part
*/
protected function xml_start(){
return "<rows parent='".$this->request->get_relation()."'>";
}
}
/*! DataProcessor class for Grid component
**/
class TreeGridDataProcessor extends GridDataProcessor{
function __construct($connector,$config,$request){
parent::__construct($connector,$config,$request);
$request->set_relation(false);
}
/*! convert incoming data name to valid db name
converts c0..cN to valid field names
@param data
data name from incoming request
@return
related db_name
*/
function name_data($data){
if ($data=="gr_pid")
return $this->config->relation_id["name"];
else return parent::name_data($data);
}
}
?>

View File

@ -0,0 +1,262 @@
<?php
/*! DataItemUpdate class for realization Optimistic concurrency control
Wrapper for DataItem object
It's used during outputing updates instead of DataItem object
Create wrapper for every data item with update information.
*/
class DataItemUpdate extends DataItem {
/*! constructor
@param data
hash of data
@param config
DataConfig object
@param index
index of element
*/
public function __construct($data,$config,$index,$type){
$this->config=$config;
$this->data=$data;
$this->index=$index;
$this->skip=false;
$this->child = new $type($data, $config, $index);
}
/*! returns parent_id (for Tree and TreeGrid components)
*/
public function get_parent_id(){
if (method_exists($this->child, 'get_parent_id')) {
return $this->child->get_parent_id();
} else {
return '';
}
}
/*! generate XML on the data hash base
*/
public function to_xml(){
$str= "<update ";
$str .= 'status="'.$this->data['type'].'" ';
$str .= 'id="'.$this->data['dataId'].'" ';
$str .= 'parent="'.$this->get_parent_id().'"';
$str .= '>';
$str .= $this->child->to_xml();
$str .= '</update>';
return $str;
}
/*! return starting tag for XML string
*/
public function to_xml_start(){
$str="<update ";
$str .= 'status="'.$this->data['type'].'" ';
$str .= 'id="'.$this->data['dataId'].'" ';
$str .= 'parent="'.$this->get_parent_id().'"';
$str .= '>';
$str .= $this->child->to_xml_start();
return $str;
}
/*! return ending tag for XML string
*/
public function to_xml_end(){
$str = $this->child->to_xml_end();
$str .= '</update>';
return $str;
}
/*! returns false for outputing only current item without child items
*/
public function has_kids(){
return false;
}
/*! sets count of child items
@param value
count of child items
*/
public function set_kids($value){
if (method_exists($this->child, 'set_kids')) {
$this->child->set_kids($value);
}
}
/*! sets attribute for item
*/
public function set_attribute($name, $value){
if (method_exists($this->child, 'set_attribute')) {
LogMaster::log("setting attribute: \nname = {$name}\nvalue = {$value}");
$this->child->set_attribute($name, $value);
} else {
LogMaster::log("set_attribute method doesn't exists");
}
}
}
class DataUpdate{
protected $table; //!< table , where actions are stored
protected $url; //!< url for notification service, optional
protected $sql; //!< DB wrapper object
protected $config; //!< DBConfig object
protected $request; //!< DBRequestConfig object
protected $event;
protected $item_class;
protected $demu;
//protected $config;//!< DataConfig instance
//protected $request;//!< DataRequestConfig instance
/*! constructor
@param connector
Connector object
@param config
DataConfig object
@param request
DataRequestConfig object
*/
function __construct($sql, $config, $request, $table, $url){
$this->config= $config;
$this->request= $request;
$this->sql = $sql;
$this->table=$table;
$this->url=$url;
$this->demu = false;
}
public function set_demultiplexor($path){
$this->demu = $path;
}
public function set_event($master, $name){
$this->event = $master;
$this->item_class = $name;
}
private function select_update($actions_table, $join_table, $id_field_name, $version, $user) {
$sql = "SELECT * FROM {$actions_table}";
$sql .= " LEFT OUTER JOIN {$join_table} ON ";
$sql .= "{$actions_table}.DATAID = {$join_table}.{$id_field_name} ";
$sql .= "WHERE {$actions_table}.ID > '{$version}' AND {$actions_table}.USER <> '{$user}'";
return $sql;
}
private function get_update_max_version() {
$sql = "SELECT MAX(id) as VERSION FROM {$this->table}";
$res = $this->sql->query($sql);
$data = $this->sql->get_next($res);
if ($data == false || $data['VERSION'] == false)
return 1;
else
return $data['VERSION'];
}
private function log_update_action($actions_table, $dataId, $status, $user) {
$sql = "INSERT INTO {$actions_table} (DATAID, TYPE, USER) VALUES ('{$dataId}', '{$status}', '{$user}')";
$this->sql->query($sql);
if ($this->demu)
file_get_contents($this->demu);
}
/*! records operations in actions_table
@param action
DataAction object
*/
public function log_operations($action) {
$type = $this->sql->escape($action->get_status());
$dataId = $this->sql->escape($action->get_new_id());
$user = $this->sql->escape($this->request->get_user());
if ($type!="error" && $type!="invalid" && $type !="collision") {
$this->log_update_action($this->table, $dataId, $type, $user);
}
}
/*! return action version in XMl format
*/
public function get_version() {
$version = $this->get_update_max_version();
return "<userdata name='version'>".$version."</userdata>";
}
/*! adds action version in output XML as userdata
*/
public function version_output() {
echo $this->get_version();
}
/*! create update actions in XML-format and sends it to output
*/
public function get_updates() {
$sub_request = new DataRequestConfig($this->request);
$version = $this->request->get_version();
$user = $this->request->get_user();
$sub_request->parse_sql($this->select_update($this->table, $this->request->get_source(), $this->config->id['db_name'], $version, $user));
$sub_request->set_relation(false);
$output = $this->render_set($this->sql->select($sub_request), $this->item_class);
ob_clean();
header("Content-type:text/xml");
echo $this->updates_start();
echo $this->get_version();
echo $output;
echo $this->updates_end();
}
protected function render_set($res, $name){
$output="";
$index=0;
while ($data=$this->sql->get_next($res)){
$data = new DataItemUpdate($data,$this->config,$index, $name);
$this->event->trigger("beforeRender",$data);
$output.=$data->to_xml();
$index++;
}
return $output;
}
/*! returns update start string
*/
protected function updates_start() {
$start = '<updates>';
return $start;
}
/*! returns update end string
*/
protected function updates_end() {
$start = '</updates>';
return $start;
}
/*! checks if action version given by client is deprecated
@param action
DataAction object
*/
public function check_collision($action) {
$version = $this->sql->escape($this->request->get_version());
//$user = $this->sql->escape($this->request->get_user());
$last_version = $this->get_update_max_version();
if (($last_version > $version)&&($action->get_status() == 'update')) {
$action->error();
$action->set_status('collision');
}
}
}
?>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,318 @@
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterise License
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
window.dhx||(dhx={});dhx.version="3.0";dhx.codebase="./";dhx.name="Core";dhx.copy=function(a){var b=dhx.copy.Sd;b.prototype=a;return new b};dhx.copy.Sd=function(){};dhx.extend=function(a,b,c){a.Ya&&(a=a.Ya[0]);for(var d in b)if(!a[d]||c)a[d]=b[d];b.defaults&&dhx.extend(a.defaults,b.defaults);b.$init&&b.$init.call(a);return a};
dhx.fullCopy=function(a){var b=a.length?[]:{};arguments.length>1&&(b=arguments[0],a=arguments[1]);for(var c in a)typeof a[c]=="object"?(b[c]=a[c].length?[]:{},dhx.fullCopy(b[c],a[c])):b[c]=a[c];return b};dhx.single=function(a){var b=null,c=function(c){b||(b=new a({}));b.Yc&&b.Yc.apply(b,arguments);return b};return c};
dhx.protoUI=function(){var a=arguments,b=a[0].name,c=function(d){if(a){for(var e=[a[0]],f=1;f<a.length;f++)e[f]=a[f],e[f].Ya&&(e[f]=e[f].call(dhx)),e[f].prototype&&e[f].prototype.name&&(dhx.ui[e[f].prototype.name]=e[f]);dhx.ui[b]=dhx.proto.apply(dhx,e);if(c.Ga)for(f=0;f<c.Ga.length;f++)dhx.Type(dhx.ui[b],c.Ga[f]);c=a=null}return this!=dhx?new dhx.ui[b](d):dhx.ui[b]};c.Ya=arguments;return dhx.ui[b]=c};
dhx.proto=function(){for(var a=arguments,b=a[0],c=!!b.$init,d=[],e=a.length-1;e>0;e--){if(typeof a[e]=="function")a[e]=a[e].prototype;a[e].$init&&d.push(a[e].$init);if(a[e].defaults){var f=a[e].defaults;if(!b.defaults)b.defaults={};for(var g in f)dhx.isNotDefined(b.defaults[g])&&(b.defaults[g]=f[g])}if(a[e].type&&b.type)for(g in a[e].type)b.type[g]||(b.type[g]=a[e].type[g]);for(var h in a[e])b[h]||(b[h]=a[e][h])}c&&d.push(b.$init);b.$init=function(){for(var a=0;a<d.length;a++)d[a].apply(this,arguments)};
var i=function(a){this.$ready=[];this.$init(a);this.Rb&&this.Rb(a,this.defaults);for(var b=0;b<this.$ready.length;b++)this.$ready[b].call(this)};i.prototype=b;b=a=null;return i};dhx.bind=function(a,b){return function(){return a.apply(b,arguments)}};dhx.require=function(a){dhx.Mc[a]||(dhx.exec(dhx.ajax().sync().get(dhx.codebase+a).responseText),dhx.Mc[a]=!0)};dhx.Mc={};dhx.exec=function(a){window.execScript?window.execScript(a):window.eval(a)};
dhx.wrap=function(a,b){return!a?b:function(){var c=a.apply(this,arguments);b.apply(this,arguments);return c}};dhx.methodPush=function(a,b){return function(){var c=!1;return c=a[b].apply(a,arguments)}};dhx.isNotDefined=function(a){return typeof a=="undefined"};dhx.delay=function(a,b,c,d){return window.setTimeout(function(){var d=a.apply(b,c||[]);a=b=c=null;return d},d||1)};dhx.uid=function(){if(!this.bc)this.bc=(new Date).valueOf();this.bc++;return this.bc};
dhx.toNode=function(a){return typeof a=="string"?document.getElementById(a):a};dhx.toArray=function(a){return dhx.extend(a||[],dhx.PowerArray,!0)};dhx.toFunctor=function(a){return typeof a=="string"?eval(a):a};dhx.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"};dhx.o={};dhx.event=function(a,b,c,d){var a=dhx.toNode(a),e=dhx.uid();d&&(c=dhx.bind(c,d));dhx.o[e]=[a,b,c];a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c);return e};
dhx.eventRemove=function(a){if(a){var b=dhx.o[a];b[0].removeEventListener?b[0].removeEventListener(b[1],b[2],!1):b[0].detachEvent&&b[0].detachEvent("on"+b[1],b[2]);delete this.o[a]}};
dhx.EventSystem={$init:function(){this.o={};this.ka={};this.Mb={}},blockEvent:function(){this.o.oc=!0},unblockEvent:function(){this.o.oc=!1},mapEvent:function(a){dhx.extend(this.Mb,a,!0)},on_setter:function(a){if(a)for(var b in a)typeof a[b]=="function"&&this.attachEvent(b,a[b])},callEvent:function(a,b){if(this.o.oc)return!0;var a=a.toLowerCase(),c=this.o[a.toLowerCase()],d=!0;if(c)for(var e=0;e<c.length;e++)if(c[e].apply(this,b||[])===!1)d=!1;this.Mb[a]&&!this.Mb[a].callEvent(a,b)&&(d=!1);return d},
attachEvent:function(a,b,c){var a=a.toLowerCase(),c=c||dhx.uid(),b=dhx.toFunctor(b),d=this.o[a]||dhx.toArray();d.push(b);this.o[a]=d;this.ka[c]={f:b,t:a};return c},detachEvent:function(a){if(this.ka[a]){var b=this.ka[a].t,c=this.ka[a].f,d=this.o[b];d.remove(c);delete this.ka[a]}},hasEvent:function(a){a=a.toLowerCase();return this.o[a]?!0:!1}};dhx.extend(dhx,dhx.EventSystem);
dhx.PowerArray={removeAt:function(a,b){a>=0&&this.splice(a,b||1)},remove:function(a){this.removeAt(this.find(a))},insertAt:function(a,b){if(!b&&b!==0)this.push(a);else{var c=this.splice(b,this.length-b);this[b]=a;this.push.apply(this,c)}},find:function(a){for(var b=0;b<this.length;b++)if(a==this[b])return b;return-1},each:function(a,b){for(var c=0;c<this.length;c++)a.call(b||this,this[c])},map:function(a,b){for(var c=0;c<this.length;c++)this[c]=a.call(b||this,this[c]);return this}};dhx.env={};
(function(){if(navigator.userAgent.indexOf("Mobile")!=-1)dhx.env.mobile=!0;if(dhx.env.mobile||navigator.userAgent.indexOf("iPad")!=-1||navigator.userAgent.indexOf("Android")!=-1)dhx.env.touch=!0;navigator.userAgent.indexOf("Opera")!=-1?dhx.env.isOpera=!0:(dhx.env.isIE=!!document.all,dhx.env.isFF=!document.all,dhx.env.isWebKit=navigator.userAgent.indexOf("KHTML")!=-1,dhx.env.isSafari=dhx.env.isWebKit&&navigator.userAgent.indexOf("Mac")!=-1);if(navigator.userAgent.toLowerCase().indexOf("android")!=
-1)dhx.env.isAndroid=!0;dhx.env.transform=!1;dhx.env.transition=!1;for(var a={names:["transform","transition"],transform:["transform","WebkitTransform","MozTransform","oTransform","msTransform"],transition:["transition","WebkitTransition","MozTransition","oTransition","msTransition"]},b=document.createElement("DIV"),c=0;c<a.names.length;c++)for(var d=a[a.names[c]],e=0;e<d.length;e++)if(typeof b.style[d[e]]!="undefined"){dhx.env[a.names[c]]=d[e];break}b.style[dhx.env.transform]="translate3d(0,0,0)";
dhx.env.translate=b.style[dhx.env.transform]?"translate3d":"translate";dhx.env.transformCSSPrefix=function(){var a;dhx.env.isOpera?a="-o-":(a="",dhx.env.isFF&&(a="-Moz-"),dhx.env.isWebKit&&(a="-webkit-"),dhx.env.isIE&&(a="-ms-"));return a}();dhx.env.transformPrefix=dhx.env.transformCSSPrefix.replace(/-/gi,"");dhx.env.transitionEnd=dhx.env.transformCSSPrefix=="-Moz-"?"transitionend":dhx.env.transformPrefix+"TransitionEnd"})();
dhx.env.svg=function(){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}();
dhx.html={create:function(a,b,c){var b=b||{},d=document.createElement(a),e;for(e in b)d.setAttribute(e,b[e]);if(b.style)d.style.cssText=b.style;if(b["class"])d.className=b["class"];if(c)d.innerHTML=c;return d},getValue:function(a){a=dhx.toNode(a);return!a?"":dhx.isNotDefined(a.value)?a.innerHTML:a.value},remove:function(a){if(a instanceof Array)for(var b=0;b<a.length;b++)this.remove(a[b]);else a&&a.parentNode&&a.parentNode.removeChild(a)},insertBefore:function(a,b,c){a&&(b&&b.parentNode?b.parentNode.insertBefore(a,
b):c.appendChild(a))},locate:function(a,b){if(a.tagName)var c=a;else a=a||event,c=a.target||a.srcElement;for(;c;){if(c.getAttribute){var d=c.getAttribute(b);if(d)return d}c=c.parentNode}return null},offset:function(a){if(a.getBoundingClientRect){var b=a.getBoundingClientRect(),c=document.body,d=document.documentElement,e=window.pageYOffset||d.scrollTop||c.scrollTop,f=window.pageXOffset||d.scrollLeft||c.scrollLeft,g=d.clientTop||c.clientTop||0,h=d.clientLeft||c.clientLeft||0,i=b.top+e-g,j=b.left+f-
h;return{y:Math.round(i),x:Math.round(j)}}else{for(j=i=0;a;)i+=parseInt(a.offsetTop,10),j+=parseInt(a.offsetLeft,10),a=a.offsetParent;return{y:i,x:j}}},pos:function(a){a=a||event;if(a.pageX||a.pageY)return{x:a.pageX,y:a.pageY};var b=dhx.env.isIE&&document.compatMode!="BackCompat"?document.documentElement:document.body;return{x:a.clientX+b.scrollLeft-b.clientLeft,y:a.clientY+b.scrollTop-b.clientTop}},preventEvent:function(a){a&&a.preventDefault&&a.preventDefault();return dhx.html.stopEvent(a)},stopEvent:function(a){(a||
event).cancelBubble=!0;return!1},addCss:function(a,b){a.className+=" "+b},removeCss:function(a,b){a.className=a.className.replace(RegExp(" "+b,"g"),"")}};dhx.ready=function(a){this.ze?a.call():this.ob.push(a)};dhx.ob=[];
(function(){var a=document.getElementsByTagName("SCRIPT");if(a.length)a=(a[a.length-1].getAttribute("src")||"").split("/"),a.splice(a.length-1,1),dhx.codebase=a.slice(0,a.length).join("/")+"/";dhx.event(window,"load",function(){dhx.callEvent("onReady",[]);dhx.delay(function(){dhx.ze=!0;for(var a=0;a<dhx.ob.length;a++)dhx.ob[a].call();dhx.ob=[]})})})();dhx.ui={};dhx.ui.zIndex=function(){return dhx.ui.hc++};dhx.ui.hc=1;
dhx.ready(function(){dhx.event(document.body,"click",function(a){dhx.callEvent("onClick",[a||event])})});
(function(){var a={};dhx.Template=function(b){if(typeof b=="function")return b;if(a[b])return a[b];b=(b||"").toString();if(b.indexOf("->")!=-1)switch(b=b.split("->"),b[0]){case "html":b=dhx.html.getValue(b[1]);break;case "http":b=(new dhx.ajax).sync().get(b[1],{uid:dhx.uid()}).responseText}b=(b||"").toString();b=b.replace(/(\r\n|\n)/g,"\\n");b=b.replace(/(\")/g,'\\"');b=b.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,'"+(obj.$1?"$2":"$3")+"');b=b.replace(/\{common\.([^}\(]*)\}/g,"\"+(common.$1||'')+\"");
b=b.replace(/\{common\.([^\}\(]*)\(\)\}/g,'"+(common.$1?common.$1(obj,common):"")+"');b=b.replace(/\{obj\.([^}]*)\}/g,"\"+(obj.$1||'')+\"");b=b.replace(/#([$a-z0-9_\[\]]+)#/gi,"\"+(obj.$1||'')+\"");b=b.replace(/\{obj\}/g,'"+obj+"');b=b.replace(/\{-obj/g,"{obj");b=b.replace(/\{-common/g,"{common");b='return "'+b+'";';try{Function("obj","common",b)}catch(c){}return a[b]=Function("obj","common",b)};dhx.Template.empty=function(){return""};dhx.Template.bind=function(a){return dhx.bind(dhx.Template(a),
this)};dhx.Type=function(a,c){if(a.Ya){if(!a.Ga)a.Ga=[];a.Ga.push(c)}else{if(typeof a=="function")a=a.prototype;if(!a.types)a.types={"default":a.type},a.type.name="default";var d=c.name,e=a.type;d&&(e=a.types[d]=dhx.copy(a.type));for(var f in c)e[f]=f.indexOf("template")===0?dhx.Template(c[f]):c[f];return d}}})();
dhx.AtomRender={xa:function(a){return this.a.template(a,this)},render:function(){if(this.isVisible(this.a.id)){if(!this.callEvent||this.callEvent("onBeforeRender",[this.data])){if(this.data)this.d.innerHTML=this.xa(this.data);this.callEvent&&this.callEvent("onAfterRender",[])}return!0}return!1},template_setter:dhx.Template};
dhx.SingleRender=dhx.proto({xa:function(a){return this.type.templateStart(a,this.type)+this.type.template(a,this.type)+this.type.templateEnd(a,this.type)},customize:function(a){dhx.Type(this,a)}},dhx.AtomRender);
dhx.Destruction={$init:function(){dhx.destructors.push(this)},destructor:function(){this.destructor=function(){};if(this.c)for(var a=0;a<this.c.length;a++)this.c[a].destructor();delete dhx.ui.views[this.a.id];this.af=this.B=null;this.F&&document.body.appendChild(this.F);this.F=null;if(this.g)this.g.innerHTML="",this.g.B=null;this.g=this.d=null;this.a.container&&this.b.parentNode?this.b.parentNode.parentNode.removeChild(this.b.parentNode):this.b&&this.b.parentNode&&this.b.parentNode.removeChild(this.b);
this.data=null;this.o=this.ka={}}};dhx.destructors=[];dhx.event(window,"unload",function(){for(var a=0;a<dhx.destructors.length;a++)dhx.destructors[a].destructor();dhx.destructors=[];for(var b in dhx.o){var c=dhx.o[b];c[0].removeEventListener?c[0].removeEventListener(c[1],c[2],!1):c[0].detachEvent&&c[0].detachEvent("on"+c[1],c[2]);delete dhx.o[b]}});
dhx.Settings={$init:function(){this.a=this.config={}},define:function(a,b){return typeof a=="object"?this.Uc(a):this.xc(a,b)},xc:function(a,b){var c=this[a+"_setter"];return this.a[a]=c?c.call(this,b,a):b},Uc:function(a){if(a)for(var b in a)this.xc(b,a[b])},Rb:function(a,b){var c={};b&&(c=dhx.extend(c,b));typeof a=="object"&&!a.tagName&&dhx.extend(c,a,!0);this.Uc(c)},Ia:function(a,b){for(var c in b)switch(typeof a[c]){case "object":a[c]=this.Ia(a[c]||{},b[c]);break;case "undefined":a[c]=b[c]}return a}};
dhx.ajax=function(a,b,c){if(arguments.length!==0){var d=new dhx.ajax;if(c)d.master=c;d.get(a,null,b)}return!this.getXHR?new dhx.ajax:this};
dhx.ajax.prototype={getXHR:function(){return dhx.env.isIE?new ActiveXObject("Microsoft.xmlHTTP"):new XMLHttpRequest},send:function(a,b,c){var d=this.getXHR();typeof c=="function"&&(c=[c]);if(typeof b=="object"){var e=[],f;for(f in b){var g=b[f];if(g===null||g===dhx.undefined)g="";e.push(f+"="+encodeURIComponent(g))}b=e.join("&")}b&&!this.post&&(a=a+(a.indexOf("?")!=-1?"&":"?")+b,b=null);d.open(this.post?"POST":"GET",a,!this.Te);this.post&&d.setRequestHeader("Content-type","application/x-www-form-urlencoded");
var h=this;d.onreadystatechange=function(){if(!d.readyState||d.readyState==4){if(c&&h)for(var a=0;a<c.length;a++)c[a]&&c[a].call(h.master||h,d.responseText,d.responseXML,d);c=h=h.master=null}};d.send(b||null);return d},get:function(a,b,c){this.post=!1;return this.send(a,b,c)},post:function(a,b,c){this.post=!0;return this.send(a,b,c)},sync:function(){this.Te=!0;return this}};
dhx.AtomDataLoader={$init:function(a){this.data={};if(a)this.a.datatype=a.datatype||"json",this.$ready.push(this.fe)},fe:function(){this.Xc=!0;this.a.url&&this.url_setter(this.a.url);this.a.data&&this.data_setter(this.a.data)},url_setter:function(a){if(!this.Xc)return a;this.load(a,this.a.datatype);return a},data_setter:function(a){if(!this.Xc)return a;this.parse(a,this.a.datatype);return!0},load:function(a,b,c){this.callEvent("onXLS",[]);typeof b=="string"?(this.data.driver=dhx.DataDriver[b],b=c):
this.data.driver=dhx.DataDriver.json;dhx.ajax(a,[this.mb,b],this)},parse:function(a,b){this.callEvent("onXLS",[]);this.data.driver=dhx.DataDriver[b||"json"];this.mb(a,null)},mb:function(a,b){var c=this.data.driver,d=c.getRecords(c.toObject(a,b))[0];this.data=c?c.getDetails(d):a;this.callEvent("onXLE",[])},sc:function(a){if(!this.a.dataFeed||this.Gc||!a)return!0;var b=this.a.dataFeed,b=b+(b.indexOf("?")==-1?"?":"&")+"action=get&id="+encodeURIComponent(a.id||a);this.callEvent("onXLS",[]);dhx.ajax(b,
function(a){this.Gc=!0;this.setValues(dhx.DataDriver.json.toObject(a)[0]);this.Gc=!1;this.callEvent("onXLE",[])},this);return!1}};dhx.DataDriver={};dhx.DataDriver.json={toObject:function(a){a||(a="[]");if(typeof a=="string")eval("dhx.temp="+a),a=dhx.temp;if(a.data){var b=a.data;b.pos=a.pos;b.total_count=a.total_count;a=b}return a},getRecords:function(a){return a&&!dhx.isArray(a)?[a]:a},getDetails:function(a){return a},getInfo:function(a){return{da:a.total_count||0,ia:a.pos||0}}};
dhx.DataDriver.json_ext={toObject:function(a){a||(a="[]");if(typeof a=="string"){var b;eval("temp="+a);dhx.temp=[];for(var c=b.header,d=0;d<b.data.length;d++){for(var e={},f=0;f<c.length;f++)typeof b.data[d][f]!="undefined"&&(e[c[f]]=b.data[d][f]);dhx.temp.push(e)}return dhx.temp}return a},getRecords:function(a){return a&&!dhx.isArray(a)?[a]:a},getDetails:function(a){return a},getInfo:function(a){return{da:a.total_count||0,ia:a.pos||0}}};
dhx.DataDriver.html={toObject:function(a){if(typeof a=="string"){var b=null;a.indexOf("<")==-1&&(b=dhx.toNode(a));if(!b)b=document.createElement("DIV"),b.innerHTML=a;return b.getElementsByTagName(this.tag)}return a},getRecords:function(a){return a.tagName?a.childNodes:a},getDetails:function(a){return dhx.DataDriver.xml.tagToObject(a)},getInfo:function(){return{da:0,ia:0}},tag:"LI"};
dhx.DataDriver.jsarray={toObject:function(a){return typeof a=="string"?(eval("dhx.temp="+a),dhx.temp):a},getRecords:function(a){return a},getDetails:function(a){for(var b={},c=0;c<a.length;c++)b["data"+c]=a[c];return b},getInfo:function(){return{da:0,ia:0}}};
dhx.DataDriver.csv={toObject:function(a){return a},getRecords:function(a){return a.split(this.row)},getDetails:function(a){for(var a=this.stringToArray(a),b={},c=0;c<a.length;c++)b["data"+c]=a[c];return b},getInfo:function(){return{da:0,ia:0}},stringToArray:function(a){for(var a=a.split(this.cell),b=0;b<a.length;b++)a[b]=a[b].replace(/^[ \t\n\r]*(\"|)/g,"").replace(/(\"|)[ \t\n\r]*$/g,"");return a},row:"\n",cell:","};
dhx.DataDriver.xml={toObject:function(a,b){return b&&(b=this.checkResponse(a,b))?b:typeof a=="string"?this.fromString(a):a},getRecords:function(a){return this.xpath(a,this.records)},records:"/*/item",getDetails:function(a){return this.tagToObject(a,{})},getInfo:function(a){return{da:a.documentElement.getAttribute("total_count")||0,ia:a.documentElement.getAttribute("pos")||0}},xpath:function(a,b){if(window.XPathResult){var c=a;if(a.nodeName.indexOf("document")==-1)a=a.ownerDocument;for(var d=[],e=
a.evaluate(b,c,null,XPathResult.ANY_TYPE,null),f=e.iterateNext();f;)d.push(f),f=e.iterateNext();return d}else{var g=!0;try{typeof a.selectNodes=="undefined"&&(g=!1)}catch(h){}if(g)return a.selectNodes(b);else{var i=b.split("/").pop();return a.getElementsByTagName(i)}}},tagToObject:function(a,b){var b=b||{},c=!1,d=a.attributes;if(d&&d.length){for(var e=0;e<d.length;e++)b[d[e].name]=d[e].value;c=!0}for(var f=a.childNodes,g={},e=0;e<f.length;e++)if(f[e].nodeType==1){var h=f[e].tagName;typeof b[h]!="undefined"?
(dhx.isArray(b[h])||(b[h]=[b[h]]),b[h].push(this.tagToObject(f[e],{}))):b[f[e].tagName]=this.tagToObject(f[e],{});c=!0}if(!c)return this.nodeValue(a);b.value=this.nodeValue(a);return b},nodeValue:function(a){return a.firstChild?a.firstChild.data:""},fromString:function(a){if(window.DOMParser)return(new DOMParser).parseFromString(a,"text/xml");if(window.ActiveXObject){var b=new ActiveXObject("Microsoft.xmlDOM");b.loadXML(a);return b}},checkResponse:function(a,b){if(b&&b.firstChild&&b.firstChild.tagName!=
"parsererror")return b;var c=this.fromString(a.replace(/^[\s]+/,""));if(c)return c}};
dhx.DataLoader=dhx.proto({$init:function(a){a=a||"";name="DataStore";this.data=a.datastore||new dhx.DataStore;this.Ub=this.data.attachEvent("onStoreLoad",dhx.bind(this.Ed,this))},load:function(a,b){dhx.AtomDataLoader.load.apply(this,arguments);if(!this.data.feed)this.data.url=a,this.data.feed=function(b,d){if(this.ib)return this.ib=[b,d];else this.ib=!0;this.load(a+(a.indexOf("?")==-1?"?":"&")+"start="+b+"&count="+d,function(){var a=this.ib;this.ib=!1;typeof a=="object"?this.data.feed.apply(this,
a):this.showItem&&this.dataCount()>b+1&&this.showItem(this.idByIndex(b+1))})}},loadNext:function(a,b){this.data.feed&&this.data.feed.call(this,b||this.dataCount(),a)},mb:function(a,b){this.data.ue(this.data.driver.toObject(a,b));this.callEvent("onXLE",[]);if(this.Ub)this.data.detachEvent(this.Ub),this.Ub=null},scheme_setter:function(a){this.data.scheme(a)},dataFeed_setter:function(a){this.data.attachEvent("onBeforeFilter",dhx.bind(function(a,c){if(this.a.dataFeed){var d={};if(a||d){if(typeof a=="function"){if(!c)return;
a(c,d)}else d={text:c};this.clearAll();var e=this.a.dataFeed,f=[],g;for(g in d)f.push("dhx_filter["+g+"]="+encodeURIComponent(d[g]));this.load(e+(e.indexOf("?")<0?"?":"&")+f.join("&"),this.a.datatype);return!1}}},this));return a},Ed:function(){if(this.a.ready){var a=dhx.toFunctor(this.a.ready);a&&a.call&&a.apply(this,arguments)}}},dhx.AtomDataLoader).prototype;dhx.DataStore=function(){this.name="DataStore";dhx.extend(this,dhx.EventSystem);this.setDriver("xml");this.pull={};this.order=dhx.toArray()};
dhx.DataStore.prototype={setDriver:function(a){this.driver=dhx.DataDriver[a]},ue:function(a){this.callEvent("onParse",[this.driver,a]);this.p&&this.filter();var b=this.driver.getInfo(a),c=this.driver.getRecords(a),d=(b.ia||0)*1;if(d===0&&this.order[0])d=this.order.length;for(var e=0,f=0;f<c.length;f++){var g=this.driver.getDetails(c[f]),h=this.id(g);this.pull[h]||(this.order[e+d]=h,e++);this.pull[h]=g;this.extraParser&&this.extraParser(g);this.sb&&(this.tb?this.tb(g):this.ta&&this.ta(g))}if(!this.order[b.da-
1])this.order[b.da-1]=dhx.undefined;this.callEvent("onStoreLoad",[this.driver,a]);this.refresh()},id:function(a){return a.id||(a.id=dhx.uid())},changeId:function(a,b){this.pull[b]=this.pull[a];this.pull[b].id=b;this.order[this.order.find(a)]=b;this.p&&(this.p[this.p.find(a)]=b);this.callEvent("onIdChange",[a,b]);this.Zb&&this.Zb(a,b);delete this.pull[a]},item:function(a){return this.pull[a]},update:function(a,b){this.ta&&this.ta(b);if(this.callEvent("onBeforeUpdate",[a,b])===!1)return!1;this.pull[a]=
b;this.refresh(a)},refresh:function(a){this.hd||(a?this.callEvent("onStoreUpdated",[a,this.pull[a],"update"]):this.callEvent("onStoreUpdated",[null,null,null]))},silent:function(a,b){this.hd=!0;a.call(b||this);this.hd=!1},getRange:function(a,b){a=a?this.indexById(a):this.startOffset||0;b?b=this.indexById(b):(b=Math.min(this.endOffset||Infinity,this.dataCount()-1),b<0&&(b=0));if(a>b)var c=b,b=a,a=c;return this.getIndexRange(a,b)},getIndexRange:function(a,b){for(var b=Math.min(b||Infinity,this.dataCount()-
1),c=dhx.toArray(),d=a||0;d<=b;d++)c.push(this.item(this.order[d]));return c},dataCount:function(){return this.order.length},exists:function(a){return!!this.pull[a]},move:function(a,b){if(!(a<0||b<0)){var c=this.idByIndex(a),d=this.item(c);this.order.removeAt(a);this.order.insertAt(c,Math.min(this.order.length,b));this.callEvent("onStoreUpdated",[c,d,"move"])}},scheme:function(a){this.sb=a;this.tb=a.$init;this.ta=a.$update;this.ad=a.$serialize;delete a.$init;delete a.$update;delete a.$serialize},
sync:function(a,b,c){typeof b!="function"&&(c=b,b=null);if(dhx.debug_bind)this.debug_sync_master=a;if(a.name!="DataStore")a=a.data;var d=dhx.bind(function(){this.order=dhx.toArray([].concat(a.order));this.p=null;this.pull=a.pull;b&&this.silent(b);this.Tc&&this.Tc();c?c=!1:this.refresh()},this);a.attachEvent("onStoreUpdated",d);d()},add:function(a,b){if(this.sb){var a=a||{},c;for(c in this.sb)a[c]=a[c]||this.sb[c];this.tb?this.tb(a):this.ta&&this.ta(a)}var d=this.id(a),e=this.dataCount();if(dhx.isNotDefined(b)||
b<0)b=e;b>e&&(b=Math.min(this.order.length,b));if(this.callEvent("onBeforeAdd",[d,a,b])===!1)return!1;if(this.exists(d))return null;this.pull[d]=a;this.order.insertAt(d,b);if(this.p){var f=this.p.length;!b&&this.order.length&&(f=0);this.p.insertAt(d,f)}this.callEvent("onafterAdd",[d,b]);this.callEvent("onStoreUpdated",[d,a,"add"]);return d},remove:function(a){if(dhx.isArray(a))for(var b=0;b<a.length;b++)this.remove(a[b]);else{if(this.callEvent("onBeforeDelete",[a])===!1)return!1;if(!this.exists(a))return null;
var c=this.item(a);this.order.remove(a);this.p&&this.p.remove(a);delete this.pull[a];this.callEvent("onafterdelete",[a]);this.callEvent("onStoreUpdated",[a,c,"delete"])}},clearAll:function(){this.pull={};this.order=dhx.toArray();this.p=null;this.callEvent("onClearAll",[]);this.refresh()},idByIndex:function(a){return this.order[a]},indexById:function(a){var b=this.order.find(a);return b},next:function(a,b){return this.order[this.indexById(a)+(b||1)]},first:function(){return this.order[0]},last:function(){return this.order[this.order.length-
1]},previous:function(a,b){return this.order[this.indexById(a)-(b||1)]},sort:function(a,b,c){var d=a;typeof a=="function"?d={as:a,dir:b}:typeof a=="string"&&(d={by:a,dir:b,as:c});var e=[d.by,d.dir,d.as];if(this.callEvent("onbeforesort",e)){if(this.order.length){var f=dhx.sort.create(d),g=this.getRange(this.first(),this.last());g.sort(f);this.order=g.map(function(a){return this.id(a)},this)}this.refresh();this.callEvent("onaftersort",e)}},filter:function(a,b,c){if(this.callEvent("onBeforeFilter",[a,
b])){if(this.p&&!c)this.order=this.p,delete this.p;if(this.order.length){if(a){var d=a,b=b||"";typeof a=="string"&&(a=dhx.Template(a),b=b.toString().toLowerCase(),d=function(b,c){return a(b).toLowerCase().indexOf(c)!=-1});for(var e=dhx.toArray(),f=0;f<this.order.length;f++){var g=this.order[f];d(this.item(g),b)&&e.push(g)}if(!c)this.p=this.order;this.order=e}this.refresh();this.callEvent("onAfterFilter",[])}}},each:function(a,b){for(var c=0;c<this.order.length;c++)a.call(b||this,this.item(this.order[c]))},
provideApi:function(a,b){this.debug_bind_master=a;b&&this.mapEvent({onbeforesort:a,onaftersort:a,onbeforeadd:a,onafteradd:a,onbeforedelete:a,onafterdelete:a,onbeforeupdate:a});for(var c="sort,add,remove,exists,idByIndex,indexById,item,update,refresh,dataCount,filter,next,previous,clearAll,first,last,serialize,sync".split(","),d=0;d<c.length;d++)a[c[d]]=dhx.methodPush(this,c[d])},serialize:function(){for(var a=this.order,b=[],c=0;c<a.length;c++){var d=this.pull[a[c]];if(this.ad&&(d=this.ad(d),d===
!1))continue;b.push(d)}return b}};
dhx.sort={create:function(a){return dhx.sort.dir(a.dir,dhx.sort.by(a.by,a.as))},as:{"int":function(a,b){a*=1;b*=1;return a>b?1:a<b?-1:0},string_strict:function(a,b){a=a.toString();b=b.toString();return a>b?1:a<b?-1:0},string:function(a,b){a=a.toString().toLowerCase();b=b.toString().toLowerCase();return a>b?1:a<b?-1:0}},by:function(a,b){if(!a)return b;typeof b!="function"&&(b=dhx.sort.as[b||"string"]);a=dhx.Template(a);return function(c,d){return b(a(c),a(d))}},dir:function(a,b){return a=="asc"?b:
function(a,d){return b(a,d)*-1}}};
dhx.BaseBind={bind:function(a,b,c){typeof a=="string"&&(a=dhx.ui.get(a));a.Lb&&a.Lb();this.Lb&&this.Lb();a.getBindData||dhx.extend(a,dhx.BindSource);if(!this.zd){var d=this.render;if(this.filter){var e=this.a.id;this.data.Tc=function(){a.Va[e]=!1}}this.render=function(){if(!this.Hc)return this.Hc=!0,this.callEvent("onBindRequest"),this.Hc=!1,d.call(this)};if(this.getValue||this.getValues)this.save=function(){if(!this.validate||this.validate())a.setBindData(this.getValue?this.getValue:this.getValues(),
this.a.id)};this.zd=!0}a.addBind(this.a.id,b,c);this.attachEvent(this.touchable?"onAfterRender":"onBindRequest",function(){a.getBindData(this.a.id)});this.isVisible(this.a.id)&&this.refresh()}};
dhx.BindSource={$init:function(){this.Ua={};this.Va={};this.Kb={};this.Ad(this)},setBindData:function(a,b){b&&(this.Kb[b]=!0);if(this.setValue)this.setValue(a);else if(this.setValues)this.setValues(a);else{var c=this.getCursor();c&&(a=dhx.extend(this.item(c),a,!0),this.update(c,a))}this.callEvent("onBindUpdate",[a,b]);this.save&&this.save();b&&(this.Kb[b]=!1)},getBindData:function(a,b){if(!this.Va[a]){var c=dhx.ui.get(a);c.isVisible(c.a.id)&&(this.Va[a]=!0,this.Ab(c,this.Ua[a][0],this.Ua[a][1]),b&&
c.filter&&c.refresh())}},addBind:function(a,b,c){this.Ua[a]=[b,c]},Ad:function(a){a.filter?dhx.extend(this,dhx.CollectionBind):a.setValue?dhx.extend(this,dhx.ValueBind):dhx.extend(this,dhx.RecordBind)},vb:function(){for(var a in this.Ua)this.Kb[a]||(this.Va[a]=!1,this.getBindData(a,!0))},nc:function(a,b,c){a.setValue?a.setValue(c?c[b]:c):a.filter?a.data.silent(function(){this.filter(b,c)}):!c&&a.clear?a.clear():a.sc(c)&&a.setValues(dhx.copy(c))}};
dhx.DataValue=dhx.proto({name:"DataValue",isVisible:function(){return!0},$init:function(a){var b=(this.data=a)&&a.id?a.id:dhx.uid();this.a={id:b};dhx.ui.views[b]=this},setValue:function(a){this.data=a;this.callEvent("onChange",[a])},getValue:function(){return this.data},refresh:function(){this.callEvent("onBindRequest")}},dhx.EventSystem,dhx.BaseBind);
dhx.DataRecord=dhx.proto({name:"DataRecord",isVisible:function(){return!0},$init:function(a){this.data=a||{};var b=a&&a.id?a.id:dhx.uid();this.a={id:b};dhx.ui.views[b]=this},getValues:function(){return this.data},setValues:function(a){this.data=a;this.callEvent("onChange",[a])},refresh:function(){this.callEvent("onBindRequest")}},dhx.EventSystem,dhx.BaseBind);
dhx.DataCollection=dhx.proto({name:"DataCollection",isVisible:function(){return!this.data.order.length&&!this.data.p&&!this.a.dataFeed?!1:!0},$init:function(a){this.data.provideApi(this,!0);var b=a&&a.id?a.id:dhx.uid();this.a.id=b;dhx.ui.views[b]=this;this.data.attachEvent("onStoreLoad",dhx.bind(function(){this.callEvent("onBindRequest",[])},this))},refresh:function(){this.callEvent("onBindRequest",[])}},dhx.EventSystem,dhx.DataLoader,dhx.BaseBind,dhx.Settings);
dhx.ValueBind={$init:function(){this.attachEvent("onChange",this.vb)},Ab:function(a,b,c){var d=this.getValue()||"";c&&(d=c(d));if(a.setValue)a.setValue(d);else if(a.filter)a.data.silent(function(){this.filter(b,d)});else{var e={};e[b]=d;a.sc(d)&&a.setValues(e)}}};dhx.RecordBind={$init:function(){this.attachEvent("onChange",this.vb)},Ab:function(a,b){var c=this.getValues()||null;this.nc(a,b,c)}};
dhx.CollectionBind={$init:function(){this.X=null;this.attachEvent("onSelectChange",function(){this.setCursor(this.getSelected())});this.attachEvent("onAfterCursorChange",this.vb);this.data.attachEvent("onStoreUpdated",dhx.bind(function(a){a&&a==this.getCursor()&&this.vb()},this));this.data.attachEvent("onClearAll",dhx.bind(function(){this.X=null},this));this.data.attachEvent("onIdChange",dhx.bind(function(a,b){if(this.X==a)this.X=b},this))},setCursor:function(a){if(!(a==this.X||a!==null&&!this.item(a)))this.callEvent("onBeforeCursorChange",
[this.X]),this.X=a,this.callEvent("onAfterCursorChange",[a])},getCursor:function(){return this.X},Ab:function(a,b){var c=this.item(this.getCursor())||null;this.nc(a,b,c)}};
dhx.DragControl={N:dhx.toArray(["dummy"]),addDrop:function(a,b,c){a=dhx.toNode(a);a.dhx_drop=this.zc(b);if(c)a.dhx_master=!0},zc:function(a){var a=a||dhx.DragControl,b=this.N.find(a);if(b<0)b=this.N.length,this.N.push(a);return b},addDrag:function(a,b){a=dhx.toNode(a);a.dhx_drag=this.zc(b);dhx.event(a,"mousedown",this.ve,a)},ve:function(a){dhx.DragControl.O&&(dhx.DragControl.Sb(),dhx.DragControl.destroyDrag());dhx.DragControl.O=this;dhx.DragControl.jd={x:a.pageX,y:a.pageY};dhx.DragControl.$c=a;dhx.DragControl.Ea=
dhx.event(document.body,"mousemove",dhx.DragControl.Pe);dhx.DragControl.Fa=dhx.event(document.body,"mouseup",dhx.DragControl.Sb);a.cancelBubble=!0;return!1},Sb:function(){dhx.DragControl.Ea=dhx.eventRemove(dhx.DragControl.Ea);dhx.DragControl.Fa=dhx.eventRemove(dhx.DragControl.Fa)},Pe:function(a){var b={x:a.pageX,y:a.pageY};if(!(Math.abs(b.x-dhx.DragControl.jd.x)<5&&Math.abs(b.y-dhx.DragControl.jd.y)<5)&&(dhx.DragControl.Sb(),dhx.DragControl.createDrag(dhx.DragControl.$c)))dhx.DragControl.sendSignal("start"),
dhx.DragControl.Ea=dhx.event(document.body,"mousemove",dhx.DragControl.Oc),dhx.DragControl.Fa=dhx.event(document.body,"mouseup",dhx.DragControl.Qe),dhx.DragControl.Oc(a)},Qe:function(a){dhx.DragControl.Ea=dhx.eventRemove(dhx.DragControl.Ea);dhx.DragControl.Fa=dhx.eventRemove(dhx.DragControl.Fa);dhx.DragControl.$c=null;dhx.DragControl.C&&(dhx.DragControl.onDrop(dhx.DragControl.O,dhx.DragControl.C,this.gb,a),dhx.DragControl.onDragOut(dhx.DragControl.O,dhx.DragControl.C,null,a));dhx.DragControl.destroyDrag();
dhx.DragControl.sendSignal("stop")},Oc:function(a){var b=dhx.html.pos(a);dhx.DragControl.F.style.top=b.y+dhx.DragControl.top+"px";dhx.DragControl.F.style.left=b.x+dhx.DragControl.left+"px";dhx.DragControl.gd?dhx.DragControl.gd=!1:dhx.DragControl.Fd(a.srcElement||a.target,a);a.cancelBubble=!0;return!1},Fd:function(a,b){for(;a&&a.tagName!="BODY";){if(a.dhx_drop){if(this.C&&(this.C!=a||a.dhx_master))this.onDragOut(this.O,this.C,a,b);if(!this.C||this.C!=a||a.dhx_master)if(this.C=null,this.gb=this.onDragIn(dhx.DragControl.O,
a,b))this.C=a;return}a=a.parentNode}if(this.C)this.C=this.gb=this.onDragOut(this.O,this.C,null,b)},sendSignal:function(a){dhx.DragControl.active=a=="start"},getMaster:function(a){return this.N[a.dhx_drag||a.dhx_drop]},getContext:function(){return this.Za},getNode:function(){return this.F},createDrag:function(a){var b=dhx.DragControl.O;dhx.DragControl.Za={};var c=this.N[b.dhx_drag],d;if(c.onDragCreate){d=c.onDragCreate(b,a);if(!d)return!1;d.style.position="absolute";d.style.zIndex=dhx.ui.zIndex()}else{var e=
dhx.DragControl.onDrag(b,a);if(!e)return!1;d=document.createElement("DIV");d.innerHTML=e;d.className="dhx_drag_zone";document.body.appendChild(d)}d.onmousemove=dhx.DragControl.Ne;if(!dhx.DragControl.Za.from)dhx.DragControl.Za={source:b,from:b};dhx.DragControl.F=d;return!0},Ne:function(){dhx.DragControl.gd=!0},destroyDrag:function(){var a=dhx.DragControl.O,b=this.N[a.dhx_drag];if(b&&b.onDragDestroy)b.onDragDestroy(a,dhx.DragControl.F);else dhx.html.remove(dhx.DragControl.F);dhx.DragControl.gb=dhx.DragControl.O=
dhx.DragControl.C=dhx.DragControl.F=null},top:5,left:5,onDragIn:function(a,b,c){var d=this.N[b.dhx_drop];if(d.onDragIn&&d!=this)return d.onDragIn(a,b,c);b.className+=" dhx_drop_zone";return b},onDragOut:function(a,b,c,d){var e=this.N[b.dhx_drop];if(e.onDragOut&&e!=this)return e.onDragOut(a,b,c,d);b.className=b.className.replace("dhx_drop_zone","");return null},onDrop:function(a,b,c,d){var e=this.N[b.dhx_drop];dhx.DragControl.Za.from=dhx.DragControl.getMaster(a);if(e.onDrop&&e!=this)return e.onDrop(a,
b,c,d);b.appendChild(a)},onDrag:function(a,b){var c=this.N[a.dhx_drag];return c.onDrag&&c!=this?c.onDrag(a,b):"<div style='"+a.style.cssText+"'>"+a.innerHTML+"</div>"}};
dhx.DataMove={$init:function(){},copy:function(a,b,c,d){var e=this.item(a);if(e)return c&&(e=c.externalData(e)),c=c||this,c.add(c.externalData(e,d),b)},move:function(a,b,c,d){if(dhx.isArray(a))for(var e=0;e<a.length;e++){var f=(c||this).indexById(this.move(a[e],b,c,d?d[e]:null));a[e+1]&&(b=f+(this.indexById(a[e+1])<f?0:1))}else{var g=a;if(!(b<0)){var h=this.item(a);if(h){if(!c||c==this)this.data.move(this.indexById(a),b);else{if(!d||c.item(d))d=dhx.uid();g=c.add(c.externalData(h,d),b);this.remove(a)}return g}}}},
moveUp:function(a,b){return this.move(a,this.indexById(a)-(b||1))},moveDown:function(a,b){return this.moveUp(a,(b||1)*-1)},moveTop:function(a){return this.move(a,0)},moveBottom:function(a){return this.move(a,this.data.dataCount()-1)},externalData:function(a,b){var c=dhx.extend({},a);c.id=b||dhx.uid();c.$selected=c.$template=null;return c}};
dhx.Movable={move_setter:function(a){if(a)this.kb=dhx.copy(this.kb),this.kb.master=this,dhx.DragControl.addDrag(this.eb,this.kb)},kb:{onDragCreate:function(a,b){var c=dhx.html.offset(a),d=dhx.html.pos(b);dhx.DragControl.top=c.y-d.y;dhx.DragControl.left=c.x-d.x;return dhx.toNode(this.master.b)},onDragDestroy:function(){dhx.DragControl.top=dhx.DragControl.left=5}}};
dhx.Scrollable={$init:function(a){if(a&&!a.scroll&&this.se)return this.d=this.d||this.g;(this.d||this.g).appendChild(dhx.html.create("DIV",{"class":"dhx_scroll_cont"},""));this.d=(this.d||this.g).firstChild},scrollSize:dhx.Touch?0:18,scroll_setter:function(a){if(!a)return!1;dhx.Touch?(a=a=="x"?"x":a=="xy"?"xy":"y",this.d.setAttribute("touch_scroll",a),this.attachEvent&&this.attachEvent("onAfterRender",dhx.bind(this.Ae,this)),this.a.touch_scroll=!0):this.d.parentNode.style.overflowY=a?"scroll":"";
return a},scrollState:function(){if(dhx.Touch){var a=dhx.Touch.Hb(this.d);return{x:-a.e,y:-a.f}}else return{x:this.d.parentNode.scrollLeft,y:this.d.parentNode.scrollTop}},scrollTo:function(a,b){dhx.Touch?(b=Math.max(0,Math.min(b,this.d.offsetHeight-this.m)),a=Math.max(0,Math.min(a,this.d.offsetWidth-this.j)),dhx.Touch.wa(this.d,-a,-b,this.a.scrollSpeed||"100ms")):(this.d.parentNode.scrollLeft=a,this.d.parentNode.scrollTop=b)},Ae:function(){if(this.a.scroll.indexOf("x")!=-1&&!this.Yd)this.d.style.width=
this.j+"px",this.d.style.width=this.d.scrollWidth+"px";dhx.Touch&&this.a.touch_scroll&&(dhx.Touch.Ca(),dhx.Touch.ua(),dhx.Touch.wa(this.d,0,0,0))}};
dhx.ActiveContent={$init:function(a){if(a.activeContent){this.$ready.push(this.be);this.Qa={};this.Ra={};this.za={};this.yb={};for(var b in a.activeContent)if(this[b]=this.yd(b),a.activeContent[b].earlyInit){var c=dhx.D;dhx.D=null;this[b].call(this,{},this,a.activeContent);dhx.D=c}}},be:function(){if(this.filter){for(var a in this.a.activeContent)this.type[a]=this[a],this[a]=this.ge(a);this.type.masterUI=this}},ge:function(a){return function(b){for(var c=this.yb[a],d=c.a.id,e=this.pa(b).getElementsByTagName("DIV"),
f=0;f<e.length;f++)if(e[f].getAttribute("view_id")==d){c.b=c.d=e[f];break}return c}},Vd:function(a,b,c){return function(d){if(d)for(var e=d.target||d.srcElement;e;){if(e.getAttribute&&e.getAttribute("view_id")){a.d=a.b=e;if(c.locate){var f=c.locate(e.parentNode),g=c.za[b][f];a.a.value=g}return e}e=e.parentNode}return a.b}},Ke:function(a,b){return function(c){var d=b.data;if(b.filter){var e=b.locate(this.b.parentNode),d=b.item(e);b.Ra[a][e]=this.b.outerHTML||(new XMLSerializer).serializeToString(this.b);
b.za[a][e]=c}d[a]=c}},yd:function(a){return function(b,c,d){var e=c.Qa?c:c.masterUI;if(!e.Qa[a]){var f=document.createElement("DIV"),d=d||e.a.activeContent,g=dhx.ui(d[a],f);g.getNode=e.Vd(g,a,e);g.attachEvent("onChange",e.Ke(a,e));e.yb[a]=g;e.Qa[a]=f.innerHTML;e.Ra[a]={};e.za[a]={}}e.filter&&b[a]!=e.za[a]&&!dhx.isNotDefined(b[a])&&(g=e.yb[a],g.blockEvent(),g.setValue(b[a]),g.unblockEvent(),e.za[a][b.id]=b[a],e.Ra[a][b.id]=g.b.outerHTML||(new XMLSerializer).serializeToString(g.b));return e.Ra[a][b.id]||
e.Qa[a]}}};dhx.IdSpace={$init:function(){var a=dhx.ja;this.elements={};dhx.ja=this;this.od={};this.getTopParent=dhx.bind(function(){return this},this);this.$ready.push(function(){dhx.ja=a;for(var b in this.elements)this.elements[b].mapEvent&&!this.elements[b].touchable&&this.elements[b].mapEvent({onbeforetabclick:this,onaftertabclick:this,onitemclick:this}),this.elements[b].getTopParent=this.getTopParent})},$$:function(a){return this.elements[a]},innerId:function(a){return this.od[a]}};
(function(){var a=[],b=dhx.ui=function(c,d,e){dhx.qd=!0;var f=c,f=dhx.toNode(c.container||d||document.body),g=c.a||f.c&&!e?c:b.Oa(c);f.appendChild?(f.appendChild(g.b),!g.setPosition&&f==document.body&&a.push(g),c.skipResize||g.resize()):f.ac&&(g.getParent&&g.getParent()&&g.getParent().Zc(g),f.ac(g,e));dhx.qd=!1;return g};dhx.ui.rd=function(a){return a+(this.Pc[a]=(this.Pc[a]||0)+1)};dhx.ui.Pc={};dhx.ui.resize=function(){if(!dhx.ui.yc)for(var b=0;b<a.length;b++)a[b].resize()};dhx.event(window,"resize",
dhx.ui.resize);b.Eb={};b.delay=function(a){dhx.ui.Eb[a.id]=a};dhx.ui.zIndex=function(){return dhx.ui.hc++};dhx.ui.hc=1;b.Oa=function(a){if(a.view){var d=a.view;delete a.view;return new b[d](a)}else return a.rows||a.cols?new b.layout(a):a.cells?new b.multiview(a):new b.template(a)};b.views={};b.get=function(a){if(!a)return null;if(b.views[a])return b.views[a];if(b.Eb[a])return dhx.ui(b.Eb[a]);var d=a;if(typeof a=="object"){if(a.a)return a;d=a.target||a.srcElement||a}return b.views[dhx.html.locate({target:dhx.toNode(d)},
"view_id")]};if(dhx.isNotDefined(window.$$))$$=b.get;dhx.protoUI({name:"baseview",$init:function(a){if(!a.id)a.id=dhx.ui.rd(this.name);this.D=dhx.D;dhx.D=null;this.$view=this.g=this.b=dhx.html.create("DIV",{"class":"dhx_view"})},defaults:{width:-1,height:-1,gravity:1},getNode:function(){return this.b},getParent:function(){return this.D||null},isVisible:function(a){if(this.a.hidden&&a){if(!this.la)this.la=[],this.Jb={};this.Jb[a]||(this.Jb[a]=!0,this.la.push(a));return!1}var b=this.getParent();return b?
b.isVisible(a,this.a.id):!0},container_setter:function(){return!0},css_setter:function(a){this.b.className+=" "+a;return a},id_setter:function(a){if(dhx.ja&&dhx.ja!=this){var b=a;dhx.ja.elements[a]=this;a=dhx.ui.rd(this.name);dhx.ja.od[a]=b}dhx.ui.views[a]=this;this.b.setAttribute("view_id",a);return a},$setSize:function(a,b){if(this.$&&this.$[0]==a&&this.$[1]==b)return!1;this.$=[a,b];this.j=a;this.j=a-(this.a.scroll?dhx.Scrollable.scrollSize:0);this.m=b;this.$width=this.j;this.$height=this.m;this.b.style.width=
a+"px";this.b.style.height=b+"px";return!0},$getSize:function(){var a=this.a.width,b=this.a.height,e,f;e=f=this.a.gravity;a==-1?a=0:(e=0,a+=this.a.scroll?dhx.Scrollable.scrollSize:0);b==-1?b=0:f=0;return[e,a,f,b]},show:function(a){if(this.getParent()){var b=this.getParent();!a&&this.a.animate&&b.a.animate&&(a=dhx.extend(b.a.animate?dhx.extend({},b.a.animate):{},this.a.animate,!0));var e=arguments.length<2;if(e?b.Ma:b.Ha)(e?b.Ma:b.Ha).call(b,this,a)}},hidden_setter:function(a){a&&this.hide();return this.a.hidden},
hide:function(){this.show(null,!0)},resize:function(){var a=this.b;if(!this.D)a=a.parentNode;if(!this.b.parentNode)return!1;var b=this.b.parentNode.offsetWidth,e=this.b.parentNode.offsetHeight,f=this.$getSize(),b=f[0]?Math.max(b,f[1]):Math.max(f[1],b),e=f[2]?Math.max(e,f[3]):Math.max(f[3],e);this.$setSize(b,e)}},dhx.Settings,dhx.Destruction,dhx.BaseBind);dhx.protoUI({name:"view",$init:function(){this.g.style.border="1px solid #AEAEAE"},$getSize:function(){var a=this.a.k,b=dhx.ui.baseview.prototype.$getSize.call(this);
if(!a)return b;var e=(a.left?0:1)+(a.right?0:1),f=(a.top?0:1)+(a.bottom?0:1);b[1]&&e&&(b[1]+=e);b[3]&&f&&(b[3]+=f);return b},$setSize:function(a,b){var e=this.a.k;e?(a-=(e.left?0:1)+(e.right?0:1),b-=(e.top?0:1)+(e.bottom?0:1)):this.g.style.border="0px solid #AEAEAE";return dhx.ui.baseview.prototype.$setSize.call(this,a,b)}},dhx.ui.baseview)})();dhx.ui.view.call(dhx);
dhx.protoUI({name:"baselayout",$init:function(){this.$ready.push(this.T);this.d=this.g},rows_setter:function(a){this.r=1;this.wc="";this.Q=a},cols_setter:function(a){this.r=0;this.wc="left";this.Q=a},Zc:function(a){dhx.PowerArray.removeAt.call(this.c,dhx.PowerArray.find.call(this.c,a));this.resizeChildren(!0)},ac:function(a,b){if(dhx.isNotDefined(b)){for(var c=0;c<this.c.length;c++)this.c[c].destructor();this.Q=a;this.T()}else{if(typeof b=="number"){if(b<0||b>this.c.length)b=this.c.length;var d=(this.c[b]||
{}).b;dhx.PowerArray.insertAt.call(this.c,a,b);dhx.html.insertBefore(a.b,d,this.d)}else{var e=dhx.ui.get(b),b=dhx.PowerArray.find.call(this.c,e);e.b.parentNode.insertBefore(a.b,e.b);e.destructor();this.c[b]=a}a.b.style.cssFloat=a.b.style.styleFloat=this.wc;this.c[b].D=this}this.resizeChildren()},reconstruct:function(){for(var a=0;a<this.c.length;a++)dhx.html.remove(this.c[a].b);this.T();this.$setSize(this.$[0],this.$[1])},Ha:function(a,b,c){if(!a.a.hidden)a.a.hidden=!0,dhx.html.remove(a.b),this.fb++,
!c&&!dhx.qd&&this.resizeChildren(!0)},resizeChildren:function(){if(this.hb){var a=this.$getSize(),b=this.hb[0],c=this.hb[1];this.va(b,c)}},index:function(a){if(a.a)a=a.a.id;for(var b=0;b<this.c.length;b++)if(this.c[b].a.id==a)return b;return-1},Ma:function(a,b,c){if(a.a.hidden)a.a.hidden=!1,dhx.html.insertBefore(a.b,(this.c[this.index(a)+1]||{}).b,this.d||this.b),this.fb--,c||this.resizeChildren(!0)},showBatch:function(a){if(this.a.visibleBatch!=a){this.a.visibleBatch=a;for(var b=[],c=0;c<this.c.length;c++)this.c[c].a.batch||
b.push(this.c[c]),this.c[c].a.batch==a?b.push(this.c[c]):this.Ha(this.c[c],null,!0);for(c=0;c<b.length;c++)this.Ma(b[c],null,!0);this.resizeChildren()}},T:function(a){a=this.Q||a;this.Q=null;this.c=[];this.b.style.verticalAlign="top";for(var b=0;b<a.length;b++){dhx.D=this;this.c[b]=dhx.ui.Oa(a[b],this);if(!this.r)this.c[b].b.style.cssFloat=this.c[b].b.style.styleFloat="left";if(this.a.visibleBatch&&this.a.visibleBatch!=this.c[b].a.batch&&this.c[b].a.batch)this.c[b].a.hidden=!0;this.c[b].a.hidden||
(this.d||this.g).appendChild(this.c[b].b)}},$getSize:function(){var a=0,b=0,c=0,d=0;this.U=[];for(var e=0;e<this.c.length;e++)if(!this.c[e].a.hidden){var f=this.U[e]=this.c[e].$getSize();this.r?(a=Math.max(a,f[1]),c=Math.max(c,f[0]),b+=f[3],d+=f[2]):(b=Math.max(b,f[3]),d=Math.max(d,f[2]),a+=f[1],c+=f[0])}this.jb=[c,a,d,b];if(this.a.height>-1)b=this.a.height,d=0;if(this.a.width>-1)a=this.a.width,c=0;this.r?(a&&(c=0),d&&(b=0)):(b&&(d=0),c&&(a=0));return[c,a,d,b]},$setSize:function(a,b){this.hb=[a,b];
dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(a,b)},va:function(a,b){for(var c=a-this.jb[1],d=b-this.jb[3],e=this.jb[0],f=this.jb[2],g=this.c.length-1,h=0;h<this.c.length;h++)if(!this.c[h].a.hidden){if(this.r){var i=a,j;this.U[h][2]?(j=Math.round(this.U[h][2]*d/f),d-=j,f-=this.U[h][2]):(j=this.U[h][3],h==g&&d>0&&(j+=d))}else j=b,this.U[h][0]?(i=Math.round(this.U[h][0]*c/e),c-=i,e-=this.U[h][0]):(i=this.U[h][1],h==g&&c>0&&(i+=c));this.c[h].$setSize(i,j)}},ef:function(a,b){var c=this.index(a);
return c==-1?null:this.c[c+b]},first:function(){return this.c[0]}},dhx.ui.baseview);
dhx.protoUI({name:"layout",$init:function(){this.fb=0},T:function(){this.b.className+=" dhx_layout_"+(this.a.type||"");if(this.a.margin)this.S=this.a.margin;if(this.a.padding)this.u=this.a.padding;var a=this.Q;if(!this.a.k)this.a.k={top:!0,left:!0,right:!0,bottom:!0};this.mc(a);dhx.ui.baselayout.prototype.T.call(this,a);this.kc(a)},$getSize:function(){var a=dhx.ui.baselayout.prototype.$getSize.call(this),b=this.S*(this.c.length-this.fb-1);this.r?a[3]&&(a[3]+=b):a[1]&&(a[1]+=b);if(this.u&&(a[1]&&(a[1]+=
this.u*2),a[3]&&(a[3]+=this.u*2),this.S>-1)){var c=this.a.k;if(c){var d=(c.left?0:1)+(c.right?0:1),e=(c.top?0:1)+(c.bottom?0:1);a[1]&&d&&(a[1]+=d);a[3]&&e&&(a[3]+=e)}}return a},$setSize:function(a,b){this.hb=[a,b];this.u&&this.S>0?dhx.ui.view.prototype.$setSize.call(this,a,b):dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.va(this.j,this.m)},va:function(a,b){var c=this.S*(this.c.length-this.fb-1);this.r?(b-=c+this.u*2,a-=this.u*2):(a-=c+this.u*2,b-=this.u*2);return dhx.ui.baselayout.prototype.va.call(this,
a,b)},resizeChildren:function(a){if(a&&this.type!="clean"){for(var b=[],c=0;c<this.c.length;c++){var d=this.c[c];b[c]=d.a;d.b.style.borderTopWidth=d.b.style.borderBottomWidth=d.b.style.borderLeftWidth=d.b.style.borderRightWidth="1px"}this.mc(b);this.kc(this.c)}dhx.ui.baselayout.prototype.resizeChildren.call(this)},mc:function(a){if(this.u&&this.S)for(var b=0;b<a.length;b++)a[b].k={top:!1,left:!1,right:!1,bottom:!1};else{for(b=0;b<a.length;b++)a[b].k=dhx.copy(this.a.k);var c=!1;this.a.type=="clean"&&
(c=!0);if(this.r){for(b=1;b<a.length-1;b++)a[b].k.top=a[b].k.bottom=c;if(a.length>1){if(this.a.type!="head")a[0].k.bottom=c;a[a.length-1].k.top=c}}else{for(b=1;b<a.length-1;b++)a[b].k.left=a[b].k.right=c;if(a.length>1){if(this.a.type!="head")a[0].k.right=c;a[a.length-1].k.left=c}}}},kc:function(a){for(var b=1,c=0;c<a.length;c++){var d=this.c[c];if(d.a.hidden&&this.c[c+1])this.c[c+1].a.k=d.a.k,c<b&&b++;var e=d.a.k;if(e.top)d.b.style.borderTopWidth="0px";if(e.left)d.b.style.borderLeftWidth="0px";if(e.right)d.b.style.borderRightWidth=
"0px";if(e.bottom)d.b.style.borderBottomWidth="0px"}if(this.u){for(var f=this.r?"marginLeft":"marginTop",g=this.r?"marginTop":"marginLeft",c=0;c<a.length;c++)this.c[c].b.style[f]=this.u+"px";this.c[0].b.style[g]=this.u+"px"}for(var f=this.r?"marginTop":"marginLeft",h=0;h<b;h++)this.c[h].b.style[f]="0px";for(;h<a.length;h++)this.c[h].b.style[f]=this.S+"px"},type_setter:function(a){this.S=this.je[a];if((this.u=this.te[a])&&this.S>0)this.g.style.border="1px solid #AEAEAE";return a},je:{space:10,wide:4,
clean:0,head:4,line:-1},te:{space:10,wide:0,clean:0,head:0,line:0},S:-1,u:0},dhx.ui.baselayout);dhx.ui.layout.call(dhx);
dhx.protoUI({name:"template",$init:function(){this.attachEvent("onXLE",this.render)},setValues:function(a){this.data=a;this.render()},defaults:{template:dhx.Template.empty,loading:!0},Wc:function(){this.Pb||this.render()},src_setter:function(a){this.Pb=!0;this.callEvent("onXLS",[]);dhx.ajax(a,dhx.bind(function(a){this.a.template=dhx.Template(a);this.Pb=!1;this.Wc();this.callEvent("onXLE",[])},this));return a},content_setter:function(a){if(a)this.Pb=!0,this.d.appendChild(dhx.toNode(a))},refresh:function(){this.render()},
waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.Wc()},se:!0},dhx.Scrollable,dhx.AtomDataLoader,dhx.AtomRender,dhx.EventSystem,dhx.ui.view);
dhx.protoUI({name:"iframe",defaults:{loading:!0},$init:function(){this.d=this.g;this.g.innerHTML="<iframe style='width:100%; height:100%' frameborder='0' src='about:blank'></iframe>"},load:function(a){this.src_setter(a)},src_setter:function(a){this.g.childNodes[0].src=a;this.callEvent("onXLS",[]);dhx.delay(this.Je,this);return a},Je:function(){try{dhx.event(this.getWindow(),"load",dhx.bind(function(){this.callEvent("onXLS",[])},this))}catch(a){this.callEvent("onXLE",[])}},getWindow:function(){return this.g.childNodes[0].contentWindow},
waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a}},dhx.ui.view,dhx.EventSystem);
dhx.ui.overlay={$init:function(){if(dhx.isNotDefined(this.ba)&&this.attachEvent)this.attachEvent("onXLS",this.showOverlay),this.attachEvent("onXLE",this.hideOverlay),this.ba=null},showOverlay:function(){if(!this.ba)this.ba=dhx.html.create("DIV",{"class":"dhx_loading_overlay"},""),dhx.html.insertBefore(this.ba,this.b.firstChild,this.b)},hideOverlay:function(){if(this.ba)dhx.html.remove(this.ba),this.ba=null}};
dhx.protoUI({name:"scrollview",defaults:{scroll:"x",scrollSpeed:"0ms"},$init:function(){this.b.className+=" dhx_scrollview"},content_setter:function(a){this.ha=dhx.ui.Oa(a);this.ha.D=this;this.d.appendChild(this.ha.b)},body_setter:function(a){return this.content_setter(a)},$getSize:function(){this.ga=this.ha.$getSize();if(this.a.scroll=="x"&&this.ga[3]>0)this.a.height=this.ga[3];else if(this.a.scroll=="y"&&this.ga[1]>0)this.a.width=this.ga[1];return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,
b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))this.ha.$setSize(Math.max(this.ga[1],this.j),Math.max(this.ga[3],this.m)),this.d.style.width=this.ha.j+"px",this.d.style.height=this.ha.m+"px"}},dhx.Scrollable,dhx.ui.view);dhx.CanvasMgr=function(a){var b=dhx.CanvasMgr.prototype.qc;!b[a]&&document.getCSSCanvasContext&&(b[a]=!0,dhx.CanvasMgr.prototype[a](b))};
dhx.CanvasMgr.prototype={buttonGrd:["#fefefe","#e0e0e0","#e5e5e5","#e0e0e0",32],qc:[],Pa:function(a,b,c,d,e){var f=document.getCSSCanvasContext("2d",d,18,c),g=f.createLinearGradient(0,0,0,c);g.addColorStop(0,a);g.addColorStop(1,b);f.fillStyle=g;f.strokeStyle="#93B0BA";f.lineWidth=2;e?(f.moveTo(0,0.5),f.lineTo(17.5,c/2+0.5),f.lineTo(0,c-0.5),f.lineTo(0,0.5)):(f.moveTo(18,0.5),f.lineTo(0.5,c/2+0.5),f.lineTo(18,c-0.5),f.lineTo(18,0.5));f.stroke();f.fill()},dhxArrowLeftT:function(){this.Pa(this.buttonGrd[2],
this.buttonGrd[3],this.buttonGrd[4],"dhxArrowLeftT")},dhxArrowRightT:function(){this.Pa(this.buttonGrd[2],this.buttonGrd[3],this.buttonGrd[4],"dhxArrowRightT",!0)},dhxArrowLeft:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowLeft");dhx.CanvasMgr("dhxArrowLeftT")},dhxArrowRight:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowRight",!0);dhx.CanvasMgr("dhxArrowRightT")}};
dhx.attachEvent("onClick",function(a){var b=dhx.ui.get(a);if(b&&b.touchable){b.getNode(a);var c=a.target||a.srcElement,d="",e=null,f=!1;if(!(c.className&&c.className.indexOf("dhx_view")===0)){for(;c&&c.parentNode;){if(c.getAttribute){if(c.getAttribute("view_id"))break;if(d=c.className)if(d=d.split(" "),d=d[0]||d[1],b.on_click[d]){var g=b.on_click[d].call(b,a,b.a.id,c);if(g===!1)return}}c=c.parentNode}if(b.a.click){var h=dhx.toFunctor(b.a.click);h&&h.call&&h.call(b,b.a.id,a)}if(b.a.multiview){var i=
dhx.ui.get(b.a.multiview);i&&i.show&&i.show()}if(b.a.popup){var j=dhx.ui.get(b.a.popup);j.a.master=b.a.id;j.show(b.getInput()||b.getNode(),j.h.a.align||"bottom",!0)}b.callEvent("onItemClick",[b.a.id,a])}}});
dhx.protoUI({name:"button",touchable:!0,defaults:{template:"<div class='dhx_el_button'><input type='button' style='width:100%;' value='#label#'></div>",height:42,label:"label",s:10},$init:function(a){this.data=this.a;this.d=this.b;dhx.sa&&(dhx.sa.elements[a.name||a.id]=this,this.mapEvent({onbeforetabclick:dhx.sa,onaftertabclick:dhx.sa,onitemclick:dhx.sa}));a.type=="prev"&&dhx.CanvasMgr("dhxArrowLeft");a.type=="next"&&dhx.CanvasMgr("dhxArrowRight")},type_setter:function(a){this.a.template=dhx.Template(this.pd[a][0]);
var b=this.pd[a][1];if(b)this.a.s=b},pd:{round:["<div class='dhx_el_roundbutton'><input type='button' style='width:100%;' value='#label#'></div>"],"default":["<div class='dhx_el_defaultbutton'><input type='button' style='width:100%;' value='#label#'></div>"],form:[function(a){return"<div class='dhx_el_formbutton'><div style='width:100%;text-align:"+a.align+"'><input type='button' class='dhx_inp_form_button' style='text-align: "+a.inputAlign+"; width: "+(a.inputWidth?a.inputWidth+"px":"100%")+";' value='"+
(a.label||a.value)+"' /></div></div>"}],prev:["<div class='dhx_el_prevbutton'><div class='dhx_el_prevbutton_arrow'></div><div class='dhx_el_prevbutton_input_cont'><input type='button' value='#label#' /></div></div>",28],next:["<div class='dhx_el_nextbutton'><div class='dhx_el_nextbutton_input_cont'><input type='button' value='#label#' /></div><div class='dhx_el_nextbutton_arrow'></div></div>",28],big:["<div class='dhx_el_bigbutton'><input type='button' value='#label#'></div>",28],biground:["<div class='dhx_el_bigroundbutton'><input type='button' value='#label#'></div>",
28]},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.render()},K:function(a){this.a.label=a;this.getInput().value=a},getValue:function(){return this.d.childNodes.length>0?this.ab():this.a.value},setValue:function(a){var b=this.a.value;this.a.value=a;if(this.d.childNodes.length>0)this.Md=a,this.K(a),this.callEvent("onChange",[a,b])},focus:function(){this.getInput().focus()},ab:function(){return this.a.label||""},getInput:function(){return this.d.getElementsByTagName("input")[0]},
J:function(){return this.getInput()},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.s+"px":this.J().style.width=this.j-this.a.s+"px"},render:function(){if(dhx.AtomRender.render.call(this)){this.Z();if(this.a.align)switch(this.a.align){case "right":this.d.firstChild.style.cssFloat=this.d.firstChild.style.styleFloat="right";break;case "center":this.d.firstChild.style.display="inline-block";this.d.firstChild.parentNode.style.textAlign="center";break;case "middle":this.d.firstChild.style.marginTop=
Math.round((this.m-40)/2)+"px";break;case "bottom":this.d.firstChild.style.marginTop=this.m-40+"px";break;case "left":this.d.firstChild.parentNode.style.textAlign="left"}this.Aa&&this.Aa(this.data);this.Md!=this.a.value&&this.setValue(this.a.value)}},refresh:function(){this.render()},on_click:{Ib:function(a,b){var c=dhx.html.locate(a,"button_id");if(c&&this.callEvent("onBeforeTabClick",[b,c])){this.a.selected=c;this.refresh();if(this.a.multiview){var d=dhx.ui.get(c);d&&d.show&&d.show()}this.callEvent("onAfterTabClick",
[b,c])}},dhx_el_segmented:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_el_tabbar:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_inp_counter_next:function(){this.next(this.a.step,this.a.min,this.a.max)},dhx_inp_counter_prev:function(){this.prev(this.a.step,this.a.min,this.a.max)},dhx_inp_toggle_left_off:function(){var a=this.a.options;this.setValue(a[0].value)},dhx_inp_toggle_right_off:function(){var a=this.a.options;this.setValue(a[1].value)},dhx_inp_combo:function(a,b,c){c.focus()},dhx_inp_checkbox_border:function(){this.toggle()},
dhx_inp_checkbox_label:function(){this.toggle()},dhx_inp_radio_border:function(a){var b=dhx.html.locate(a,"radio_id");this.setValue(b)},dhx_inp_radio_label:function(a,b,c){c=c.parentNode.getElementsByTagName("input")[0];return this.on_click.dhx_inp_radio_border.call(this,c,b,c)}},Ba:function(a){for(var b=0;b<a.length;b++)if(typeof a[b]=="string")a[b]={value:a[b],label:a[b]};else if(a[b].value){if(!a[b].label)a[b].label=a[b].value}else a[b].value=a[b].label}},dhx.ui.view,dhx.AtomRender,dhx.Settings,
dhx.EventSystem);dhx.protoUI({name:"imagebutton",defaults:{template:"<div class='dhx_el_imagebutton'><span><img src='#src#'/>&nbsp;#label#</span></div>",label:""},Z:function(){}},dhx.ui.button);dhx.protoUI({name:"label",defaults:{template:"<div class='dhx_el_label'>#label#</div>"},focus:function(){return!1},J:function(){return this.d.firstChild},K:function(a){this.a.label=a;this.d.firstChild.innerHTML=a}},dhx.ui.button);
dhx.protoUI({name:"icon",defaults:{template:"<div class='dhx_el_icon'><div class='dhx_el_icon_#icon#'></div></div>",width:42},Z:function(){}},dhx.ui.button);
dhx.protoUI({name:"segmented",defaults:{template:function(a,b){var c=a.options,d="",e;b.Ba(c);if(!a.selected)a.selected=c[0].value;for(var f=0;f<c.length;f++)e=c[f].width||a.inputWidth?"width: "+((c[f].width||Math.round(a.inputWidth/c.length))-b.a.s)+"px;":"",d+="<div style='"+e+"' class='"+(a.selected==c[f].value?"selected ":"")+"segment_"+(f==c.length-1?"N":f>0?1:0)+"' button_id='"+c[f].value+"'>"+c[f].label+"</div>";return"<div class='dhx_el_segmented'>"+d+"</div>"},s:28,nb:0},K:function(a){if(this.d&&
this.d.firstChild)for(var b=this.d.firstChild.childNodes,c=0;c<b.length;c++)if(dhx.html.locate(b[c],"button_id")==a)return this.on_click.Ib.call(this,b[c],this.a.options[c]),!0},getValue:function(){return this.a.selected},Z:function(){}},dhx.ui.button);
dhx.protoUI({name:"tabbar",defaults:{height:49,template:function(a,b){var c=a.options;b.Ba(c);for(var d="",e,f=0;f<c.length;f++){var g="",h=c[f].src;c[f].value==a.selected&&(g="selected",h=c[f].srcSelected||c[f].src);c[f].css&&(g+=" "+c[f].css);e=a.optionWidth||c[f].width||a.inputWidth?"width: "+(c[f].width||Math.ceil(a.inputWidth/c.length)-b.a.s)+"px;":"";d+="<div class='"+g+"' button_id='"+c[f].value+"' style='"+e+"'>";d+=h?"<img src='"+h+"'/><span>"+c[f].label+"</span>":"<div style='height:26px'></div><span>"+
c[f].label+"</span>";d+="</div>"}return"<div class='dhx_el_tabbar'>"+d+"</div>"},s:4}},dhx.ui.segmented);
dhx.protoUI({name:"text",wd:!0,$b:function(a,b,c){c.labelPosition=="left"?a+=b:a=b+a;return"<div class='dhx_el_"+this.name+"'>"+a+"</div>"},pb:function(a,b,c,d){var e=a.inputAlign||"left",f=a.labelAlign||"left",g=dhx.uid(),h="<div class='dhx_inp_text_border'>";h+="<div class='dhx_inp_text_label' style='width: "+this.a.labelWidth+"px; text-align: "+f+";'><label onclick='' for='"+g+"' class='dhx_inp_label_for_text'>"+(a.label||"")+"</label></div>";var i=this.a.inputWidth-this.a.labelWidth-18;i<0&&(i=
0);h+=d?"<div class='dhx_inp_"+b+"' onclick='' style='width: "+i+"px; text-align: "+e+";' >"+(a.text||a.value||"")+"</div>":"<input id='"+g+"' type='"+(a.type||this.name)+"' value='"+(a.text||a.value||"")+"' "+(c||a.readonly?"readonly='true' ":"")+(a.maxlength?"maxlength='"+a.maxlength+"' ":"")+(a.placeholder?"placeholder='"+a.placeholder+"' ":"")+" class='dhx_inp_"+b+"' style='width: "+i+"px; text-align: "+e+";' />";h+="</div>";return"<div class='dhx_el_"+this.name+"'>"+h+"</div>"},qb:function(a,
b){if(!a.label)return"";var c=a.labelAlign||"left";return"<div class='dhx_inp_"+b+"_label' style='width: "+a.labelWidth+"px; text-align: "+c+";'>"+a.label+"</div>"},defaults:{template:function(a,b){return b.pb(a,"text")},labelWidth:80,s:28,nb:0},type_setter:function(a){return a},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.labelWidth-this.a.s+"px":this.J().style.width=this.j-this.a.labelWidth-this.a.s-this.a.nb+"px"},focus:function(){var a=this.d.getElementsByTagName("input")[0];
a&&a.focus()},K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.button);
dhx.protoUI({name:"toggle",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=b.a.inputWidth/2||"auto",e=[c[0].width||d,c[1].width||d],f=b.qb(a,"toggle"),g="<input type='button' style='width: "+e[0]+"px;' value='"+a.options[0].label+"' />";g+="<input type='button' style='width: "+e[1]+"px;' value='"+a.options[1].label+"' />";return b.$b(f,g,a)},label:"",labelWidth:0,s:20},Z:function(){},Aa:function(a){this.setValue(a.value)},$a:function(){return this.d.getElementsByTagName("input")},
K:function(a){var b=this.$a(),c=this.a.options;a==c[1].value?(b[0].className="dhx_inp_toggle_left_off",b[1].className="dhx_inp_toggle_right_on"):(b[0].className="dhx_inp_toggle_left_on",b[1].className="dhx_inp_toggle_right_off")},ab:function(){var a=this.$a(),b=this.a.options;return a[0].className=="dhx_inp_toggle_left_on"?b[0].value:b[1].value}},dhx.ui.text);
dhx.protoUI({name:"input",defaults:{attributes:["maxlength","disabled","placeholder"],template:function(a,b){for(var c="<input",d=b.a.attributes,e=0;e<d.length;e++)a[d[e]]&&(c+=" "+d[e]+"='"+a[d[e]]+"'");c+=" type='"+(a.type||"text")+"'";c+="/>";return"<div class='dhx_el_input'>"+c+"</div>"},s:28,labelWidth:0}},dhx.ui.text);
dhx.protoUI({name:"select",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d="<select";a.disabled&&(d+=" disabled='true'");d+=">";for(var e=0;e<c.length;e++)d+="<option"+(c[e].selected?" selected='true'":"")+(c[e].value?" value='"+c[e].value+"'":"")+">"+c[e].label+"</option>";d+="</select>";return"<div class='dhx_el_select'>"+d+"</div>"},labelWidth:0,nb:0,s:10},getInput:function(){return this.d.firstChild.firstChild}},dhx.ui.text);
dhx.protoUI({name:"textarea",defaults:{template:function(a){return"<div class='dhx_el_textarea'><textarea class='dhx_inp_textarea' placeholder='"+(a.label||"")+"' style=''>"+(a.value||"")+"</textarea></div>"},cssContant:28},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.cssContant+"px":this.J().style.width=this.j-this.a.nb-this.a.cssContant+"px";this.a.inputHeight?this.J().style.height=this.a.inputHeight+"px":this.J().style.height=this.m-9+"px"},getInput:function(){return this.d.firstChild.firstChild},
K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.text);
dhx.protoUI({name:"counter",defaults:{template:function(a,b){var c=a.value||0,d=b.qb(a,"counter"),e="<input type='button' class='dhx_inp_counter_prev' value='\u25ac' />";e+="<div class='dhx_inp_counter_value' >"+c+"</div>";e+="<input type='button' class='dhx_inp_counter_next' value='+' />";return b.$b(d,e,a)},min:1,step:1,labelWidth:0,label:"",s:145},J:function(){return this.getInput().parentNode},getLabel:function(){return this.getInput().previousSibling||this.getInput().parentNode.lastChild},Z:function(){if(this.a.label&&
!this.a.labelWidth){var a=this.getLabel();if(a)a.style.width=(this.a.inputWidth||this.j)-this.a.s+"px"}},K:function(a){this.getInput().nextSibling.innerHTML=a},getValue:function(){return(this.a.value||0)*1},next:function(a,b,c){a=a||1;this.kd(a,b,c)},prev:function(a,b,c){a=-1*(a||1);this.kd(a,b,c)},kd:function(a,b,c){var b=typeof b=="undefined"?-Infinity:b,c=typeof c=="undefined"?Infinity:c,d=this.getValue()+a;d>=b&&d<=c&&this.setValue(d)}},dhx.ui.text);
dhx.protoUI({name:"checkbox",defaults:{template:function(a,b){var c=a.value?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden",d="<div class='dhx_inp_checkbox_border'><input type='button' class='"+c+"' value='' /></div>",e=b.qb(a,"checkbox");return b.$b(e,d,a)}},K:function(a){var b=this.getInput();b.className=a?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden"},toggle:function(){this.setValue(!this.getValue())},getLabel:function(){var a=this.getInput().parentNode;return a.nextSibling||a.previousSibling},
getValue:function(){return this.a.value?1:0},J:function(){return this.getInput().parentNode.parentNode}},dhx.ui.counter);
dhx.protoUI({name:"radio",defaults:{template:function(a,b){b.Ba(a.options);for(var c=[],d=0;d<a.options.length;d++){a.options[d].newline&&c.push("<div style='clear:both;'></div>");var e="<div radio_id='"+a.options[d].value+"' class='dhx_inp_radio_border'><input type='button' class='"+(a.options[d].value==a.value?"dhx_inp_radio_on":"dhx_inp_radio_on hidden")+"' value='' /></div>";a.label=a.options[d].label;var f=b.qb(a,"radio");a.labelPosition=="left"?c.push(f+e):c.push(e+f)}return"<div class='dhx_el_radio'><div>"+
c.join("</div><div>")+"</div></div>"}},$getSize:function(){var a=dhx.ui.button.prototype.$getSize.call(this);if(this.a.options){for(var b=1,c=0;c<this.a.options.length;c++)this.a.options[c].newline&&b++;a[3]=Math.max(a[3],this.defaults.height*b)}return a},$a:function(){return this.d.getElementsByTagName("input")},K:function(a){for(var b=this.$a(),c=0;c<b.length;c++)b[c].className=b[c].parentNode.getAttribute("radio_id")==a?"dhx_inp_radio_on":"dhx_inp_radio_on hidden"},getValue:function(){return this.a.value}},
dhx.ui.text);
dhx.protoUI({name:"richselect",defaults:{template:function(a,b){return b.pb(a,"list",!0,!0)}},Y:function(a){a.popup||this.Cb("list",a);this.dc();this.Y=function(){}},options_setter:function(a){for(var b=this.a.data=[],c=0;c<a.length;c++){var d=a[c].value||a[c].label||a[c],e=a[c].label||a[c].value||a[c];b.push({id:d,value:e})}return a},Aa:function(a){this.Y(a);if(!dhx.isNotDefined(a.value)){this.setValue(a.value,{},a);var b=dhx.ui.get(a.popup.toString()),c=b.h,d=this;c.attachEvent("onXLE",dhx.bind(function(){this.setValue(this.a.value,
{},a)},this))}},Cb:function(a,b){var c=dhx.extend({},b);delete c.align;delete c.height;delete c.width;delete c.template;c.view=a;c.id=(b.id||b.name)+"_"+a;c.width=c.popupWidth||290;var d=dhx.uid(),e={id:d,view:"popup",body:c};dhx.ui(e).hide();b.popup=d;this.dc()},dc:function(){var a=dhx.ui.get(this.a.popup);a.h.attachEvent("onItemClick",function(a){var c=dhx.ui.get(this.getParent().a.master);this.getParent().hide();c.setValue(a)})},getInput:function(){return this.d.firstChild.childNodes[0].childNodes[1]},
K:function(a){var b=dhx.ui.get(this.a.popup).h,c=b.type?b.type.template(b.item(a)||a,b.type):a;this.a.value=a;this.a.text=c;this.name=="combo"?this.getInput().value=c.replace(/<[^>]*>/g,""):this.getInput().innerHTML=c},getValue:function(){return this.a.value}},dhx.ui.text);
dhx.protoUI({name:"combo",defaults:{template:function(a,b){return b.pb(a,"combo")},filter:function(a,b){return a.value.toString().toLowerCase().indexOf(b.toLowerCase())===0?!0:!1}},Y:function(a){a.popup||this.Cb("list",a);this.dc();dhx.event(this.d,"keydown",function(b){var b=b||event,c=b.target||b.srcElement,d=dhx.ui.get(a.popup);window.clearTimeout(d.key_timer);var e=this;d.key_timer=window.setTimeout(function(){d.h.filter(function(a){return e.a.filter.apply(e,[a,c.value])});var a=dhx.ui.get(d.a.master);
a.a.value=d.h.dataCount()==1&&d.h.type.template(d.h.item(d.h.first()))==c.value?d.h.first():""},200);d.show(c,d.h.a.align||"bottom",!0)},this);this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)}},dhx.ui.richselect);
dhx.protoUI({name:"datepicker",defaults:{template:function(a,b){return b.pb(a,"list",!0,!0)}},Y:function(a){a.popup||this.Cb("calendar",a);var b=dhx.ui.get(a.popup);b.h.attachEvent("onDateSelect",function(a){var b=dhx.ui.get(this.getParent().a.master);this.getParent().hide();b.setValue(a)});this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)},K:function(a){var b=dhx.ui.get(this.a.popup.toString()),c=b.h;typeof a=="string"&&a&&(a=(this.a.dateFormat||dhx.i18n.dateFormatDate)(a));
c.selectDate(a,!0);this.a.value=a?c.config.date:"";this.getInput().innerHTML=a?(this.a.dateFormatStr||dhx.i18n.dateFormatStr)(this.a.value):""},dateFormat_setter:function(a){this.a.dateFormatStr=dhx.Date.dateToStr(a);return dhx.Date.strToDate(a)},getValue:function(){return this.a.value||null}},dhx.ui.richselect);
dhx.ValidateData={validate:function(a){var b=!0,c=this.a.rules;if(c){var d=c.$obj;!a&&this.getValues&&(a=this.getValues());if(d&&!d.call(this,a))return!1;var e=c.$all,f;for(f in c)f.indexOf("$")!==0&&(c[f].call(this,a[f],a,f)&&(!e||e.call(this,a[f],a,f))?this.callEvent("onValidationSuccess",[f,a])&&this.tc&&this.tc(f,a):(b=!1,this.callEvent("onValidationError",[f,a])&&this.Lc&&this.Lc(f,a)))}return b}};
dhx.rules={isNumber:function(a){return parseFloat(a)==a},isNotEmpty:function(a){return a=="0"||a}};
dhx.RenderStack={$init:function(){this.F=document.createElement("DIV");this.data.attachEvent("onIdChange",dhx.bind(this.Zb,this));this.attachEvent("onItemClick",this.Dd);if(!this.types)this.types={"default":this.type},this.type.name="default";this.type=dhx.copy(this.types[this.type.name])},customize:function(a){dhx.Type(this,a)},type_setter:function(a){this.types[a]?(this.type=dhx.copy(this.types[a]),this.type.css&&(this.g.className+=" "+this.type.css)):this.customize(a);return a},template_setter:function(a){this.type.template=
dhx.Template(a)},xa:function(a){this.callEvent("onItemRender",[a]);return this.type.templateStart(a,this.type)+(a.$template?this.type["template"+a.$template]:this.type.template)(a,this.type)+this.type.templateEnd(a,this.type)},ld:function(a){this.F.innerHTML=this.xa(a);return this.F.firstChild},Zb:function(a,b){var c=this.pa(a);c&&(c.setAttribute(this.ma,b),this.B[b]=this.B[a],delete this.B[a])},Dd:function(){if(this.a.click){var a=dhx.toFunctor(this.a.click);a&&a.call&&a.apply(this,arguments)}},
pa:function(a){if(this.B)return this.B[a];this.B={};for(var b=this.d.childNodes,c=0;c<b.length;c++){var d=b[c].getAttribute(this.ma);d&&(this.B[d]=b[c])}return this.pa(a)},locate:function(a){return dhx.html.locate(a,this.ma)},showItem:function(a){var b=this.pa(a);if(b&&this.scrollTo){var c=Math.max(0,b.offsetLeft-this.d.offsetLeft),d=Math.max(0,b.offsetTop-this.d.offsetTop);this.scrollTo(c,d);this.bd&&this.bd(a)}},render:function(a,b,c){if(this.isVisible(this.a.id))if(a){var d=this.pa(a);switch(c){case "update":if(!d)break;
var e=this.B[a]=this.ld(b);dhx.html.insertBefore(e,d);dhx.html.remove(d);break;case "delete":if(!d)break;dhx.html.remove(d);delete this.B[a];break;case "add":e=this.B[a]=this.ld(b);dhx.html.insertBefore(e,this.pa(this.data.next(a)),this.d);break;case "move":this.render(a,b,"delete"),this.render(a,b,"add")}}else if(this.callEvent("onBeforeRender",[this.data]))(this.De||this.d).innerHTML=this.data.getRange().map(this.xa,this).join(""),this.B=null,this.callEvent("onAfterRender",[])}};
dhx.protoUI({name:"proto",$init:function(){this.data.provideApi(this,!0);this.d=this.g;this.data.attachEvent("onStoreUpdated",dhx.bind(function(){this.render.apply(this,arguments)},this))},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments)&&this.render()}},dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings);
dhx.Values={$init:function(){this.elements={}},focus:function(a){a?this.elements[a].focus():this.first().focus()},setValues:function(a){if(this.isVisible(this.a.id)){this.sd=dhx.copy(a);for(var b in this.elements)this.elements[b]&&!dhx.isNotDefined(a[b])&&this.elements[b].setValue(a[b]);this.callEvent("onChange",[])}else this.fc=a},getValues:function(){var a=this.sd?dhx.copy(this.sd):{},b;for(b in this.elements)a[b]=this.elements[b].getValue();return a},clear:function(){var a={},b;for(b in this.elements)this.elements[b].wd&&
(a[b]=this.elements[b].a.defaultValue||"");this.setValues(a)},mb:function(a,b){var c=this.data.driver,d=c.getRecords(c.toObject(a,b))[0];this.setValues(c?c.getDetails(d):a);this.callEvent("onXLE",[])},Lc:function(a){dhx.html.addCss(this.elements[a].d.firstChild,"invalid")},tc:function(a){dhx.html.removeCss(this.elements[a].d.firstChild,"invalid")}};
dhx.protoUI({name:"toolbar",defaults:{type:"MainBar"},Ce:!0,Db:44,$init:function(a){this.g.style.border="1px solid #AEAEAE";this.Vc(a)},Vc:function(a){this.g.className+=" dhx_toolbar";if(a.elements)this.Q=a.elements,this.r=!1;delete a.elements;dhx.sa=this},$getSize:function(){var a=dhx.ui.baselayout.prototype.$getSize.call(this);if(a[3]>0&&(!this.r||!this.a.scroll))this.a.height=a[3];if(a[1]>0&&(this.r||!this.a.scroll))this.a.width=a[1];a=dhx.ui.view.prototype.$getSize.call(this);if(a[3]<=0&&this.Db>
0)a[3]=this.Db,a[2]=0;return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.apply(this,arguments);dhx.ui.baselayout.prototype.$setSize.call(this,this.j,this.m)},render:function(){if(this.isVisible(this.a.id)&&this.fc)this.setValues(this.fc),this.fc=null},refresh:function(){this.render()},type_setter:function(a){this.g.className+=" dhx_"+a.toLowerCase()}},dhx.Scrollable,dhx.AtomDataLoader,dhx.Values,dhx.ui.baselayout,dhx.EventSystem,dhx.ValidateData);
dhx.protoUI({name:"form",defaults:{scroll:!0},Db:-1,Vc:function(a){this.g.className+=" dhx_form";if(a.elements)this.Q=a.elements,this.r=!0;delete a.elements;dhx.sa=this},type_setter:function(){}},dhx.ui.toolbar);
dhx.MouseEvents={$init:function(){this.on_click&&dhx.event(this.g,"click",this.me,this);this.on_context&&dhx.event(this.g,"contextmenu",this.ne,this);this.on_dblclick&&dhx.event(this.g,"dblclick",this.oe,this);this.on_mouse_move&&(dhx.event(this.g,"mousemove",this.Rc,this),dhx.event(this.g,dhx.env.isIE?"mouseleave":"mouseout",this.Rc,this))},me:function(a){return this.Ja(a,this.on_click,"ItemClick")},oe:function(a){return this.Ja(a,this.on_dblclick,"ItemDblClick")},ne:function(a){if(this.Ja(a,this.on_context,
"BeforeContextMenu"))return this.Ja(a,{},"AfterContextMenu"),dhx.html.preventEvent(a)},Rc:function(a){dhx.env.isIE&&(a=document.createEventObject(event));this.Nc&&window.clearTimeout(this.Nc);this.callEvent("onMouseMoving",[a]);this.Nc=window.setTimeout(dhx.bind(function(){a.type=="mousemove"?this.pe(a):this.qe(a)},this),500)},pe:function(a){this.Ja(a,this.on_mouse_move,"MouseMove")||this.callEvent("onMouseOut",[a||event])},qe:function(a){this.callEvent("onMouseOut",[a||event])},Ja:function(a,b,c){for(var a=
a||event,d=a.target||a.srcElement,e="",f=null,g=!1;d&&d.parentNode;){if(!g&&d.getAttribute&&(f=d.getAttribute(this.ma))){d.getAttribute("userdata")&&this.callEvent("onLocateData",[f,d]);if(!this.callEvent("on"+c,[f,a,d]))return;g=!0}if(e=d.className)if(e=e.split(" "),e=e[0]||e[1],b[e]){var h=b[e].call(this,a,f||dhx.html.locate(a,this.ma),d);if(typeof h!="undefined"&&h!==!0)return}d=d.parentNode}return g}};
dhx.SelectionModel={$init:function(){this.i=dhx.toArray();this.data.attachEvent("onStoreUpdated",dhx.bind(this.Pd,this));this.data.attachEvent("onStoreLoad",dhx.bind(this.Od,this));this.data.attachEvent("onAfterFilter",dhx.bind(this.Nd,this));this.data.attachEvent("onChangeId",dhx.bind(this.Zd,this))},Zd:function(a,b){for(var c=this.i.length-1;c>=0;c--)this.i[c]==a&&(this.i[c]=b)},Nd:function(){for(var a=this.i.length-1;a>=0;a--){if(this.data.indexById(this.i[a])<0)var b=this.i[a];var c=this.item(b);
c&&delete c.$selected;this.i.splice(a,1);this.callEvent("onSelectChange",[b])}},Pd:function(a,b,c){if(c=="delete")this.i.remove(a);else if(!this.data.dataCount()&&!this.data.p)this.i=dhx.toArray()},Od:function(){this.a.select&&this.data.each(function(a){a.$selected&&this.select(a.id)},this)},ub:function(a,b,c){if(!c&&!this.callEvent("onBeforeSelect",[a,b]))return!1;this.data.item(a).$selected=b;c?c.push(a):(b?this.i.push(a):this.i.remove(a),this.Vb(a));return!0},select:function(a,b,c){if(!a)return this.selectAll();
if(dhx.isArray(a))for(var d=0;d<a.length;d++)this.select(a[d],b,c);else if(this.data.exists(a)){if(c&&this.i.length)return this.selectAll(this.i[this.i.length-1],a);if(!b&&(this.i.length!=1||this.i[0]!=a))this.fd=!0,this.unselectAll(),this.fd=!1;this.isSelected(a)?b&&this.unselect(a):this.ub(a,!0)&&this.callEvent("onAfterSelect",[a])}},unselect:function(a){if(!a)return this.unselectAll();this.isSelected(a)&&this.ub(a,!1)},selectAll:function(a,b){var c,d=[];c=a||b?this.data.getRange(a||null,b||null):
this.data.getRange();c.each(function(a){var b=this.data.item(a.id);b.$selected||(this.i.push(a.id),this.ub(a.id,!0,d));return a.id},this);this.Vb(d)},unselectAll:function(){var a=[];this.i.each(function(b){this.ub(b,!1,a)},this);this.i=dhx.toArray();this.Vb(a)},isSelected:function(a){return this.i.find(a)!=-1},getSelected:function(a){switch(this.i.length){case 0:return a?[]:"";case 1:return a?[this.i[0]]:this.i[0];default:return[].concat(this.i)}},ee:function(a){return a.length>100||a.length>this.data.dataCount/
2},Vb:function(a){typeof a!="object"&&(a=[a]);if(a.length){if(this.ee(a))this.data.refresh();else for(var b=0;b<a.length;b++)this.render(a[b],this.data.item(a[b]),"update");this.fd||this.callEvent("onSelectChange",[a])}}};
dhx.TreeStore={$init:function(){this.branch={0:[]}},clearAll:function(){this.branch={0:[]};dhx.DataStore.prototype.clearAll.call(this)},prevSibling:function(a){var b=this.branch[this.item(a).$parent],c=dhx.PowerArray.find.call(b,a)-1;return c>=0?b[c]:null},nextSibling:function(a){var b=this.branch[this.item(a).$parent],c=dhx.PowerArray.find.call(b,a)+1;return c<b.length?b[c]:null},parent:function(a){return this.item(a).$parent},firstChild:function(a){var b=this.branch[a];return b&&b.length?b[0]:null},
hasChild:function(a,b){var c=this.branch[a];if(c&&c.length)for(var d=0;d<c.length;d++){if(c[d]==b)return!0;if(this.hasChild(c[d],b))return!0}return!1},branchIndex:function(a,b){var c=this.branch[a];return dhx.PowerArray.find.call(c,b)},extraParser:function(a,b,c){a.$parent=b||0;a.$level=c||1;this.branch[a.$parent]||(this.branch[a.$parent]=[]);this.branch[a.$parent].push(a.id);if(!a.item)return a.$count=0;dhx.isArray(a.item)?a.$count=a.item.length:(a.item=[a.item],a.$count=1);for(var d=0;d<a.item.length;d++){var e=
a.item[d];this.pull[this.id(e)]=e;this.extraParser(e,a.id,a.$level+1)}delete a.item},provideApi:function(a,b){for(var c="prevSibling,nextSibling,parent,firstChild,hasChild,branchIndex".split(","),d=0;d<c.length;d++)a[c[d]]=dhx.methodPush(this,c[d]);dhx.DataStore.prototype.provideApi.call(this,a,b)},getTopRange:function(){return dhx.toArray([].concat(this.branch[0])).map(function(a){return this.item(a)},this)},eachChild:function(a,b){if(this.branch[a])return dhx.PowerArray.each.call(this.branch[a],
b)},add:function(a,b,c){this.branch[c||0]=this.order=dhx.toArray(this.branch[c||0]);(c=this.item(c||0))&&c.$count++;a.$count=0;a.$level=c?c.$level+1:1;a.$parent=c?c.id:0;return dhx.DataStore.prototype.add.call(this,a,b)},remove:function(a){var b=this.item(a),c=b.$parent||0;this.branch[c]=this.order=dhx.toArray(this.branch[c]);c&&this.item(c).$count--;return dhx.DataStore.prototype.remove.call(this,a)},serialize:function(a){for(var b=this.branch[a||0],c=[],d=0;d<b.length;d++){var e=this.pull[b[d]];
if(e.$count)e=dhx.copy(e),e.item=this.serialize(b[d]);c.push(e)}return c},groupBy:function(a,b,c,d,e){if(c===!0){var f={},g=dhx.copy(a),h=g.pop(),i={},j;for(j in b){var k=b[j],o=k[h];if(typeof i[o]==="undefined"){j=dhx.uid();var m={id:j,text:o,$count:0,$level:e,$parent:d};i[o]=j;f[j]=[];this.pull[j]=m;this.branch[d].push(j);this.branch[j]=[]}else j=i[o];f[j].push(k);g.length===0&&this.branch[j].push(k.id)}for(var l in f)this.pull[l].$count=f[l].length,g.length>0&&this.groupBy(g,f[l],!0,l,e+1)}else{var n=
arguments,g=[];this.branch={0:[]};for(l=n.length-1;l>=0;l--)g.push(n[l]);this.groupBy(g,this.pull,!0,"0",0);this.refresh()}}};dhx.animate=function(a,b){if(dhx.isArray(a))for(var c=0;c<a.length;c++){if(b.type=="slide"){if(b.subtype=="out"&&c===0)continue;if(b.subtype=="in"&&c==1)continue}if(b.type=="flip"){var d=dhx.copy(b);if(c===0)d.type="flipback";if(c==1)d.callback=null;dhx.animate(a[c],d)}else dhx.animate(a[c],b)}else{var e=dhx.toNode(a);e.cb?dhx.animate.end(e,b):dhx.animate.start(e,b)}};
dhx.animate.end=function(a,b){a.style[dhx.env.transformPrefix+"TransitionDuration"]="1ms";a.cb=null;dhx.td&&window.clearTimeout(dhx.td);dhx.td=dhx.delay(dhx.animate,dhx,[a,b],10)};dhx.animate.isSupported=function(){return dhx.env.transform&&dhx.env.transition};
dhx.animate.formLine=function(a,b,c){var d=c.direction;b.parentNode.style.position="relative";b.style.position="absolute";a.style.position="absolute";d=="top"||d=="bottom"?(a.style.left="0px",a.style.top=(d=="top"?1:-1)*b.offsetHeight+"px"):(a.style.top="0px",a.style.left=(d=="left"?1:-1)*b.offsetWidth+"px");b.parentNode.appendChild(a);if(c.type=="slide"&&c.subtype=="out")a.style.left=0,a.style.top=0,b.parentNode.removeChild(b),a.parentNode.appendChild(b);return[a,b]};
dhx.animate.breakLine=function(a){dhx.html.remove(a[1]);dhx.animate.clear(a[0]);dhx.animate.clear(a[1]);a[0].style.position=""};dhx.animate.clear=function(a){a.style[dhx.env.transformPrefix+"Transform"]="";a.style[dhx.env.transformPrefix+"Transition"]="";a.style.top=a.style.left=""};
dhx.animate.start=function(a,b){typeof b=="string"&&(b={type:b});var b=dhx.Settings.Ia(b,{type:"slide",delay:"0",duration:"500",timing:"ease-in-out",x:0,y:0}),c=dhx.env.transformPrefix,d=a.cb=b;switch(d.type=="slide"&&d.direction){case "right":d.x=a.offsetWidth;break;case "left":d.x=-a.offsetWidth;break;case "top":d.y=-a.offsetHeight;break;default:d.y=a.offsetHeight}if(d.type=="flip"||d.type=="flipback"){var e=[0,0],f="scaleX";d.subtype=="vertical"?(e[0]=20,f="scaleY"):e[1]=20;if(d.direction=="right"||
d.direction=="bottom")e[0]*=-1,e[1]*=-1}var g=d.duration+"ms "+d.timing+" "+d.delay+"ms",h=c+"TransformStyle: preserve-3d;",i="",j="";switch(d.type){case "fade":i="opacity "+g;h="opacity: 0;";break;case "show":i="opacity "+g;h="opacity: 1;";break;case "flip":g=d.duration/2+"ms "+d.timing+" "+d.delay+"ms";j="skew("+e[0]+"deg, "+e[1]+"deg) "+f+"(0.00001)";i="all "+g;break;case "flipback":d.delay+=d.duration/2;g=d.duration/2+"ms "+d.timing+" "+d.delay+"ms";a.style[c+"Transform"]="skew("+-1*e[0]+"deg, "+
-1*e[1]+"deg) "+f+"(0.00001)";a.style.left="0";j="skew(0deg, 0deg) "+f+"(1)";i="all "+g;break;case "slide":var k=d.x+"px",o=d.y+"px",j=dhx.env.translate+"("+k+", "+o+(dhx.env.translate=="translate3d"?", 0":"")+")",i=dhx.env.transformCSSPrefix+"transform "+g}dhx.delay(function(){a.style[c+"Transition"]=i;dhx.delay(function(){h&&(a.style.cssText+=h);j&&(a.style[c+"Transform"]=j);var b=!1,e=dhx.event(a,dhx.env.transitionEnd,function(c){a.cb=null;d.callback&&d.callback.call(d.master||window,a,d,c);b=
!0;dhx.eventRemove(e)});window.setTimeout(function(){if(!b)a.cb=null,d.callback&&d.callback.call(d.master||window,a,d),b=!0,dhx.eventRemove(e)},(d.duration*1+d.delay*1)*1.3)})})};
dhx.CarouselPanel={Wb:function(){var a,b,c,d;a=this.a.panel;dhx.html.remove(this.P);b="z-index:"+dhx.ui.zIndex()+";";if(a.align=="bottom"||a.align=="top")b+="height:"+a.size+"px; left:0px;",c=0,a.align=="bottom"&&(c=this.m-this.a.panel.size),b+="top:"+c+"px";else if(a.align=="right"||a.align=="left")b+="width:"+a.size+"px;top:0px;",d=0,a.align=="right"&&(d=this.j-this.a.panel.size),b+="left:"+d+"px";this.P=dhx.html.create("DIV",{"class":"dhx_carousel_panel",style:b},"");this.b.appendChild(this.P);
this.Xb()},Xb:function(){var a,b;b=this.a.panel;this.P?this.Hd():this.Wb();var c=this.c?this.c.length:this.data.order.length;if(c>1){for(var d=0;d<c;d++)a=dhx.html.create("DIV",{"class":"dhx_item dhx_carousel_"+(d==this.l?"active":"inactive"),style:b.align=="left"||b.align=="right"?"float:none;":""},""),this.P.appendChild(a);var e=c*this.a.panel.itemSize;b.align=="bottom"||b.align=="top"?(this.P.style.left=(this.j-e)/2+this.b.scrollLeft+"px",this.P.style.width=e+"px"):this.P.style.top=(this.m-e)/
2+this.b.scrollTop+"px"}},Hd:function(){if(this.P)for(var a=this.P.childNodes,b=a.length-1;b>=0;b--)dhx.html.remove(a[b])}};
dhx.protoUI({name:"list",$init:function(){this.data.provideApi(this,!0)},defaults:{select:!1,scroll:!0},ma:"dhx_l_id",on_click:{dhx_list_item:function(a,b){if(this.a.select)this.ra=!0,this.a.select=="multiselect"?this.select(b,a.ctrlKey,a.shiftKey):this.select(b),this.ra=!1}},$getSize:function(){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+this.type.margin)*2;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+1)*(this.a.yCount=="auto"?
this.dataCount():this.a.yCount);return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments)},type:{css:"",widthSize:function(a,b){return b.width+(b.width>-1?"px":"")},heightSize:function(a,b){return b.height+(b.height>-1?"px":"")},template:dhx.Template("#value#"),width:"auto",height:22,margin:0,padding:10,border:1,templateStart:dhx.Template("<div dhx_l_id='#id#' class='dhx_list_item dhx_list_{common.css}_item{obj.$selected?_selected:}' style='width:{common.widthSize()}; height:{common.heightSize()}; padding:{common.padding}px; margin:{common.margin}px; overflow:hidden;'>"),
templateEnd:dhx.Template("</div>")}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.ui.proto);
dhx.protoUI({name:"grouplist",defaults:{animate:{}},$init:function(){dhx.extend(this.data,dhx.TreeStore,!0);this.data.provideApi(this,!0);this.data.attachEvent("onClearAll",dhx.bind(this.Qc,this));this.b.className+=" dhx_grouplist";this.Qc()},Qc:function(){this.aa=[];this.z=[]},on_click:{dhx_list_item:function(a,b){if(this.oa)return!1;for(var c=0;c<this.z.length;c++)if(this.z[c]==b){for(var d=c;d<this.z.length;d++)this.data.item(this.z[d]).$template="";c?(this.aa=this.data.branch[this.z[c-1]],this.z.splice(c)):
(this.aa=this.data.branch[0],this.z=[]);this.Ic=!1;return this.render()}var e=this.item(b);if(e.$count)return this.Ic=!0,this.z.push(b),e.$template="Back",this.aa=this.data.branch[e.id],this.render();else if(this.a.select)this.ra=!0,this.a.select=="multiselect"?this.select(b,a.ctrlKey,a.shiftKey):this.select(b),this.ra=!1}},render:function(a,b,c,d){if(this.oa)return dhx.delay(this.render,this,arguments,100);for(var e=0;e<this.aa.length;e++)this.data.item(this.aa[e]).$template="";this.data.order=this.z.length?
dhx.toArray([].concat(this.z).concat(this.aa)):dhx.toArray([].concat(this.data.branch[0]));if(this.callEvent("onBeforeRender",[this.data])){if(this.ra||!this.d.innerHTML||!dhx.animate.isSupported()||!this.a.animate||this.xe==this.z.length)dhx.RenderStack.render.apply(this,arguments);else{var f=this.d.cloneNode(!1);f.innerHTML=this.data.getRange().map(this.xa,this).join("");var g=dhx.extend({},this.a.animate);g.direction=this.Ic?"left":"right";var h=dhx.animate.formLine(f,this.d,g);g.master=this;g.callback=
function(){this.d=f;dhx.animate.breakLine(h);this.B=g.master=g.callback=null;this.oa=!1;this.callEvent("onAfterRender",[])};this.oa=!0;dhx.animate(h,g)}this.xe=this.z.length}},templateBack_setter:function(a){this.type.templateBack=dhx.Template(a)},templateItem_setter:function(a){this.type.templateItem=dhx.Template(a)},templateGroup_setter:function(a){this.type.templateGroup=dhx.Template(a)},type:{template:function(a,b){return a.$count?b.templateGroup(a,b):b.templateItem(a,b)},css:"group",templateStart:dhx.Template("<div dhx_l_id='#id#' class='dhx_list_item dhx_list{obj.$count?_group:_item}{obj.$template?_back:}{obj.$selected?_selected:}' style='width:{common.width}px; height:{common.height}px; padding:{common.padding}px; margin:{common.margin}px; overflow:hidden;'>"),
templateBack:dhx.Template("&lt; #value#"),templateItem:dhx.Template("#value#"),templateGroup:dhx.Template("#value#"),templateEnd:function(a){var b="";a.$count&&(b+="<div class='dhx_arrow_icon'></div>");b+="</div>";return b}},showItem:function(a){var b,c;if(a&&(b=this.item(a),c=b.$parent,b.$count))c=b.id;this.aa=this.data.branch[c||0];for(this.z=[];c;)this.item(c).$template="Back",this.z.unshift(c),c=this.item(c).$parent;this.ra=!0;this.render();this.ra=!1;dhx.RenderStack.showItem.call(this,a)}},dhx.ui.list);
dhx.Type(dhx.ui.grouplist,{});
dhx.protoUI({name:"pagelist",defaults:{scroll:"x",panel:!1,scrollOffset:0},Yd:!0,$init:function(a){this.b.className+=" dhx_pagelist";a.scroll=a.scroll=="y"?"y":"x";this.type.layout=a.scroll;this.attachEvent("onAfterRender",this.Ie);this.$ready.push(this.zb);this.l=0},zb:function(){if(this.a.scroll=="x")this.d.style.height="100%";this.type.layout=this.a.scroll;this.attachEvent("onAfterScroll",this.Ld)},Ie:function(){if(this.a.scroll=="x")this.d.style.width=(this.type.width+(this.type.padding+this.type.margin)*
2+this.type.border)*this.dataCount()+"px";this.a.panel&&this.Wb()},panel_setter:function(a){a&&(this.b.className+=" hidden_scroll",a===!0&&(a={}),this.Ia(a,{size:16,itemSize:16,align:"bottom"}));return a},bd:function(a){var b=this.indexById(a);if(typeof b!="undefined"&&this.a.panel)this.l=b,this.Xb()},getActive:function(){return this.l?this.data.order[this.l]:this.first()},Ld:function(a){var b=(this.a.scroll=="y"?this.type.height:this.type.width)+(this.type.padding+this.type.margin)*2+this.type.border,
c=this.a.scroll=="y"?this.d.scrollHeight-this.m:this.d.scrollWidth-this.j,d;this.a.scroll=="y"?(d=Math.round(a.f/b),a.f=d*b,a.f=this.uc(a.f,c)):(d=Math.round(a.e/b),a.e=d*b,a.e=this.uc(a.e,c));this.l=-d;this.a.panel&&this.Xb();return!0},uc:function(a,b){var c=this.a.scrollOffset;if(c&&Math.abs(a)>c){var d=dhx.Touch.A[dhx.Touch.H]>dhx.Touch.w[dhx.Touch.H];a+=d?c:1-c}Math.abs(a)>b&&(a=-b);return a},$getSize:function(){if(this.a.scroll=="y"){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+
this.type.margin)*2+this.type.border;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+this.type.border)*(this.a.yCount=="auto"?this.dataCount():this.a.yCount)}else if(this.type.height!="auto")this.a.height=this.type.height+(this.type.padding+this.type.margin)*2+this.type.border;return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.apply(this,arguments)){if(this.type.fullScreen)this.type.width=this.j,this.type.height=
this.m,this.type.padding=0,this.render();this.a.panel&&this.Wb()}},type:{templateStart:function(a,b){var c="dhx_list_item dhx_list_"+b.css+"_item"+(a.$selected?"_selected":""),d="width:"+b.width+"px; height:"+b.height+"px; padding:"+b.padding+"px; margin:"+b.margin+"px; overflow:hidden;"+(b.layout&&b.layout=="x"?"float:left;":"");return"<div dhx_l_id='"+a.id+"' class='"+c+"' style='"+d+"'>"}}},dhx.ui.list,dhx.CarouselPanel);
dhx.protoUI({name:"multiview",defaults:{animate:{}},$init:function(){this.l=0;this.r=1;this.b.style.position="relative";this.b.className+=" dhx_multiview";this.M=[]},xd:function(a,b){var c=dhx.ui.get(a);if(!c.La)c.rb=[],c.La={};c.La[b]||(c.La[b]=!0,c.rb.push(b))},Yb:function(a){var b=dhx.ui.get(a);this.M[this.M.length-2]!=a?(this.M.length==10&&this.M.splice(0,1),this.M.push(a)):this.M.splice(this.M.length-1,1);if(b.La){for(var c=0;c<b.rb.length;c++)dhx.ui.get(b.rb[c]).render();b.rb=[];b.La={}}},T:function(a){for(var a=
a||this.Q,b=0;b<a.length;b++)a[b].k=this.a.k||{top:1,bottom:1,left:1,right:1};dhx.ui.baselayout.prototype.T.call(this,a);for(b=1;b<this.c.length;b++)dhx.html.remove(this.c[b].b);for(b=0;b<a.length;b++){var c=this.c[b];if(!c.c||c.Ce){var d=c.a.k;if(d.top)c.b.style.borderTopWidth="0px";if(d.left)c.b.style.borderLeftWidth="0px";if(d.right)c.b.style.borderRightWidth="0px";if(d.bottom)c.b.style.borderBottomWidth="0px"}}this.Yb(this.getActive())},cells_setter:function(a){this.Q=a},Ud:function(a,b){return a<
b?"right":"left"},Ma:function(a,b){if(this.oa)return dhx.delay(this.Ma,this,[a],100);for(var c=-1,d=0;d<this.c.length;d++)if(this.c[d]==a){c=d;break}if(!(c<0||c==this.l)){var e=this.c[this.l]?this.c[this.l].config.id:null,f=this.c[c]?this.c[c].config.id:null;if((b||typeof b=="undefined")&&dhx.animate.isSupported()&&this.a.animate){var g=dhx.extend({},this.a.animate);g.direction=this.Ud(c,this.l);var g=dhx.Settings.Ia(b||{},g),h=dhx.animate.formLine(this.c[c].b,this.c[this.l].b,g);this.c[c].$getSize();
this.c[c].$setSize(this.j,this.m);g.callback=function(){dhx.animate.breakLine(h);this.oa=!1;g.master=g.callback=null};g.master=this;this.l=c;this.Yb(this.getActive());dhx.animate(h,g);this.oa=!0}else dhx.html.remove(this.c[this.l].b),this.l=c,this.c[this.l].$getSize(),this.c[this.l].$setSize(this.j,this.m),this.Yb(this.getActive()),this.b.appendChild(this.c[d].b);this.callEvent("onViewChange",[e,f])}},$getSize:function(){var a=this.c[this.l].$getSize();if(this.a.height>-1)a[3]=this.a.height,a[2]=
0;if(this.a.width>-1)a[1]=this.a.width,a[0]=0;a[0]&&(a[1]=0);a[2]&&(a[3]=0);return a},$setSize:function(a,b){dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.c[this.l].$setSize(a,b)},isVisible:function(a,b){return b&&b!=this.getActive()?(a&&this.xd(b,a),!1):dhx.ui.view.prototype.isVisible.call(this,a,this.a.id)},getActive:function(){return this.c.length?this.c[this.l].a.id:null},back:function(a){a=a||1;if(this.callEvent("onBeforeBack",[this.getActive(),a])&&this.M.length>a){var b=this.M[this.M.length-
a-1];dhx.ui.get(b).show();return b}return null}},dhx.ui.baselayout,dhx.EventSystem);dhx.html.addMeta=function(a,b){document.getElementsByTagName("head").item(0).appendChild(dhx.html.create("meta",{name:a,content:b}))};
(function(){var a=function(){var a=!!(window.orientation%180);if(dhx.ui.orientation!==a)dhx.ui.orientation=a,dhx.callEvent("onRotate",[a])};dhx.ui.orientation=!!((dhx.isNotDefined(window.orientation)?90:window.orientation)%180);dhx.event(window,"onorientationchange"in window?"orientationchange":"resize",a);dhx.ui.fullScreen=function(){dhx.html.addMeta("apple-mobile-web-app-capable","yes");dhx.html.addMeta("viewport","initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no");if(dhx.env.touch){var b=
document.body.offsetHeight,c=navigator.userAgent.indexOf("iPhone")!=-1,d=c&&(b==356||b==208||b==306||b==158),e=function(){if(c)dhx.ui.orientation?(b=480,e=d?268:300):(b=320,e=d?416:460);else{document.body.style.width=document.body.style.height="1px";document.body.style.overflow="hidden";var a=window.outerWidth/window.innerWidth,b=window.outerWidth/a,e=window.outerHeight/a}document.body.style.height=e+"px";document.body.style.width=b+"px";dhx.ui.yc=!1;dhx.ui.resize();dhx.delay(function(){window.scrollTo(0,
1)})},f=function(){dhx.ui.yc=!0;dhx.env.isSafari?e():dhx.delay(e,null,[],500)};dhx.attachEvent("onClick",function(a){a.target.tagName=="INPUT"||a.target.tagName=="TEXTAREA"||a.target.tagName=="SELECT"||(d&&window.innerHeight<416||!d&&window.innerHeight<window.outerHeight)&&window.scrollTo(0,1)});dhx.attachEvent("onRotate",f);a();dhx.delay(f)}}})();dhx.math={};dhx.math.Ve="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F".split(",");
dhx.math.toHex=function(a,b){for(var a=parseInt(a,10),c="";a>0;)c=this.Ve[a%16]+c,a=Math.floor(a/16);for(;c.length<b;)c="0"+c;return c};dhx.math.toFixed=function(a){return a<10?"0"+a:a};
dhx.i18n={dateFormat:"%d.%m.%Y",timeFormat:"%H:%i",longDateFormat:"%l, %d %F %Y",fullDateFormat:"%d-%m-%Y %H:%i",groupDelimiter:".",groupSize:3,decimalDelimeter:",",decimalSize:2,setLocale:function(){for(var a=["fullDateFormat","timeFormat","dateFormat","longDateFormat"],b=0;b<a.length;b++){var c=a[b];dhx.i18n[c+"Str"]=dhx.Date.dateToStr(dhx.i18n[c]);dhx.i18n[c+"Date"]=dhx.Date.strToDate(dhx.i18n[c])}}};
dhx.Number={format:function(a,b){var b=b||dhx.i18n,a=parseFloat(a),c=a.toFixed(b.decimalSize).toString(),c=c.split("."),d="",e=b.groupSize,f=c[0].length;do{f-=e;var g=f>0?c[0].substr(f,e):c[0].substr(0,e+f),d=g+(d?b.groupDelimiter+d:"")}while(f>0);return d+b.decimalDelimeter+c[1]},numToStr:function(a){return function(b){return dhx.Number.format(b,a)}}};
dhx.Date={Locale:{month_full:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),month_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),day_full:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(",")},weekStart:function(a){var b=a.getDay();this.config.start_on_monday&&(b===0?b=6:b--);return this.date_part(this.add(a,-1*b,"day"))},monthStart:function(a){a.setDate(1);return this.date_part(a)},
yearStart:function(a){a.setMonth(0);return this.month_start(a)},dayStart:function(a){return this.date_part(a)},dateToStr:function(a,b){a=a.replace(/%[a-zA-Z]/g,function(a){switch(a){case "%d":return'"+dhx.math.toFixed(date.getDate())+"';case "%m":return'"+dhx.math.toFixed((date.getMonth()+1))+"';case "%j":return'"+date.getDate()+"';case "%n":return'"+(date.getMonth()+1)+"';case "%y":return'"+dhx.math.toFixed(date.getFullYear()%100)+"';case "%Y":return'"+date.getFullYear()+"';case "%D":return'"+dhx.Date.Locale.day_short[date.getDay()]+"';
case "%l":return'"+dhx.Date.Locale.day_full[date.getDay()]+"';case "%M":return'"+dhx.Date.Locale.month_short[date.getMonth()]+"';case "%F":return'"+dhx.Date.Locale.month_full[date.getMonth()]+"';case "%h":return'"+dhx.math.toFixed((date.getHours()+11)%12+1)+"';case "%g":return'"+((date.getHours()+11)%12+1)+"';case "%G":return'"+date.getHours()+"';case "%H":return'"+dhx.math.toFixed(date.getHours())+"';case "%i":return'"+dhx.math.toFixed(date.getMinutes())+"';case "%a":return'"+(date.getHours()>11?"pm":"am")+"';
case "%A":return'"+(date.getHours()>11?"PM":"AM")+"';case "%s":return'"+dhx.math.toFixed(date.getSeconds())+"';case "%W":return'"+dhx.math.toFixed(dhx.Date.getISOWeek(date))+"';default:return a}});b===!0&&(a=a.replace(/date\.get/g,"date.getUTC"));return new Function("date",'return "'+a+'";')},strToDate:function(a,b){for(var c="var temp=date.split(/[^0-9a-zA-Z]+/g);",d=a.match(/%[a-zA-Z]/g),e=0;e<d.length;e++)switch(d[e]){case "%j":case "%d":c+="set[2]=temp["+e+"]||1;";break;case "%n":case "%m":c+=
"set[1]=(temp["+e+"]||1)-1;";break;case "%y":c+="set[0]=temp["+e+"]*1+(temp["+e+"]>50?1900:2000);";break;case "%g":case "%G":case "%h":case "%H":c+="set[3]=temp["+e+"]||0;";break;case "%i":c+="set[4]=temp["+e+"]||0;";break;case "%Y":c+="set[0]=temp["+e+"]||0;";break;case "%a":case "%A":c+="set[3]=set[3]%12+((temp["+e+"]||'').toLowerCase()=='am'?0:12);";break;case "%s":c+="set[5]=temp["+e+"]||0;"}var f="set[0],set[1],set[2],set[3],set[4],set[5]";b&&(f=" Date.UTC("+f+")");return new Function("date",
"var set=[0,0,1,0,0,0]; "+c+" return new Date("+f+");")},getISOWeek:function(a){if(!a)return!1;var b=a.getDay();b===0&&(b=7);var c=new Date(a.valueOf());c.setDate(a.getDate()+(4-b));var d=c.getFullYear(),e=Math.floor((c.getTime()-(new Date(d,0,1)).getTime())/864E5),f=1+Math.floor(e/7);return f},getUTCISOWeek:function(a){return this.getISOWeek(a)},add:function(a,b,c){var d=new Date(a.valueOf());switch(c){case "day":d.setDate(d.getDate()+b);break;case "week":d.setDate(d.getDate()+7*b);break;case "month":d.setMonth(d.getMonth()+
b);break;case "year":d.setYear(d.getFullYear()+b);break;case "hour":d.setHours(d.getHours()+b);break;case "minute":d.setMinutes(d.getMinutes()+b)}return d},datePart:function(a){var b=this.copy(a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);return b},timePart:function(a){var b=this.copy(a);return(b.valueOf()/1E3-b.getTimezoneOffset()*60)%86400},copy:function(a){return new Date(a.valueOf())}};dhx.i18n.setLocale("en");dhx.format=function(a){a=a||{};this.$init(a)};
dhx.format.prototype={$init:function(a){this.a={};this.a.groupDelimiter=a.groupDelimiter||" ";this.a.groupNumber=a.groupNumber||3;this.a.decimalPoint=a.decimalPoint||",";this.a.fractNumber=a.fractNumber||5;this.a.dateFormat=a.dateFormat||"%Y/%m/%d";this.a.stringTemplate=a.stringTemplate||"{value}";this.ff=dhx.Date.str_to_date(this.a.dateFormat);this.Qd=dhx.Date.date_to_str(this.a.dateFormat)},define:function(a,b){this.a[a]=b},format:function(a,b){b=b||this.formatAutoDefine(a);return this["format__"+
b]?this["format__"+b](a):a},formatAutoDefine:function(a){return typeof a=="number"||a instanceof Number?"number":a instanceof Date?"date":typeof a=="string"||a instanceof String?isNaN(parseFloat(a))?"string":"number":!1},format__number:function(a){var b="";typeof a=="number"||a instanceof Number||(a=parseFloat(a));var c=a.toFixed(this.a.fractNumber).toString(),c=c.split("."),d=this.add_delimiter_to_int(c[0]),e=this.str_reverse(this.add_delimiter_to_int(this.str_reverse(c[1])));return b=d+this.a.decimalPoint+
e},add_delimiter_to_int:function(a){for(var b=0,c="",d=a.length-1;d>=0;d--)c=a[d]+c,b++,b==this.a.groupNumber&&(c=this.a.groupDelimiter+c,b=0);return c},str_reverse:function(a){for(var b="",c=a.length-1;c>=0;c--)b+=a[c];return b},format__date:function(a){var b=this.Qd(a);return b},attachFormat:function(a,b){this["format__"+a]=b},format__string:function(a){var b=this.a.stringTemplate.replace("{value}",a);return b},format__bold:function(a){return typeof a=="string"||a instanceof String?a.bold():a}};
dhx.i18n.setLocale();
dhx.protoUI({name:"calendar",defaults:{date:null,startOnMonday:!0,navigation:!0,weekHeader:!1,weekNumber:!1,timeSelect:!1,skipEmptyWeeks:!0,cellHeight:36,minuteStep:15,hourStart:6,hourEnd:24,hourFormat:"%H",calendarHeader:"%F %Y",calendarDay:"%d",calendarWeekHeader:"W#",calendarWeek:"%W",width:300,height:300,selectedCss:"dhx_cal_selected_day"},skin:{monthHeaderHeight:40,weekHeaderHeight:20,timeSelectHeight:32},hourFormat_setter:dhx.Date.dateToStr,calendarHeader_setter:dhx.Date.dateToStr,calendarDay_setter:dhx.Date.dateToStr,
calendarWeekHeader_setter:dhx.Date.dateToStr,calendarWeek_setter:dhx.Date.dateToStr,date_setter:function(a){typeof a=="string"&&(a=dhx.i18n.fullDateFormatDate(a));this.L=this.L||a;return a},$init:function(){this.fa={};this.ec=[];var a="%Y-%m-%d";this.rc=dhx.Date.dateToStr(a);this.Cd=dhx.Date.strToDate(a)},$getSize:function(){var a=this.a;if(a.cellHeight>0)a.height=this.Xd();return dhx.ui.view.prototype.$getSize.call(this)},cellHeight_setter:function(a){return a=="auto"?0:a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,
a,b)&&this.render()},Ac:function(){var a=this.a;if(!this.L)this.L=new Date;var b=new Date(this.L);b.setDate(1);var c=b.getDay();this.ke=new Date(b);this.vd=a.startOnMonday?1:0;this.lb=(c-this.vd+7)%7;this.Nb=32-(new Date(b.getFullYear(),b.getMonth(),32)).getDate();var d=42-this.lb-this.Nb;this.df=new Date(b.setDate(this.Nb));this.G=a.skipEmptyWeeks?6-Math.floor(d/7):6;this.Ob=this.G*7-this.lb-this.Nb;this.cf=new Date(b.setDate(b.getDate()+d));this.Dc=this.skin.monthHeaderHeight+(a.weekHeader?this.skin.weekHeaderHeight:
0)+(a.timeSelect?this.skin.timeSelectHeight:0)},Xd:function(){this.Ac();return this.Dc+this.G*this.a.cellHeight},Td:function(){this.Ac();var a=this.a;this.Da=[];this.W=[];var b=this.j;b+=1;for(var c=this.m,d=a.weekNumber?8:7,e=0;e<d;e++)this.W[e]=Math.ceil(b/(d-e)),b-=this.W[e];if(a.cellHeight<=0)for(var f=0;f<this.G;f++)this.Da[f]=Math.ceil((c-this.Dc)/(this.G-f)),c-=this.Da[f];else for(var g=0;g<this.G;g++)this.Da[g]=a.cellHeight},selectDate:function(a,b){this.define("date",a);var c=this.a;b&&this.showCalendar(c.date);
var d=c.selectedCss;if(this.fa[this.i])dhx.html.removeCss(this.fa[this.i],d),this.i=null;var e=this.rc(c.date);if(this.fa[e])dhx.html.addCss(this.fa[e],d),this.i=e;c.timeSelect&&this.Ee(a)},Ee:function(a){var b=this.a,c=this.ec,a=a||b.date;c[0].value=Math.min(b.hourEnd,Math.max(a.getHours(),b.hourStart));c[1].value=Math.floor(a.getMinutes()/b.minuteStep)*b.minuteStep},getSelectedDate:function(){var a=this.a;return a.date?new Date(a.date):null},getVisibleDate:function(){return new Date(this.L)},setValue:function(a){this.selectDate(a,
!0)},getValue:function(){return this.getSelectedDate()},showCalendar:function(a){typeof a=="string"&&(a=dhx.i18m.fullDateFormatDate(a));if(!a||!(a.getFullYear()==this.L.getFullYear()&&a.getMonth()==this.L.getMonth())){this.L=a||this.L;this.render();var b=this.getParent();b&&b.resize()}},refresh:function(){this.render()},render:function(){var a=this.a;if(this.isVisible(a.id)){this.callEvent("onBeforeRender",[]);this.Td();var b="<div class='dhx_mini_calendar'><div class='dhx_cal_month'>"+a.calendarHeader(this.L);
a.navigation&&(b+=this.le());b+="</div>";a.weekHeader&&(b+="<div class='dhx_cal_header' style='height:"+this.skin.weekHeaderHeight+"px'>"+this.Xe()+"</div>");b+="<div class='dhx_cal_body'>"+this.Bd()+"</div>";a.timeSelect&&(b+="<div class='dhx_cal_time_select'>"+this.Ue()+"</div>");b+="</div></div>";this.g.innerHTML=b;if(a.timeSelect){for(var c=this.g.getElementsByTagName("select"),d=this.ec,e=0;e<c.length;e++)d[e]=c[e];d[0].onchange=function(){a.date.setHours(this.value)};d[1].onchange=function(){a.date.setMinutes(this.value)}}this.fa=
{};for(var f=this.g.getElementsByTagName("table"),g=f[f.length-1].getElementsByTagName("div"),e=0;e<g.length;e++)this.fa[g[e].getAttribute("date")]=g[e];a.date&&this.selectDate(a.date,!1);this.callEvent("onAfterRender",[])}},Xe:function(){var a=this.a,b="",c=a.startOnMonday?1:0,d=0,e=0;if(a.weekNumber){var e=1,f=a.calendarWeekHeader();b+="<div class='dhx_cal_week_header' style='width: "+(this.W[0]-1)+"px; left: "+d+"px;' >"+f+"</div>";d+=this.W[0]}for(var g=0;g<7;g++){var h=(c+g)%7,i=dhx.Date.Locale.day_short[h],
j="dhx_cal_day_name",k=this.W[g+e]-1;g==6&&(j+=" dhx_cal_day_name_last",k+=1);h===0&&(j+=" dhx_sunday");h==6&&(j+=" dhx_saturday");b+="<div class='"+j+"' style='width: "+k+"px; left: "+d+"px;' >"+i+"</div>";d+=this.W[g+e]}return b},Bd:function(){var a=this.a,b=0,c=dhx.Date.add(this.ke,-this.lb,"day"),c=dhx.Date.datePart(c),d=0,e="";if(a.weekNumber){var d=1,f=dhx.Date.add(c,(this.vd+1)%2,"day");e+='<table class="dhx_week_numbers" cellspacing="0" cellpadding="0" style="float: left;"><tbody>';for(var g=
0;g<this.G;g++){var h=this.Da[g]-2,i=this.W[0]-2,j=a.calendarWeek(f),k="dhx_cal_week_num";if(!a.skipEmptyWeeks&&(g==this.G-1&&this.Ob>=7||g==this.G-2&&this.Ob==14))k="dhx_next_month",j="";g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="<tr><td>";e+="<div class='"+k+"' style='width:"+i+"px; height:"+h+"px; line-height:"+h+"px;' >"+j+"</div>";e+="</td></tr>";f=dhx.Date.add(f,7,"day")}e+="</tbody></table>"}var o=dhx.Date.datePart(new Date);e+='<table cellspacing="0" cellpadding="0"><tbody>';for(var m=
this.G*7-1,g=0;g<this.G;g++){e+="<tr>";for(var l=0;l<7;l++){var n=a.calendarDay(c),p=this.rc(c),k="dhx_cal_day_num";b<this.lb&&(k="dhx_prev_month",p=n="");b>m-this.Ob&&(k="dhx_next_month",p=n="");h=this.Da[g]-2;i=this.W[l+d]-2;l==6&&(k+=" dhx_cal_day_num_rborder",i+=1);g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="<td>";o.valueOf()==c.valueOf()&&(k+=" dhx_cal_current_day");e+="<div class='"+k+"' style='width:"+i+"px; height:"+h+"px; line-height:"+h+"px;' date='"+p+"'>"+n+"</div>";e+="</td>";
c=dhx.Date.add(c,1,"day");b++}e+="</tr>"}e+="</tbody></table>";return e},Ue:function(){for(var a=this.a,b="<select class='dhx_hour_select' onclick=''>",c=a.hourStart,d=a.hourEnd,e=dhx.Date.datePart(new Date),f=c;f<d;f++)e.setHours(f),b+="<option value='"+f+"'>"+a.hourFormat(e)+"</option>";b+="</select>";b+="<select class='dhx_minute_select' onclick=''>";for(var g=0;g<60;g+=a.minuteStep)b+="<option value='"+g+"'>"+dhx.math.toFixed(g)+"</option>";b+="</select>";return b},le:function(){var a="<div class='dhx_cal_arrow dhx_cal_",
b="_button'><div></div></div>";return a+"prev"+b+a+"next"+b},on_click:{dhx_cal_arrow:function(a,b,c){var d=c.className.match(/prev/i)?-1:1,e=new Date(this.L),f=new Date(e);f.setDate(1);f=dhx.Date.add(f,d,"month");this.callEvent("onBeforeMonthChange",[e,f])&&(this.showCalendar(f),this.selectDate(this.a.date,!1),this.callEvent("onAfterMonthChange",[f,e]))},dhx_cal_day_num:function(a,b,c){var d=c.getAttribute("date"),e=this.Cd(d);if(this.a.timeSelect){var f=this.ec;e.setMinutes(f[0].value*60+f[1].value*
1)}this.selectDate(e);this.callEvent("onDateSelect",[e]);this.callEvent("onChange",[e])}}},dhx.MouseEvents,dhx.Settings,dhx.EventSystem,dhx.Movable,dhx.ui.view);dhx.Modality={modal_setter:function(a){if(a){if(!this.qa)this.qa=dhx.html.create("div",{"class":a=="rich"?"dhx_modal_rich":"dhx_modal"}),this.qa.style.zIndex=dhx.ui.zIndex(),this.b.style.zIndex=dhx.ui.zIndex(),document.body.appendChild(this.qa)}else this.qa&&dhx.html.remove(this.qa),this.qa=null;return a}};
dhx.protoUI({name:"window",$init:function(a){this.b.innerHTML="<div class='dhx_win_content'><div class='dhx_win_head'></div><div class='dhx_win_body'></div></div>";this.g=this.b.firstChild;this.eb=this.g.childNodes[0];this.pc=this.g.childNodes[1];this.b.className+=" dhx_window";this.R=this.h=null;this.a.k={top:!1,left:!1,right:!1,bottom:!1};if(!a.id)a.id=dhx.uid()},Zc:function(){this.h={destructor:function(){}}},ac:function(a){this.h.destructor();this.h=a;this.h.D=this;this.pc.appendChild(this.h.b);
this.resize()},show:function(a,b,c){this.a.hidden=!1;this.b.style.zIndex=dhx.ui.zIndex();this.a.modal&&this.modal_setter(!0);var d,e,f;if(a){typeof a=="object"&&!a.tagName?(d={x:a.clientX-this.$[0]/2,y:a.clientY},e=document.body.offsetWidth,f=1):a=dhx.toNode(a);var g=document.body.offsetWidth,h=document.body.offsetHeight;e=e||a.offsetWidth;f=f||a.offsetHeight;var i=this.$;d=d||dhx.html.offset(a);var j=6,k=6,o=6,c="top",m=0,l=0,n=0,p=0;b=="right"?(p=d.x+j+e,k=-f,c="left",m=Math.round(d.y+f/2),l=p-
o):b=="left"?(p=d.x-j-i[0]-1,k=-f,c="right",m=Math.round(d.y+f/2),l=p+i[0]+1):(p=g-d.x>i[0]?d.x:g-j-i[0],l=Math.round(d.x+e/2),l>p+i[0]&&(l=p+i[0]/2));h-f-d.y-k>i[1]?(n=f+d.y+k,m||(c="top",m=n-o)):(n=d.y-k-i[1],n<0?(n=0,c=!1):m||(c="bottom",n--,m=n+i[1]+1));this.setPosition(p,n);c&&this.cd&&this.cd(c,l,m)}this.Le=new Date;this.b.style.display="block";if(this.la){for(var q=0;q<this.la.length;q++)dhx.ui.get(this.la[q]).render();this.la=[];this.Jb={}}this.callEvent("onShow",[])},hidden_setter:function(a){a?
this.hide():this.show();return!!a},hide:function(){!this.a.hidden&&!(new Date-this.Le<100)&&(this.a.modal&&this.modal_setter(!1),this.a.position=="top"?dhx.animate(this.b,{type:"slide",x:0,y:0,duration:300,callback:this.Ec,master:this}):this.Ec())},Ec:function(){this.b.style.display="none";this.a.hidden=!0;this.callEvent("onHide",[])},close:function(){this.define("modal",!1);dhx.html.remove(this.b);this.destructor()},body_setter:function(a){typeof a!="object"&&(a={template:a});this.h=dhx.ui.Oa(a);
this.h.D=this;this.pc.appendChild(this.h.b);return a},head_setter:function(a){if(a===!1)return a;typeof a!="object"&&(a={template:a,css:"dhx_alert_template"});this.R=dhx.ui.Oa(a);this.R.D=this;this.eb.appendChild(this.R.b);return a},getBody:function(){return this.h},getHead:function(){return this.R},resize:function(){var a=this.$getSize();this.$setSize(a[1]||this.a.width,a[3]||this.a.height);this.cc(this.a.left,this.a.top)},cc:function(a,b){if(this.a.position){var c=Math.round((document.body.offsetWidth-
this.a.width)/2),d=Math.round((document.body.offsetHeight-this.a.height)/2);this.a.position=="top"&&(d=dhx.animate.isSupported()?-1*this.a.height:10);this.setPosition(c,d);this.a.position=="top"&&dhx.animate(this.b,{type:"slide",x:0,y:this.a.height,duration:300})}else this.setPosition(a,b)},setPosition:function(a,b){this.b.style.top=b+"px";this.b.style.left=a+"px";this.a.left=a;this.a.top=b},$getSize:function(){var a=this.h.$getSize();if(this.R){var b=this.R.$getSize();if(b[3])this.a.headHeight=b[3]}if(a[3])a[3]+=
this.a.head!==!1?this.a.headHeight:0,this.a.height=a[3];if(a[1])this.a.width=a[1];if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j,b=this.m,this.a.head===!1?(this.eb.style.display="none",this.h.$setSize(a,b)):(this.R.$setSize(a,this.a.headHeight),this.h.$setSize(a,b-this.a.headHeight))},defaults:{headHeight:43,width:300,height:200,top:100,left:100,body:"",head:""}},dhx.ui.view,
dhx.Movable,dhx.Modality,dhx.EventSystem);
dhx.protoUI({name:"popup",$init:function(){this.a.head=!1;dhx.event(this.g,"click",dhx.bind(this.Id,this));dhx.attachEvent("onClick",dhx.bind(this.Ha,this));this.attachEvent("onHide",this.Fc)},Id:function(){this.Me=new Date},Ha:function(){new Date-(this.Me||0)>250&&this.hide()},$getSize:function(){var a=this.h.$getSize();if(a[3])this.a.height=a[3]+this.a.padding*2;if(a[1])this.a.width=a[1]+this.a.padding*2;if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)},
$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j-this.a.padding*2,b=this.m-this.a.padding*2,this.g.style.padding=this.a.padding+"px",this.eb.style.display="none",this.h.$setSize(a,b)},body_setter:function(a){a=dhx.ui.window.prototype.body_setter.call(this,a);this.h.a.k={top:!1,left:!1,right:!1,bottom:!1};return a},defaults:{padding:8},head_setter:null,cd:function(a,b,c){this.Fc();document.body.appendChild(this.Ka=dhx.html.create("DIV",{"class":"dhx_point_"+a},""));
this.Ka.style.zIndex=dhx.ui.zIndex();this.Ka.style.top=c+"px";this.Ka.style.left=b+"px"},Fc:function(){this.Ka=dhx.html.remove(this.Ka)}},dhx.ui.window);
dhx.protoUI({name:"alert",defaults:{position:"center",head:{template:"Info",css:"dhx_alert_template"},height:170,modal:!0,callback:null,body:{type:"clean",rows:[{template:"<div class='dhx_alert_text'>#text#</div>",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:"<div class='dhx_alert_text'>#text#</div>",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<a.length;c++){var d=a[c].id,e=a[c].operation;if(this.a.store.exists(d))a[c].data=this.a.store.item(d);this.callEvent("onBefore"+e,[d,a[c].data])&&b.push(a[c])}b.length&&this.callEvent("onBeforeDataSend",[b])&&this.Fe(this.a.url,this.We(b),this.a.mode)}},
We:function(a){for(var b={},c=[],d=0;d<a.length;d++){var e=a[d];c.push(e.id);b[e.id+"_!nativeeditor_status"]=e.operation;for(var f in e.data)f.indexOf("$")!==0&&(b[e.id+"_"+f]=e.data[f])}b.ids=c.join(",");return b},Fe:function(a,b,c){if(typeof a=="function")return a(b);a+=a.indexOf("?")==-1?"?":"&";a+="editing=true";dhx.ajax()[c](a,b,dhx.bind(this.ye,this))},ye:function(a,b,c){this.callEvent("onBeforeSync",[f,a,b,c]);for(var d=dhx.DataDriver.xml,b=d.toObject(a,d),e=d.xpath(b,"//action"),f=[],g=0;g<
e.length;g++){var h=d.tagToObject(e[g]);f.push(h);for(var i=-1,j=0;j<this.V.length;){this.V[j].id==h.sid&&(i=j);break}if(!(h.type=="error"||h.type=="invalid")||this.callEvent("onDBError",[h,this.V[i]]))i>=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;g<f.length;g++)e[f[g]]=parseInt(d[g],10);return e}},Wa:function(a,c,d,e,f){if(a===
d)return a;var g=Math.abs(a-d),h=g/(a-d);if(a>0)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<a.config.scrollDelay?(a.I.wb=a.I.wb/1.3+a.w.x-a.ca.x,a.I.xb=a.I.xb/1.3+a.w.y-a.ca.y):a.I.xb=a.I.wb=0,a.I.Na=a.I.Na/1.3+(a.w.time-a.ca.time);return a.I},Jc:function(b){var c=a.A.target;if(dhx.env.touch||dhx.env.transition||dhx.env.transform)for(;c&&c.tagName!="BODY";){if(c.getAttribute){var d=c.getAttribute("touch_scroll");if(d&&(!b||d.indexOf(b)!=-1)){a.H=d;a.v=c;a.n={dx:c.offsetWidth,dy:c.offsetHeight,px:c.parentNode.offsetWidth,py:c.parentNode.offsetHeight};
break}}c=c.parentNode}},ya:function(b){dhx.callEvent(b,[a.A,a.w]);var c=a.Cc(b);c&&c.callEvent(b,[a.A,a.w])},Cc:function(b){var c=dhx.ui.get(a.A);if(!c)return null;for(;c;){if(c.hasEvent&&c.hasEvent(b))return c;c=c.getParent()}return null},bb:function(b){if(!b.touches[0]){var c=a.w;c.time=new Date;return c}return{target:b.target,x:b.touches[0].pageX,y:b.touches[0].pageY,time:new Date}},Wd:function(a){return{target:a.target,x:a.pageX,y:a.pageY,time:new Date}}};dhx.TouchEvents={$init:function(){this.attachEvent("onSwipeX",
this.Se);this.attachEvent("onBeforeSelect",this.unSwipe);this.attachEvent("onAfterDelete",this.unSwipe)},Se:function(a){var c=this.locate(a);c&&c!=this.ea&&(this.unSwipe(),this.swipe(c))},swipe:function(a){this.ea=a;this.item(this.ea).$template="Swipe";this.refresh(this.ea)},unSwipe:function(){if(this.ea){var a=this.item(this.ea);if(a)a.$template="",this.refresh(this.ea);this.ea=null}}};dhx.ready(function(){a.$init()})})();
dhx.protoUI({name:"googlemap",$init:function(a){if(!a.id)a.id=dhx.uid();this.b.innerHTML="<div class='dhx_map_content' style='width:100%;height:100%'></div>";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()<a.valueOf()}};scheduler.xy={confirm_height:231,confirm_width:250,scale_width:45,scale_height:15,list_tab:54,day_tab:54,month_tab:68,icon_today:72,icon_save:100,icon_cancel:100,icon_edit:100,icon_back:100,list_height:42,month_list_height:42};
scheduler.templates={selected_event:function(a){var b="";if(!a.start_date)return b;b+="<div class='selected_event'>";b+="<div class='event_title'>"+a.text+"</div>";if(dhx.Date.datePart(a.start_date).valueOf()==dhx.Date.datePart(a.end_date).valueOf()){var c=dhx.i18n.dateFormatStr(a.start_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="<div class='event_text'>"+c+"</div>";b+="<div class='event_text'>"+scheduler.locale.labels.label_from+" "+d+" "+scheduler.locale.labels.label_to+
" "+e+"</div>"}else{var f=dhx.i18n.longDateFormatStr(a.start_date),g=dhx.i18n.longDateFormatStr(a.end_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="<div class='event_text'>"+scheduler.locale.labels.label_from+" "+d+" "+f+"</div>";b+="<div class='event_text'>"+scheduler.locale.labels.label_to+" "+e+" "+g+"</div>"}a.details&&a.details!==""&&(b+="<div class='event_title'>"+scheduler.locale.labels.label_details+"</div>",b+="<div class='event_text'>"+a.details+"</div>");
b+="</div>";return b},calendar_event:function(a){return a+"<div class='day_with_events'></div>"},event_date:function(a){return dhx.i18n.dateFormatStr(a)},event_long_date:function(a){return dhx.i18n.longDateFormatStr(a)},event_time:function(a){return dhx.i18n.timeFormatStr(a)},event_color:function(a){return a.color?"background-color:"+a.color:""},event_marker:function(a,b){return"<div class='dhx_event_marker' style='"+b.color(a)+"'></div>"},event_title:function(a,b){return"<div class='dhx_day_title'>"+
b.dateStart(a.start_date)+"</div><div style='margin:10px'><div class='dhx_event_time'>"+b.timeStart(a.start_date)+"</div>"+b.marker(a,b)+"<div class='dhx_event_text'>"+a.text+"</div></div>"},month_event_title:function(a,b){return b.marker(a,b)+"<div class='dhx_event_time'>"+b.timeStart(a.start_date)+"</div><div class='dhx_event_text'>"+a.text+"</div>"},day_event:function(a){return a.text}};scheduler.config.views=[];
dhx.ready(function(){if(scheduler.locale&&scheduler.locale.date)dhx.Date.Locale=scheduler.locale.date;if(!scheduler.config.form)scheduler.config.form=[{view:"text",label:scheduler.locale.labels.label_event,name:"text"},{view:"datepicker",label:scheduler.locale.labels.label_start,name:"start_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"datepicker",label:scheduler.locale.labels.label_end,name:"end_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"textarea",label:scheduler.locale.labels.label_details,
name:"details",width:300,height:150},{view:"button",label:scheduler.locale.labels.icon_delete,id:"delete",type:"form",css:"delete"}];if(!scheduler.config.bottom_toolbar)scheduler.config.bottom_toolbar=[{view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today,align:"left",width:scheduler.xy.icon_today+6},{view:"segmented",id:"buttons",selected:"list",align:"center",multiview:!0,options:[{value:"list",label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab},
{value:"day",label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab},{value:"month",label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab}]},{view:"button",css:"add",id:"add",align:"right",label:"",inputWidth:42,width:50},{view:"label",label:"",inputWidth:42,width:50,batch:"readonly"}];if(!scheduler.config.day_toolbar)scheduler.config.day_toolbar=[{view:"label",id:"prev",align:"left",label:"<div class='dhx_cal_prev_button'><div></div></div>"},{view:"label",id:"date",align:"center",
width:200},{view:"label",id:"next",align:"right",label:"<div class='dhx_cal_next_button'><div></div></div>"}];if(!scheduler.config.selected_toolbar)scheduler.config.selected_toolbar=[{view:"button",inputWidth:scheduler.xy.icon_back,type:"prev",id:"back",align:"left",label:scheduler.locale.labels.icon_back},{view:"button",inputWidth:scheduler.xy.icon_edit,id:"edit",align:"right",label:scheduler.locale.labels.icon_edit}];if(!scheduler.config.form_toolbar)scheduler.config.form_toolbar=[{view:"button",
inputWidth:scheduler.xy.icon_cancel,id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel},{view:"button",inputWidth:scheduler.xy.icon_save,id:"save",align:"right",label:scheduler.locale.labels.icon_save}];scheduler.types={event_list:{name:"EventsList",css:"events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.list_height,width:"auto",dateStart:scheduler.templates.event_date,timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,
template:scheduler.templates.event_title},day_event_list:{name:"DayEventsList",css:"day_events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.month_list_height,width:"auto",timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,template:scheduler.templates.month_event_title}};dhx.Type(dhx.ui.list,scheduler.types.event_list);dhx.Type(dhx.ui.list,scheduler.types.day_event_list);dhx.DataDriver.scheduler={records:"/*/event"};dhx.extend(dhx.DataDriver.scheduler,
dhx.DataDriver.xml);var a=[{id:"list",view:"list",type:"EventsList",startDate:new Date},{id:"day",rows:[{id:"dayBar",view:"toolbar",css:"dhx_topbar",elements:scheduler.config.day_toolbar},{id:"dayList",view:"dayevents"}]},{id:"month",rows:[{id:"calendar",view:"calendar",dayWithEvents:scheduler.templates.calendar_event,calendarHeader:scheduler.config.calendar_date},{id:"calendarDayEvents",view:"list",type:"DayEventsList"}]},{id:"event",animate:{type:"slide",subtype:"in",direction:"top"},rows:[{id:"eventBar",
view:"toolbar",type:"TopBar",css:"single_event",elements:scheduler.config.selected_toolbar},{id:"eventTemplate",view:"template",template:scheduler.templates.selected_event}]},{id:"form",rows:[{id:"editBar",view:"toolbar",type:"TopBar",elements:scheduler.config.form_toolbar},{id:"editForm",view:"form",elements:scheduler.config.form,rules:scheduler.config.form_rules}]}].concat(scheduler.config.views);dhx.protoUI({name:"scheduler",defaults:{rows:[{view:"multiview",id:"views",cells:a},{view:"toolbar",
id:"bottomBar",type:"SchedulerBar",visibleBatch:"default",elements:scheduler.config.bottom_toolbar}],color:"#color#",textColor:"#textColor#"},$init:function(){this.name="Scheduler";this.b.className+=" dhx_scheduler";dhx.i18n.dateFormat=scheduler.config.item_date;dhx.i18n.timeFormat=scheduler.config.hour_date;dhx.i18n.fullDateFormat=scheduler.config.xml_date;dhx.i18n.headerFormatStr=dhx.Date.dateToStr(scheduler.config.header_date);dhx.i18n.setLocale();this.data.provideApi(this);this.data.extraParser=
dhx.bind(function(a){a.start_date=dhx.i18n.fullDateFormatDate(a.start_date);a.end_date=dhx.i18n.fullDateFormatDate(a.end_date)},this);this.$ready.push(this.$d);this.data.attachEvent("onStoreUpdated",dhx.bind(this.Oe,this))},$d:function(){this.ae();this.de();this.coreData=new dhx.DataValue;this.coreData.setValue(scheduler.config.init_date);this.$$("dayList").define("date",this.coreData);this.selectedEvent=new dhx.DataRecord;this.config.readonly?this.define("readonly",this.config.readonly):scheduler.config.readonly&&
this.define("readonly",!0);if(this.config.save){var a=new dhx.DataProcessor({master:this,url:this.config.save});a.attachEvent("onBeforeDataSend",this.re)}this.$$("date")&&this.$$("date").bind(this.coreData,null,dhx.i18n.headerFormatStr);this.$$("list").sync(this);this.$$("list").bind(this.coreData,function(a,b){return b<a.end_date});this.$$("dayList").sync(this,!0);this.$$("dayList").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return e<a.end_date&&dhx.Date.add(e,1,"day")>a.start_date});
this.$$("calendar").bind(this.coreData);this.$$("calendarDayEvents").sync(this,!0);this.$$("calendarDayEvents").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return e<a.end_date&&dhx.Date.add(e,1,"day")>a.start_date});this.$$("eventTemplate").bind(this);this.$$("editForm").bind(this);this.$$("list").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("dayList").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("calendarDayEvents").attachEvent("onItemClick",dhx.bind(this.Qb,
this))},Qb:function(a){this.setCursor(a);this.$$("event").show()},Oe:function(){this.data.blockEvent();this.data.sort(function(a,b){return a.start_date<b.start_date?1:-1});this.data.unblockEvent();this.Gb={};for(var a=this.data.getRange(),c=0;c<a.length;c++)this.He(a[c])},He:function(a){var c=dhx.Date.datePart(a.start_date),d=dhx.Date.datePart(a.end_date);for(a.end_date.valueOf()!=d.valueOf()&&(d=dhx.Date.add(d,1,"day"));c<d;)this.Gb[c.valueOf()]=!0,c=dhx.Date.add(c,1,"day")},de:function(){this.$$("calendar").attachEvent("onDateSelect",
dhx.bind(function(a){this.setDate(a)},this));this.$$("calendar").attachEvent("onAfterMonthChange",dhx.bind(function(a){var b=new Date;a.getMonth()===b.getMonth()&&a.getYear()===b.getYear()?a=b:a.setDate(1);this.setDate(a)},this));var a=this.$$("calendar").config.calendarDay;this.$$("calendar").config.calendarDay=dhx.bind(function(c){var d=a(c);return this.Gb&&this.Gb[c.valueOf()]?this.$$("calendar").config.dayWithEvents(d):d},this)},setDate:function(a,c,d){a||(a=this.coreData.getValue());c&&(a=dhx.Date.add(a,
c,d));this.coreData.setValue(a)},ae:function(){this.attachEvent("onItemClick",function(a){var c=this.innerId(a);switch(c){case "today":this.setDate(new Date);break;case "add":if(this.innerId(this.$$("views").getActive())=="form"){var d=this;dhx.confirm({height:scheduler.xy.confirm_height,width:scheduler.xy.confirm_width,title:scheduler.locale.labels.icon_close,message:scheduler.locale.labels.confirm_closing,callback:function(a){a&&d.jc()},labelOk:scheduler.locale.labels.icon_yes,labelCancel:scheduler.locale.labels.icon_no,
css:"confirm"})}else this.jc();break;case "prev":this.setDate(null,-1,"day");break;case "next":this.setDate(null,1,"day");break;case "edit":this.$$("delete")&&this.$$("delete").show();this.define("editEvent",!0);this.$$("form").show();break;case "back":this.$$("views").back();break;case "cancel":this.callEvent("onAfterCursorChange",[this.getCursor()]);this.$$("views").back();break;case "save":if(this.$$("editForm").validate()){if(this.a.editEvent)this.$$("editForm").save();else{var e=this.$$("editForm").getValues();
e.id=dhx.uid();this.add(e);this.setCursor(e.id)}dhx.dp(this).save();this.setDate();this.$$("views").back()}break;case "delete":this.Rd()}});this.attachEvent("onAfterTabClick",function(a,c){this.$$(c).show()});this.attachEvent("onBeforeTabClick",function(a,c){return this.Jd(c)})},readonly_setter:function(a){this.$$("add")&&(a?(this.$$("bottomBar").showBatch("readonly"),this.$$("add").hide(),this.$$("edit").hide()):(this.$$("bottomBar").showBatch("default"),this.$$("add").show(),this.$$("edit").show()));
return a},$e:function(){this.dataCount()?this.b.className=this.b.className.replace(RegExp(this.type.cssNoEvents,"g"),""):this.b.className+=" "+this.type.cssNoEvents},Rd:function(){var a=this;dhx.confirm({height:scheduler.xy.confirm_height,width:scheduler.xy.confirm_width,title:scheduler.locale.labels.icon_delete,message:scheduler.locale.labels.confirm_deleting,callback:function(c){c&&(a.remove(a.getCursor()),a.$$("views").back(2))},labelOk:scheduler.locale.labels.icon_yes,labelCancel:scheduler.locale.labels.icon_no,
css:"confirm",header:!1})},jc:function(){this.$$("delete")&&this.$$("delete").hide();this.define("editEvent",!1);this.$$("form").show();var a=dhx.Date.add(new Date,1,"hour"),c=new Date(a.setMinutes(0)),d=dhx.Date.add(c,1,"hour");this.$$("editForm").clear();this.$$("editForm").setValues({start_date:c,end_date:d})},Jd:function(a){if(this.innerId(this.$$("views").getActive())=="form"){var c=this;a!="today"&&dhx.confirm({height:scheduler.xy.confirm_height,width:scheduler.xy.confirm_width,title:scheduler.locale.labels.icon_close,
message:scheduler.locale.labels.confirm_closing,callback:function(d){d&&(c.$$(a).show(),c.$$("buttons").setValue(a))},labelOk:scheduler.locale.labels.icon_yes,labelCancel:scheduler.locale.labels.icon_no,css:"confirm"});return!1}return!0},re:function(a){var c=a[0].data=dhx.copy(a[0].data);c.start_date=dhx.i18n.fullDateFormatStr(c.start_date);c.end_date=dhx.i18n.fullDateFormatStr(c.end_date)}},dhx.IdSpace,dhx.DataLoader,dhx.ui.layout,dhx.EventSystem,dhx.Settings)});
dhx.protoUI({name:"dayevents",defaults:{hourFormat:"%H",hourClock:12,firstHour:0,lastHour:24,timeScaleWidth:45,timeScaleHeight:30,scroll:!0,scaleBorder:1,eventOffset:5,width:"auto",date:new Date},$init:function(a){this.name="DayEvents";this.d.style.position="relative";this.data.provideApi(this,!0);this.data.attachEvent("onStoreUpdated",dhx.bind(this.render,this));this.attachEvent("onBeforeRender",function(){this.Be();this.type.color=this.config.color;this.type.textColor=this.config.textColor;this.De=
this.d.firstChild;this.we();if(window.scheduler)this.type.template=scheduler.templates.day_event});if(window.scheduler)a.hourFormat=scheduler.config.scale_hour,a.timeScaleWidth=scheduler.xy.scale_width,a.timeScaleHeight=scheduler.xy.scale_height*2},Be:function(){for(var a="<div></div>",b=this.config.firstHour;b<this.config.lastHour;b++)a+=this.hourScaleItem(b);this.d.innerHTML=a},ma:"dhx_l_id",on_click:{},hourScaleItem:function(a){var b=scheduler.config.hour_date.toLowerCase().indexOf("a")!=-1,c=
"00",d="30";b&&(a===0&&(c="AM"),a==12&&(c="PM"),a=(a+11)%12+1);this.config.hourFormat.indexOf("H")!=-1&&(a=dhx.math.toFixed(a));var e="",f=this.config.timeScaleWidth,g=this.config.timeScaleHeight,h=Math.floor(this.config.timeScaleWidth/2),i=Math.floor(g/2),j=i-this.config.scaleBorder,k=this.j-this.config.scaleBorder-this.config.timeScaleWidth;e+="<div style='width: 100%; height:"+g+"px;' class='dhx_dayevents_scale_item'>";e+="<div class='dhx_dayevents_scale_hour' style='width:"+h+"px; height:"+g+
"px;line-height:"+g+"px;'>"+a+"</div>";e+="<div class='dhx_dayevents_scale_minute' style='width:"+h+"px'>";e+="<div class='dhx_dayevents_scale_top' style='width:"+h+"px;line-height:"+i+"px'>"+c+"</div>";e+="<div class='dhx_dayevents_scale_bottom' style='width:"+h+"px;line-height:"+j+"px'>"+d+"</div>";e+="</div>";e+="<div class='dhx_dayevents_scale_event' style='width:"+k+"px'>";e+="<div class='dhx_dayevents_scale_top' style='height:"+i+"px;width:"+k+"px'></div>";e+="<div class='dhx_dayevents_scale_bottom' style='width: "+
k+"px;height:"+j+"px; '></div>";e+="</div>";e+="</div>";return e},type:{templateStart:dhx.Template("<div dhx_l_id='#id#' class='dhx_dayevents_event_item {common.templateCss()}' style='left:#$left#px;top:#$top#px;width:#$width#px;height:#$height#px;padding:{common.padding}px;overflow:hidden; background-color:{common.templateColor()} ;color:{common.templateTextColor()};'>"),template:scheduler.templates.day_event,templateEnd:dhx.Template("</div>"),templateCss:dhx.Template(""),templateColor:dhx.Template("#color#"),
templateTextColor:dhx.Template("#textColor#"),padding:2},we:function(){var a=this.data.getRange(),b=[],c,d,e,f,g;for(d=0;d<a.length;d++){c=a[d];for(c.$inner=!1;b.length&&b[b.length-1].end_date.valueOf()<=c.start_date.valueOf();)b.splice(b.length-1,1);g=!1;for(e=0;e<b.length;e++)if(b[e].end_date.valueOf()<=c.start_date.valueOf()){g=!0;c.$sorder=b[e].$sorder;b.splice(e,1);c.$inner=!0;break}if(b.length)b[b.length-1].$inner=!0;if(!g)if(b.length)if(b.length<=b[b.length-1].$sorder){if(b[b.length-1].$sorder)for(e=
0;e<b.length;e++){g=!1;for(f=0;f<b.length;f++)if(b[f].$sorder==e){g=!0;break}if(!g){c.$sorder=e;break}}else c.$sorder=0;c.$inner=!0}else{g=b[0].$sorder;for(e=1;e<b.length;e++)if(b[e].$sorder>g)g=b[e].$sorder;c.$sorder=g+1;c.$inner=!1}else c.$sorder=0;b.push(c);if(b.length>(b.max_count||0))b.max_count=b.length}for(d=0;d<a.length;d++)a[d].$count=b.max_count,this.cc(a[d])},cc:function(a){var b=this.config.date.getValue?this.config.date.getValue():this.config.date,c=dhx.Date.copy(a.start_date),d=dhx.Date.copy(a.end_date),
e=c.getHours(),f=d.getHours();dhx.Date.datePart(c).valueOf()>dhx.Date.datePart(d).valueOf()&&(d=c);dhx.Date.datePart(c).valueOf()<dhx.Date.datePart(b).valueOf()&&(c=dhx.Date.datePart(b));dhx.Date.datePart(d).valueOf()>dhx.Date.datePart(b).valueOf()&&(d=dhx.Date.datePart(b),d.setMinutes(0),d.setHours(this.config.lastHour));if(e<this.config.firstHour||f>=this.config.lastHour)e<this.config.firstHour&&(d.setHours(this.config.firstHour),a.start_date.setMinutes(0)),f>=this.config.lastHour&&(d.setMinutes(0),
d.setHours(this.config.lastHour));var g=Math.floor((this.j-this.config.timeScaleWidth-this.config.eventOffset-8)/a.$count);a.$left=a.$sorder*g+this.config.timeScaleWidth+this.config.eventOffset;a.$inner||(g*=a.$count-a.$sorder);a.$width=g-this.config.eventOffset-this.type.padding*2;var h=c.getHours()*60+c.getMinutes(),i=d.getHours()*60+d.getMinutes()||this.config.lastHour*60;a.$top=Math.round((h-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60);a.$height=Math.max(10,(i-h)*(this.config.timeScaleHeight+
1)/60-2)-this.type.padding*2}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings);

View File

@ -1,9 +1,6 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.attachEvent("onTemplatesReady",function(){var B=scheduler.date.str_to_date(scheduler.config.api_date);var C=scheduler.date.date_to_str(scheduler.config.api_date);var D=scheduler.templates.month_day;scheduler.templates.month_day=function(E){return"<a jump_to='"+C(E)+"' href='#'>"+D(E)+"</a>"};var A=scheduler.templates.week_scale_date;scheduler.templates.week_scale_date=function(E){return"<a jump_to='"+C(E)+"' href='#'>"+A(E)+"</a>"};dhtmlxEvent(this._obj,"click",function(E){var G=E.target||event.srcElement;var F=G.getAttribute("jump_to");if(F){scheduler.setCurrentView(B(F),"day")}})});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.attachEvent("onTemplatesReady",function(){var d=scheduler.date.str_to_date(scheduler.config.api_date),b=scheduler.date.date_to_str(scheduler.config.api_date),e=scheduler.templates.month_day;scheduler.templates.month_day=function(a){return"<a jump_to='"+b(a)+"' href='#'>"+e(a)+"</a>"};var f=scheduler.templates.week_scale_date;scheduler.templates.week_scale_date=function(a){return"<a jump_to='"+b(a)+"' href='#'>"+f(a)+"</a>"};dhtmlxEvent(this._obj,"click",function(a){var b=a.target||event.srcElement,
c=b.getAttribute("jump_to");if(c)return scheduler.setCurrentView(d(c),"day"),a&&a.preventDefault&&a.preventDefault(),!1})});

View File

@ -1,9 +1,10 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.date.add_agenda=function(A){return(new Date(A.valueOf()))};scheduler.dblclick_dhx_agenda_area=function(){if(!this.config.readonly&&this.config.dblclick_create){this.addEventNow()}};scheduler.templates.agenda_time=function(C,A,B){if(B._timed){return this.day_date(B.start_date,B.end_date,B)+" "+this.event_date(C)}else{return scheduler.templates.day_date(C)+" &ndash; "+scheduler.templates.day_date(A)}};scheduler.templates.agenda_text=function(A){return A.text};scheduler.date.agenda_start=function(A){return A};scheduler.attachEvent("onTemplatesReady",function(){scheduler.attachEvent("onSchedulerResize",function(){if(this._mode=="agenda"){this.agenda_view(true);return false}return true});var A=scheduler.render_data;scheduler.render_data=function(D){if(this._mode=="agenda"){B()}else{return A.apply(this,arguments)}};function C(E){if(E){var D=scheduler.locale.labels;scheduler._els.dhx_cal_header[0].innerHTML="<div class='dhx_agenda_line'><div>"+D.date+"</div><span style='padding-left:25px'>"+D.description+"</span></div>";scheduler._table_view=true;scheduler.set_sizes()}}function B(){var D=scheduler._date;var H=scheduler.get_visible_events();H.sort(function(J,I){return J.start_date>I.start_date?1:-1});var G="<div class='dhx_agenda_area'>";for(var F=0;F<H.length;F++){G+="<div class='dhx_agenda_line' event_id='"+H[F].id+"' style='"+(H[F]._text_style||"")+"'><div>"+scheduler.templates.agenda_time(H[F].start_date,H[F].end_date,H[F])+"</div>";G+="<div class='dhx_event_icon icon_details'>&nbsp</div>";G+="<span>"+scheduler.templates.agenda_text(H[F])+"</span></div>"}G+="<div class='dhx_v_border'></div></div>";scheduler._els.dhx_cal_data[0].scrollTop=0;scheduler._els.dhx_cal_data[0].innerHTML=G;var E=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML="";scheduler._rendered=[];for(var F=0;F<E.length-1;F++){scheduler._rendered[F]=E[F]}}scheduler.agenda_view=function(D){scheduler._min_date=scheduler.config.agenda_start||(new Date());scheduler._max_date=scheduler.config.agenda_end||(new Date(9999,1,1));scheduler._table_view=true;C(D);if(D){B()}else{}}});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.date.add_agenda=function(b){return new Date(b.valueOf())};scheduler.dblclick_dhx_agenda_area=function(){!this.config.readonly&&this.config.dblclick_create&&this.addEventNow()};scheduler.templates.agenda_time=function(b,d,a){return a._timed?this.day_date(a.start_date,a.end_date,a)+" "+this.event_date(b):scheduler.templates.day_date(b)+" &ndash; "+scheduler.templates.day_date(d)};scheduler.templates.agenda_text=function(b,d,a){return a.text};scheduler.date.agenda_start=function(b){return b};
scheduler.attachEvent("onTemplatesReady",function(){function b(b){if(b){var a=scheduler.locale.labels;scheduler._els.dhx_cal_header[0].innerHTML="<div class='dhx_agenda_line'><div>"+a.date+"</div><span style='padding-left:25px'>"+a.description+"</span></div>";scheduler._table_view=!0;scheduler.set_sizes()}}function d(){var b=scheduler._date,a=scheduler.get_visible_events();a.sort(function(a,b){return a.start_date>b.start_date?1:-1});for(var d="<div class='dhx_agenda_area'>",e=0;e<a.length;e++){var c=
a[e],f=c.color?"background-color:"+c.color+";":"",h=c.textColor?"color:"+c.textColor+";":"";d+="<div class='dhx_agenda_line' event_id='"+c.id+"' style='"+h+""+f+""+(c._text_style||"")+"'><div>"+scheduler.templates.agenda_time(c.start_date,c.end_date,c)+"</div>";d+="<div class='dhx_event_icon icon_details'>&nbsp</div>";d+="<span>"+scheduler.templates.agenda_text(c.start_date,c.end_date,c)+"</span></div>"}d+="<div class='dhx_v_border'></div></div>";scheduler._els.dhx_cal_data[0].innerHTML=d;scheduler._els.dhx_cal_data[0].childNodes[0].scrollTop=
scheduler._agendaScrollTop||0;var g=scheduler._els.dhx_cal_data[0].firstChild.childNodes;scheduler._els.dhx_cal_date[0].innerHTML="";scheduler._rendered=[];for(e=0;e<g.length-1;e++)scheduler._rendered[e]=g[e]}scheduler.attachEvent("onSchedulerResize",function(){return this._mode=="agenda"?(this.agenda_view(!0),!1):!0});var a=scheduler.render_data;scheduler.render_data=function(b){if(this._mode=="agenda")d();else return a.apply(this,arguments)};var f=scheduler.render_view_data;scheduler.render_view_data=
function(){this._mode=="agenda"?(scheduler._agendaScrollTop=scheduler._els.dhx_cal_data[0].childNodes[0].scrollTop,scheduler._els.dhx_cal_data[0].childNodes[0].scrollTop=0,scheduler._els.dhx_cal_data[0].style.overflowY="hidden"):scheduler._els.dhx_cal_data[0].style.overflowY="auto";return f.apply(this,arguments)};scheduler.agenda_view=function(a){scheduler._min_date=scheduler.config.agenda_start||new Date;scheduler._max_date=scheduler.config.agenda_end||new Date(9999,1,1);scheduler._table_view=!0;
b(a);a&&d()}});

View File

@ -1 +1,8 @@
(function(){var C,D;var B;scheduler.config.collision_limit=1;scheduler.attachEvent("onBeforeDrag",function(I){var H=scheduler._props?scheduler._props[this._mode]:null;var F=scheduler.matrix?scheduler.matrix[this._mode]:null;var G=H||F;if(H){var E=G.map_to}if(F){var E=G.y_property}if((G)&&I){C=this.getEvent(I)[E];D=this.getEvent(I).start_date}return true});scheduler.attachEvent("onBeforeLightbox",function(F){var E=scheduler.getEvent(F);B=[E.start_date,E.end_date];return true});scheduler.attachEvent("onEventChanged",function(F){if(!F){return true}var E=scheduler.getEvent(F);if(!A(E)){if(!B){return false}E.start_date=B[0];E.end_date=B[1];E._timed=this.is_one_day_event(E)}return true});scheduler.attachEvent("onBeforeEventChanged",function(E,F,G){return A(E)});scheduler.attachEvent("onEventSave",function(F,E){if(E.rec_type){scheduler._roll_back_dates(E)}return A(E)});function A(N){var Q=[];if(N.rec_type){var F=scheduler.getRecDates(N);for(var I=0;I<F.length;I++){var M=scheduler.getEvents(F[I].start_date,F[I].end_date);for(var J=0;J<M.length;J++){if((M[J].event_pid||M[J].id)!=N.id){Q.push(M[J])}}}Q.push(N)}else{Q=scheduler.getEvents(N.start_date,N.end_date)}var E=scheduler._props?scheduler._props[scheduler._mode]:null;var O=scheduler.matrix?scheduler.matrix[scheduler._mode]:null;var H=E||O;if(E){var G=H.map_to}if(O){var G=H.y_property}var P=true;if(H){var L=0;for(var K=0;K<Q.length;K++){if(Q[K][G]==N[G]){L++}}if(L>scheduler.config.collision_limit){scheduler._drag_event.start_date=D;N[G]=C;P=false}}else{if(Q.length>scheduler.config.collision_limit){P=false}}if(!P){return !scheduler.callEvent("onEventCollision",[N,Q])}return P}})();
/*
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
*/
(function(){function h(a){var b=scheduler._props?scheduler._props[scheduler._mode]:null,f=scheduler.matrix?scheduler.matrix[scheduler._mode]:null,c=b||f;if(b)var d=c.map_to;if(f)d=c.y_property;c&&a&&(n=scheduler.getEvent(a)[d])}function g(a){var b=[];if(a.rec_type){for(var f=scheduler.getRecDates(a),c=0;c<f.length;c++)for(var d=scheduler.getEvents(f[c].start_date,f[c].end_date),i=0;i<d.length;i++)(d[i].event_pid||d[i].id)!=a.id&&b.push(d[i]);b.push(a)}else b=scheduler.getEvents(a.start_date,a.end_date);
var e=scheduler._props?scheduler._props[scheduler._mode]:null,g=scheduler.matrix?scheduler.matrix[scheduler._mode]:null,m=e||g;if(e)var j=m.map_to;if(g)j=m.y_property;var k=!0;if(m){for(var h=0,l=0;l<b.length;l++)b[l][j]==a[j]&&b[l].id!=a.id&&h++;h>=scheduler.config.collision_limit&&(a[j]=n,k=!1)}else b.length>scheduler.config.collision_limit&&(k=!1);return!k?!scheduler.callEvent("onEventCollision",[a,b]):k}var n,e;scheduler.config.collision_limit=1;scheduler.attachEvent("onBeforeDrag",function(a){h(a);
return!0});scheduler.attachEvent("onBeforeLightbox",function(a){var b=scheduler.getEvent(a);e=[b.start_date,b.end_date];h(a);return!0});scheduler.attachEvent("onEventChanged",function(a){if(!a)return!0;var b=scheduler.getEvent(a);if(!g(b)){if(!e)return!1;b.start_date=e[0];b.end_date=e[1];b._timed=this.is_one_day_event(b)}return!0});scheduler.attachEvent("onBeforeEventChanged",function(a){return g(a)});scheduler.attachEvent("onEventSave",function(a,b){return b.rec_type?(scheduler._roll_back_dates(b),
g(b)):!0})})();

View File

@ -1,9 +1,6 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
(function(){function B(E,D,F){var G=E+"="+F+(D?("; "+D):"");document.cookie=G}function A(E){var F=E+"=";if(document.cookie.length>0){var G=document.cookie.indexOf(F);if(G!=-1){G+=F.length;var D=document.cookie.indexOf(";",G);if(D==-1){D=document.cookie.length}return document.cookie.substring(G,D)}}return""}var C=true;scheduler.attachEvent("onBeforeViewChange",function(F,E,D,I){if(C){C=false;var G=A("scheduler_settings");if(G){G=G.split("@");G[0]=this.templates.xml_date(G[0]);this.setCurrentView(G[0],G[1]);return false}}var H=this.templates.xml_format(I||E)+"@"+(D||F);B("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",H);return true})})();
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
(function(){function g(e,b,a){var c=e+"="+a+(b?"; "+b:"");document.cookie=c}function h(e){var b=e+"=";if(document.cookie.length>0){var a=document.cookie.indexOf(b);if(a!=-1){a+=b.length;var c=document.cookie.indexOf(";",a);if(c==-1)c=document.cookie.length;return document.cookie.substring(a,c)}}return""}var f=!0;scheduler.attachEvent("onBeforeViewChange",function(e,b,a,c){if(f){f=!1;var d=h("scheduler_settings");if(d)return d=d.split("@"),d[0]=this.templates.xml_date(d[0]),this.setCurrentView(d[0],
d[1]),!1}var i=this.templates.xml_format(c||b)+"@"+(a||e);g("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",i);return!0})})();

View File

@ -1,9 +1,10 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.form_blocks.combo={render:function(B){var A="";A+="<div class='"+B.type+"' style='height:"+(B.height||20)+"px;' ></div>";return A},set_value:function(F,H,E,C){if(F._combo){F._combo.destructor()}window.dhx_globalImgPath=C.image_path||"/";F._combo=new dhtmlXCombo(F,C.name,F.offsetWidth-8);F._combo.enableFilteringMode(!!C.filtering,C.script_path||null,!!C.cache);if(!C.script_path){var G=[];for(var D=0;D<C.options.length;D++){var A=[];A.push(C.options[D].key);A.push(C.options[D].label);G.push(A)}F._combo.addOption(G);if(E[C.map_to]){var B=F._combo.getIndexByValue(E[C.map_to]);F._combo.selectOption(B)}}else{F._combo.setComboValue(E[C.map_to]||null)}},get_value:function(D,C,A){var B=D._combo.getSelectedValue();return B},focus:function(A){}};scheduler.form_blocks.radio={render:function(C){var B="";B+="<div class='"+C.type+"' style='height:"+C.height+"px;' >";for(var A=0;A<C.options.length;A++){var D=scheduler.uid();B+="<input id='"+D+"' type='radio' name='"+C.name+"' value='"+C.options[A].key+"'><label for='"+D+"'> "+C.options[A].label+"</label>";if(C.vertical){B+="<br/>"}}B+="</div>";return B},set_value:function(D,F,C,A){var E=D.getElementsByTagName("input");for(var B=0;B<E.length;B++){E[B].checked=false;if(E[B].value==C[A.map_to]){E[B].checked=true}}},get_value:function(D,C,A){var E=D.getElementsByTagName("input");for(var B=0;B<E.length;B++){if(E[B].checked){return E[B].value}}},focus:function(A){}};scheduler.form_blocks.checkbox={render:function(A){return""},set_value:function(C,D,B,A){var F=scheduler.uid();var E=false;if(typeof A.checked_value!="undefined"&&B[A.map_to]==A.checked_value){E=true}C.previousSibling.className+=" dhx_cal_checkbox";C.previousSibling.innerHTML="<input id='"+F+"' type='checkbox' value='true' name='"+A.name+"'"+((E)?"checked='true'":"")+"'><label for='"+F+"'>"+(scheduler.locale.labels["section_"+A.name]||A.name)+"</label>"},get_value:function(C,B,A){var D=C.previousSibling.getElementsByTagName("input")[0];return(D.checked)?(A.checked_value||true):(A.unchecked_value||false)},focus:function(A){}};
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.form_blocks.combo={render:function(a){var d="";d+="<div class='"+a.type+"' style='height:"+(a.height||20)+"px;' ></div>";return d},set_value:function(a,d,c,b){a._combo&&a._combo.destructor();window.dhx_globalImgPath=b.image_path||"/";a._combo=new dhtmlXCombo(a,b.name,a.offsetWidth-8);a._combo.enableFilteringMode(!!b.filtering,b.script_path||null,!!b.cache);if(b.script_path)a._combo.setComboValue(c[b.map_to]||null);else{for(var f=[],e=0;e<b.options.length;e++){var g=[];g.push(b.options[e].key);
g.push(b.options[e].label);f.push(g)}a._combo.addOption(f);if(c[b.map_to]){var h=a._combo.getIndexByValue(c[b.map_to]);a._combo.selectOption(h)}}},get_value:function(a){var d=a._combo.getSelectedValue();return d},focus:function(){}};
scheduler.form_blocks.radio={render:function(a){var d="";d+="<div class='dhx_cal_ltext dhx_cal_radio' style='height:"+a.height+"px;' >";for(var c=0;c<a.options.length;c++){var b=scheduler.uid();d+="<input id='"+b+"' type='radio' name='"+a.name+"' value='"+a.options[c].key+"'><label for='"+b+"'> "+a.options[c].label+"</label>";a.vertical&&(d+="<br/>")}d+="</div>";return d},set_value:function(a,d,c,b){for(var f=a.getElementsByTagName("input"),e=0;e<f.length;e++)if(f[e].checked=!1,f[e].value==c[b.map_to])f[e].checked=
!0},get_value:function(a){for(var d=a.getElementsByTagName("input"),c=0;c<d.length;c++)if(d[c].checked)return d[c].value},focus:function(){}};
scheduler.form_blocks.checkbox={render:function(){return scheduler.config.wide_form?'<div class="dhx_cal_wide_checkbox"></div>':""},set_value:function(a,d,c,b){var a=document.getElementById(b.id),f=scheduler.uid(),e=!1;typeof b.checked_value!="undefined"&&c[b.map_to]==b.checked_value&&(e=!0);a.className+=" dhx_cal_checkbox";var g="<input id='"+f+"' type='checkbox' value='true' name='"+b.name+"'"+(e?"checked='true'":"")+"'>",h="<label for='"+f+"'>"+(scheduler.locale.labels["section_"+b.name]||b.name)+
"</label>";scheduler.config.wide_form?(a.innerHTML=h,a.nextSibling.innerHTML=g):a.innerHTML=g+h},get_value:function(a,d,c){var a=document.getElementById(c.id),b=a.getElementsByTagName("input")[0];b||(b=a.nextSibling.getElementsByTagName("input")[0]);return b.checked?c.checked_value||!0:c.unchecked_value||!1},focus:function(){}};

View File

@ -1,9 +1,8 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.expand=function(){var A=scheduler._obj;do{A._position=A.style.position||"";A.style.position="static"}while((A=A.parentNode)&&A.style);A=scheduler._obj;A.style.position="absolute";A._width=A.style.width;A._height=A.style.height;A.style.width=A.style.height="100%";A.style.top=A.style.left="0px";var B=document.body;B.scrollTop=0;B=B.parentNode;if(B){B.scrollTop=0}document.body._overflow=document.body.style.overflow||"";document.body.style.overflow="hidden";scheduler._maximize()};scheduler.collapse=function(){var A=scheduler._obj;do{A.style.position=A._position}while((A=A.parentNode)&&A.style);A=scheduler._obj;A.style.width=A._width;A.style.height=A._height;document.body.style.overflow=document.body._overflow;scheduler._maximize()};scheduler.attachEvent("onTemplatesReady",function(){var A=document.createElement("DIV");A.className="dhx_expand_icon";scheduler.toggleIcon=A;scheduler._obj.appendChild(A);A.onclick=function(){if(!scheduler.expanded){scheduler.expand()}else{scheduler.collapse()}}});scheduler._maximize=function(){this.expanded=!this.expanded;this.toggleIcon.style.backgroundPosition="0px "+(this._expand?"0":"18")+"px";if(scheduler.callEvent("onSchedulerResize",[])){scheduler.update_view()}};
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.expand=function(){var a=scheduler._obj;do a._position=a.style.position||"",a.style.position="static";while((a=a.parentNode)&&a.style);a=scheduler._obj;a.style.position="absolute";a._width=a.style.width;a._height=a.style.height;a.style.width=a.style.height="100%";a.style.top=a.style.left="0px";var b=document.body;b.scrollTop=0;if(b=b.parentNode)b.scrollTop=0;document.body._overflow=document.body.style.overflow||"";document.body.style.overflow="hidden";scheduler._maximize()};
scheduler.collapse=function(){var a=scheduler._obj;do a.style.position=a._position;while((a=a.parentNode)&&a.style);a=scheduler._obj;a.style.width=a._width;a.style.height=a._height;document.body.style.overflow=document.body._overflow;scheduler._maximize()};scheduler.attachEvent("onTemplatesReady",function(){var a=document.createElement("DIV");a.className="dhx_expand_icon";scheduler.toggleIcon=a;scheduler._obj.appendChild(a);a.onclick=function(){scheduler.expanded?scheduler.collapse():scheduler.expand()}});
scheduler._maximize=function(){this.expanded=!this.expanded;this.toggleIcon.style.backgroundPosition="0px "+(this.expanded?"0":"18")+"px";for(var a=["left","top"],b=0;b<a.length;b++){var d=scheduler.xy["margin_"+a[b]],c=scheduler["_prev_margin_"+a[b]];scheduler.xy["margin_"+a[b]]?(scheduler["_prev_margin_"+a[b]]=scheduler.xy["margin_"+a[b]],scheduler.xy["margin_"+a[b]]=0):c&&(scheduler.xy["margin_"+a[b]]=scheduler["_prev_margin_"+a[b]],delete scheduler["_prev_margin_"+a[b]])}scheduler.callEvent("onSchedulerResize",
[])&&scheduler.update_view()};

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,5 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.attachEvent("onTemplatesReady",function(){var B=document.body.getElementsByTagName("DIV");for(var A=0;A<B.length;A++){var C=B[A].className||"";C=C.split(":");if(C.length==2&&C[0]=="template"){var D='return "'+(B[A].innerHTML||"").replace(/\"/g,'\\"').replace(/[\n\r]+/g,"")+'";';D=unescape(D).replace(/\{event\.([a-z]+)\}/g,function(F,E){return'"+ev.'+E+'+"'});scheduler.templates[C[1]]=Function("start","end","ev",D);B[A].style.display="none"}}});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.attachEvent("onTemplatesReady",function(){for(var c=document.body.getElementsByTagName("DIV"),b=0;b<c.length;b++){var a=c[b].className||"",a=a.split(":");if(a.length==2&&a[0]=="template"){var d='return "'+(c[b].innerHTML||"").replace(/\"/g,'\\"').replace(/[\n\r]+/g,"")+'";',d=unescape(d).replace(/\{event\.([a-z]+)\}/g,function(b,a){return'"+ev.'+a+'+"'});scheduler.templates[a[1]]=Function("start","end","ev",d);c[b].style.display="none"}}});

View File

@ -1,9 +1,6 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
(function(){var A=false;scheduler.attachEvent("onBeforeLightbox",function(){A=true;return true});scheduler.attachEvent("onAfterLightbox",function(){A=false;return true});dhtmlxEvent(document,(_isOpera?"keypress":"keydown"),function(D){D=D||event;if(!A){if(D.keyCode==37||D.keyCode==39){D.cancelBubble=true;var B=scheduler.date.add(scheduler._date,(D.keyCode==37?-1:1),scheduler._mode);scheduler.setCurrentView(B);return true}else{if(D.ctrlKey&&D.keyCode==67){scheduler._copy_id=scheduler._select_id}else{if(D.ctrlKey&&D.keyCode==86){var C=scheduler.getEvent(scheduler._copy_id);if(C){var E=scheduler._copy_event(C);E.id=scheduler.uid();scheduler.addEvent(E)}}}}}})})();
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
(function(){var b=!1;scheduler.attachEvent("onBeforeLightbox",function(){return b=!0});scheduler.attachEvent("onAfterLightbox",function(){b=!1;return!0});dhtmlxEvent(document,_isOpera?"keypress":"keydown",function(a){a=a||event;if(!b)if(a.keyCode==37||a.keyCode==39){a.cancelBubble=!0;var e=scheduler.date.add(scheduler._date,a.keyCode==37?-1:1,scheduler._mode);scheduler.setCurrentView(e);return!0}else if(a.ctrlKey&&a.keyCode==67)scheduler._copy_id=scheduler._select_id;else if(a.ctrlKey&&a.keyCode==
86){var c=scheduler.getEvent(scheduler._copy_id);if(c){var d=scheduler._copy_event(c);d.id=scheduler.uid();scheduler.addEvent(d)}}})})();

View File

@ -1,9 +1,12 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.config.limit_start=new Date(-3999,0,0);scheduler.config.limit_end=new Date(3999,0,0);scheduler.config.limit_view=false;(function(){var B=null;scheduler.attachEvent("onBeforeViewChange",function(E,D,C,F){F=F||D;C=C||E;if(scheduler.config.limit_view){if(F.valueOf()>scheduler.config.limit_end.valueOf()||this.date.add(F,1,C)<=scheduler.config.limit_start.valueOf()){setTimeout(function(){scheduler.setCurrentView(scheduler._date,C)},1);return false}}return true});var A=function(D){var E=scheduler.config;var C=(D.start_date.valueOf()>=E.limit_start.valueOf()&&D.end_date.valueOf()<=E.limit_end.valueOf());if(!C){scheduler._drag_id=null;scheduler._drag_mode=null;scheduler.callEvent("onLimitViolation",[D.id,D])}return C};scheduler.attachEvent("onBeforeDrag",function(C){if(!C){return true}return A(scheduler.getEvent(C))});scheduler.attachEvent("onClick",function(D,C){return A(scheduler.getEvent(D))});scheduler.attachEvent("onBeforeLightbox",function(D){var C=scheduler.getEvent(D);B=[C.start_date,C.end_date];return A(C)});scheduler.attachEvent("onEventAdded",function(D){if(!D){return true}var C=scheduler.getEvent(D);if(!A(C)){if(C.start_date<scheduler.config.limit_start){C.start_date=new Date(scheduler.config.limit_start)}if(C.end_date>scheduler.config.limit_end){C.end_date=new Date(scheduler.config.limit_end);C._timed=this.is_one_day_event(C)}if(C.start_date>C.end_date){C.end_date=this.date.add(C.start_date,(this.config.event_duration||this.config.time_step),"minute")}}return true});scheduler.attachEvent("onEventChanged",function(D){if(!D){return true}var C=scheduler.getEvent(D);if(!A(C)){if(!B){return false}C.start_date=B[0];C.end_date=B[1];C._timed=this.is_one_day_event(C)}return true});scheduler.attachEvent("onBeforeEventChanged",function(D,C,E){return A(D)})})();
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.config.limit_start=new Date(-3999,0,0);scheduler.config.limit_end=new Date(3999,0,0);scheduler.config.limit_view=!1;
(function(){var g=null,k={},l={},m=!1;scheduler.blockTime=function(b,a){var c=this.config.first_hour*60,d=this.config.last_hour*60;a=="fullday"&&(a=[c,d]);typeof b=="object"?k[this.date.date_part(b).valueOf()]=a:l[b]=a;for(var e=0;e<a.length;e+=2)a[e]<c&&(a[e]=c),a[e+1]>d&&(a[e+1]=d);m=!0};scheduler.attachEvent("onScaleAdd",function(b,a){var c=k[a.valueOf()]||l[a.getDay()];if(c)for(var d=0;d<c.length;d+=2){var e=c[d],f=c[d+1],h=document.createElement("DIV");h.className="dhx_time_block";var j;h.style.top=
Math.round((e*6E4-this.config.first_hour*36E5)*this.config.hour_size_px/36E5)%(this.config.hour_size_px*24)+"px";h.style.height=Math.round((f-e-1)*6E4*this.config.hour_size_px/36E5)%(this.config.hour_size_px*24)+"px";b.appendChild(h)}});scheduler.attachEvent("onBeforeViewChange",function(b,a,c,d){d=d||a;c=c||b;return scheduler.config.limit_view&&(d.valueOf()>scheduler.config.limit_end.valueOf()||this.date.add(d,1,c)<=scheduler.config.limit_start.valueOf())?(setTimeout(function(){scheduler.setCurrentView(scheduler._date,
c)},1),!1):!0});var f=function(b){var a=scheduler.config,c=b.start_date.valueOf()>=a.limit_start.valueOf()&&b.end_date.valueOf()<=a.limit_end.valueOf();if(c&&m&&b._timed){var d=scheduler.date.date_part(new Date(b.start_date.valueOf())),e=k[d.valueOf()]||l[d.getDay()],f=b.start_date.getHours()*60+b.start_date.getMinutes(),h=b.end_date.getHours()*60+b.end_date.getMinutes();if(e)for(var j=0;j<e.length;j+=2){var g=e[j],i=e[j+1];if(g<h&&i>f){if(f<=i&&f>=g){if(i==1440||h<i){c=!1;break}if(scheduler._drag_id&&
scheduler._drag_mode=="new-size")b.start_date.setHours(0),b.start_date.setMinutes(i);else{c=!1;break}}if(h>=g&&h<i)if(scheduler._drag_id&&scheduler._drag_mode=="new-size")b.end_date.setHours(0),b.end_date.setMinutes(g);else{c=!1;break}}}}if(!c)scheduler._drag_id=null,scheduler._drag_mode=null,scheduler.callEvent("onLimitViolation",[b.id,b]);return c};scheduler.attachEvent("onBeforeDrag",function(b){return!b?!0:f(scheduler.getEvent(b))});scheduler.attachEvent("onClick",function(b){return f(scheduler.getEvent(b))});
scheduler.attachEvent("onBeforeLightbox",function(b){var a=scheduler.getEvent(b);g=[a.start_date,a.end_date];return f(a)});scheduler.attachEvent("onEventAdded",function(b){if(!b)return!0;var a=scheduler.getEvent(b);if(!f(a)){if(a.start_date<scheduler.config.limit_start)a.start_date=new Date(scheduler.config.limit_start);if(a.start_date.valueOf()>=scheduler.config.limit_end.valueOf())a.start_date=this.date.add(scheduler.config.limit_end,-1,"day");if(a.end_date<scheduler.config.limit_start)a.end_date=
new Date(scheduler.config.limit_start);if(a.end_date.valueOf()>=scheduler.config.limit_end.valueOf())a.end_date=this.date.add(scheduler.config.limit_end,-1,"day");if(a.start_date.valueOf()>=a.end_date.valueOf())a.end_date=this.date.add(a.start_date,this.config.event_duration||this.config.time_step,"minute");a._timed=this.is_one_day_event(a)}return!0});scheduler.attachEvent("onEventChanged",function(b){if(!b)return!0;var a=scheduler.getEvent(b);if(!f(a)){if(!g)return!1;a.start_date=g[0];a.end_date=
g[1];a._timed=this.is_one_day_event(a)}return!0});scheduler.attachEvent("onBeforeEventChanged",function(b){return f(b)})})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,7 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.form_blocks.multiselect={render:function(C){var B="<div class='dhx_multi_select_"+C.name+"' style='overflow: auto; height: "+C.height+"px; position: relative;' >";for(var A=0;A<C.options.length;A++){B+="<label><input type='checkbox' value='"+C.options[A].key+"'/>"+C.options[A].label+"</label>";if(convertStringToBoolean(C.vertical)){B+="<br/>"}}B+="</div>";return B},set_value:function(C,J,I,A){var E=C.getElementsByTagName("input");for(var G=0;G<E.length;G++){E[G].checked=false}function H(M){var L=C.getElementsByTagName("input");for(var K=0;K<L.length;K++){L[K].checked=!!M[L[K].value]}}if(!scheduler._new_event){var D=[];if(I[A.map_to]){var F=I[A.map_to].split(",");for(var G=0;G<F.length;G++){D[F[G]]=true}H(D)}else{var B=document.createElement("div");B.className="dhx_loading";B.style.cssText="position: absolute; top: 40%; left: 40%;";C.appendChild(B);dhtmlxAjax.get(A.script_url+"?dhx_crosslink_"+A.map_to+"="+I.id+"&uid="+scheduler.uid(),function(K){var M=K.doXPath("//data/item");var N=[];for(var L=0;L<M.length;L++){N[M[L].getAttribute(A.map_to)]=true}H(N);C.removeChild(B)})}}},get_value:function(F,E,A){var C=[];var D=F.getElementsByTagName("input");for(var B=0;B<D.length;B++){if(D[B].checked){C.push(D[B].value)}}return C.join(",")},focus:function(A){}};
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.form_blocks.multiselect={render:function(d){for(var a="<div class='dhx_multi_select_"+d.name+"' style='overflow: auto; height: "+d.height+"px; position: relative;' >",b=0;b<d.options.length;b++)a+="<label><input type='checkbox' value='"+d.options[b].key+"'/>"+d.options[b].label+"</label>",convertStringToBoolean(d.vertical)&&(a+="<br/>");a+="</div>";return a},set_value:function(d,a,b,c){function h(b){for(var c=d.getElementsByTagName("input"),a=0;a<c.length;a++)c[a].checked=!!b[c[a].value]}
for(var f=d.getElementsByTagName("input"),e=0;e<f.length;e++)f[e].checked=!1;if(!scheduler._new_event)if(f=[],b[c.map_to]){for(var i=b[c.map_to].split(","),e=0;e<i.length;e++)f[i[e]]=!0;h(f)}else{var g=document.createElement("div");g.className="dhx_loading";g.style.cssText="position: absolute; top: 40%; left: 40%;";d.appendChild(g);dhtmlxAjax.get(c.script_url+"?dhx_crosslink_"+c.map_to+"="+b.id+"&uid="+scheduler.uid(),function(b){for(var a=b.doXPath("//data/item"),e=[],f=0;f<a.length;f++)e[a[f].getAttribute(c.map_to)]=
!0;h(e);d.removeChild(g)})}},get_value:function(d){for(var a=[],b=d.getElementsByTagName("input"),c=0;c<b.length;c++)b[c].checked&&a.push(b[c].value);return a.join(",")},focus:function(){}};

View File

@ -1,9 +1,5 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
(function(){function B(D){var C=function(){};C.prototype=D;return C}var A=scheduler._load;scheduler._load=function(C,F){C=C||this._load_url;if(typeof C=="object"){var E=B(this._loaded);for(var D=0;D<C.length;D++){this._loaded=new E();A.call(this,C[D],F)}}else{A.apply(this,arguments)}}})();
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
(function(){function e(a){var b=function(){};b.prototype=a;return b}var d=scheduler._load;scheduler._load=function(a,b){a=a||this._load_url;if(typeof a=="object")for(var f=e(this._loaded),c=0;c<a.length;c++)this._loaded=new f,d.call(this,a[c],b);else d.apply(this,arguments)}})();

View File

@ -0,0 +1,9 @@
/*
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
*/
scheduler._extra_xle=!1;scheduler.attachEvent("onXLE",function(){if(!scheduler._extra_xle){var a=!1,c;for(c in scheduler._events)if(scheduler._events[c].text){a=!0;break}if((localStorage._updated_events||!a)&&localStorage._events){scheduler._extra_xle=!0;scheduler.parse(localStorage._events,"json");scheduler._extra_xle=!1;var b=scheduler._dataprocessor,e=JSON.parse(localStorage._updated_events);b.setUpdateMode("off");for(var d in e)b.setUpdated(d,!0,e[d]);b.sendData();b.setUpdateMode("cell")}}});
scheduler.attachEvent("onBeforeEventDelete",function(a){var c=scheduler._dataprocessor.getState(a);if(c=="inserted"&&localStorage._updated_events){var b=JSON.parse(localStorage._updated_events);delete b[a];for(a in b){localStorage._updated_events=JSON.stringify(b);break}}return!0});var old_delete_event=scheduler.deleteEvent;scheduler.deleteEvent=function(a,c){old_delete_event.apply(this,arguments);localStorage._events=scheduler.toJSON()};scheduler._offline={};
scheduler._offline._after_update_events=[];var old_dp_init=scheduler._dp_init;
scheduler._dp_init=function(a){old_dp_init.apply(this,arguments);a.attachEvent("onAfterUpdate",function(c){scheduler._offline._after_update_events.push(c);return!0});a.attachEvent("onAfterUpdateFinish",function(){localStorage._events=scheduler.toJSON();for(var c=JSON.parse(localStorage._updated_events),b=0;b<scheduler._offline._after_update_events.length;b++)delete c[scheduler._offline._after_update_events[b]];var a=!1,d;for(d in c){a=!0;break}a?(localStorage._updated_events=JSON.stringify(c),scheduler._offline._after_update_event=
[]):delete localStorage._updated_events;return!0});a.attachEvent("onBeforeDataSending",function(a,b,e){var d={};localStorage._updated_events&&(d=JSON.parse(localStorage._updated_events));for(var f in e){var g=scheduler._dataprocessor.action_param;if(d[f]&&(d[f][g]=="inserted"||e[f][g]=="deleted")||!d[f])d[f]=e[f][g]}localStorage._events=scheduler.toJSON();localStorage._updated_events=JSON.stringify(d);return!0});dhtmlxError.catchError("LoadXML",function(){for(var a in scheduler._dataprocessor._in_progress)delete scheduler._dataprocessor._in_progress[a]})};

View File

@ -1,9 +1,6 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.attachEvent("onTemplatesReady",function(){var C=(new dhtmlDragAndDropObject());var B=C.stopDrag;var A;C.stopDrag=function(D){A=D||event;return B.apply(this,arguments)};C.addDragLanding(scheduler._els.dhx_cal_data[0],{_drag:function(F,G,D){var E=scheduler.attachEvent("onEventCreated",function(I,H){if(!scheduler.callEvent("onExternalDragIn",[I,F,H])){this._drag_mode=this._drag_id=null;this.deleteEvent(I)}});if(scheduler.matrix[scheduler._mode]){scheduler.dblclick_dhx_matrix_cell(A)}else{scheduler._on_dbl_click(A)}scheduler.detachEvent(E)},_dragIn:function(E,D){return E},_dragOut:function(D){return this}})});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.attachEvent("onTemplatesReady",function(){var a=new dhtmlDragAndDropObject,g=a.stopDrag,b;a.stopDrag=function(d){b=d||event;return g.apply(this,arguments)};a.addDragLanding(scheduler._els.dhx_cal_data[0],{_drag:function(d){var a=scheduler.attachEvent("onEventCreated",function(a,b){if(!scheduler.callEvent("onExternalDragIn",[a,d,b]))this._drag_mode=this._drag_id=null,this.deleteEvent(a)});if(scheduler.matrix&&scheduler.matrix[scheduler._mode])scheduler.dblclick_dhx_matrix_cell(b);else{var f=
document.createElement("div");f.className="dhx_month_body";var c={},e;for(e in b)c[e]=b[e];c.target=c.srcElement=f;scheduler._on_dbl_click(c)}scheduler.detachEvent(a)},_dragIn:function(a){return a},_dragOut:function(){return this}})});

View File

@ -1,9 +1,14 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.toPDF=function(C,J,P,L){var I=0;var H=0;var F=false;if(J=="fullcolor"){F=true;J="color"}J=J||"color";function M(T){T=parseFloat(T);if(isNaN(T)){return"auto"}return 100*T/I}function Q(T){T=parseFloat(T);if(isNaN(T)){return"auto"}return 100*T/H}function O(U){var T="";for(var V=0;V<U.length;V++){T+="\n<column><![CDATA["+U[V].innerHTML+"]]></column>"}I=U[0].offsetWidth;return T}function G(V,W){var T=parseInt(V.style.left);for(var U=0;U<scheduler._cols.length;U++){T-=scheduler._cols[U];if(T<0){return U}}return W}function N(U,W){var V=parseInt(U.style.top);for(var T=0;T<scheduler._colsS.heights.length;T++){if(scheduler._colsS.heights[T]>V){return T}}return W}function A(W){var U="";var X=W.firstChild.rows;for(var V=0;V<X.length;V++){var Y=[];for(var T=0;T<X[V].cells.length;T++){Y.push(X[V].cells[T].firstChild.innerHTML)}U+="\n<row height='"+W.firstChild.rows[V].cells[0].offsetHeight+"'><![CDATA["+Y.join("|")+"]]></row>";H=W.firstChild.rows[0].cells[0].offsetHeight}return U}function S(X){var U="<data profile='"+X+"'";if(P){U+=" header='"+P+"'"}if(L){U+=" footer='"+L+"'"}U+=">";U+="<scale mode='"+scheduler._mode+"' today='"+scheduler._els.dhx_cal_date[0].innerHTML+"'>";if(scheduler._mode=="agenda"){var T=scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;U+="<column>"+T[0].innerHTML+"</column><column>"+T[1].innerHTML+"</column>"}else{if(scheduler._mode=="year"){var T=scheduler._els.dhx_cal_data[0].childNodes;for(var V=0;V<T.length;V++){U+="<month label='"+T[V].childNodes[0].innerHTML+"'>";U+=O(T[V].childNodes[1].childNodes);U+=A(T[V].childNodes[2]);U+="</month>"}}else{U+="<x>";var T=scheduler._els.dhx_cal_header[0].childNodes;U+=O(T);U+="</x>";var W=scheduler._els.dhx_cal_data[0];if(W.firstChild.tagName=="TABLE"){U+=A(W)}else{W=W.childNodes[W.childNodes.length-1];while(W.className.indexOf("dhx_scale_holder")==-1){W=W.previousSibling}W=W.childNodes;U+="<y>";for(var V=0;V<W.length;V++){U+="\n<row><![CDATA["+W[V].innerHTML+"]]></row>"}U+="</y>";H=W[0].offsetHeight}}}U+="</scale>";return U}function E(U,T){return(window.getComputedStyle?(window.getComputedStyle(U,null)[T]):(U.currentStyle?U.currentStyle[T]:null))||""}function B(){var b="";var j=scheduler._rendered;if(scheduler._mode=="agenda"){for(var Z=0;Z<j.length;Z++){b+="<event><head>"+j[Z].childNodes[0].innerHTML+"</head><body>"+j[Z].childNodes[2].innerHTML+"</body></event>"}}else{if(scheduler._mode=="year"){var j=scheduler.get_visible_events();for(var Z=0;Z<j.length;Z++){var f=j[Z].start_date;if(f.valueOf()<scheduler._min_date.valueOf()){f=scheduler._min_date}while(f<j[Z].end_date){var U=f.getMonth()+12*(f.getFullYear()-scheduler._min_date.getFullYear())-scheduler.week_starts._month;var g=scheduler.week_starts[U]+f.getDate()-1;b+="<event day='"+(g%7)+"' week='"+Math.floor(g/7)+"' month='"+U+"'></event>";scheduler._mark_year_date(f);f=scheduler.date.add(f,1,"day");if(f.valueOf()>=scheduler._max_date.valueOf()){break}}}}else{for(var Z=0;Z<j.length;Z++){var X=M(j[Z].style.left);var V=Q(j[Z].style.top);var e=M(j[Z].style.width);var a=Q(j[Z].style.height);var Y=j[Z].className.split(" ")[0].replace("dhx_cal_","");var c=scheduler.getEvent(j[Z].getAttribute("event_id"));var g=c._sday;var T=c._sweek;if(scheduler._mode!="month"){if(parseInt(j[Z].style.left)<=26){X=2;e+=M(j[Z].style.left)-1}if(j[Z].parentNode==scheduler._els.dhx_cal_data[0]){continue}X+=M(j[Z].parentNode.style.left);X-=M(51)}else{a=parseInt(j[Z].offsetHeight);V=parseInt(j[Z].style.top)-22;g=G(j[Z],g);T=N(j[Z],T)}b+="\n<event week='"+T+"' day='"+g+"' type='"+Y+"' x='"+X+"' y='"+V+"' width='"+e+"' height='"+a+"'>";if(Y=="event"){b+="<header><![CDATA["+j[Z].childNodes[1].innerHTML+"]]></header>";var W=F?E(j[Z].childNodes[2],"color"):"";var h=F?E(j[Z].childNodes[2],"backgroundColor"):"";b+="<body backgroundColor='"+h+"' color='"+W+"'><![CDATA["+j[Z].childNodes[2].innerHTML+"]]></body>"}else{var W=F?E(j[Z],"color"):"";var h=F?E(j[Z],"backgroundColor"):"";b+="<body backgroundColor='"+h+"' color='"+W+"'><![CDATA["+j[Z].innerHTML+"]]></body>"}b+="</event>"}}}return b}function K(){var T="</data>";return T}var D=(new Date()).valueOf();var R=document.createElement("div");R.style.display="none";document.body.appendChild(R);R.innerHTML='<form id="'+D+'" method="post" target="_blank" action="'+C+'" accept-charset="utf-8" enctype="text/html"><input type="hidden" name="mycoolxmlbody"/> </form>';document.getElementById(D).firstChild.value=S(J).replace("\u2013","-")+B()+K();document.getElementById(D).submit();R.parentNode.removeChild(R);grid=null};
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.toPDF=function(x,f,m,n){function g(c){return c.replace(html_regexp,"")}function j(c){c=parseFloat(c);return isNaN(c)?"auto":100*c/(o+1)}function t(c){c=parseFloat(c);return isNaN(c)?"auto":100*c/k}function q(c){var a="";if(scheduler.matrix&&scheduler.matrix[scheduler._mode])c=c[0].childNodes;for(var b=0;b<c.length;b++)a+="\n<column><![CDATA["+g(c[b].innerHTML)+"]]\></column>";o=c[0].offsetWidth;return a}function y(c,a){for(var b=parseInt(c.style.left),d=0;d<scheduler._cols.length;d++)if(b-=
scheduler._cols[d],b<0)return d;return a}function z(c,a){for(var b=parseInt(c.style.top),d=0;d<scheduler._colsS.heights.length;d++)if(scheduler._colsS.heights[d]>b)return d;return a}function w(c){for(var a="",b=c.firstChild.rows,d=0;d<b.length;d++){for(var e=[],h=0;h<b[d].cells.length;h++)e.push(b[d].cells[h].firstChild.innerHTML);a+="\n<row height='"+c.firstChild.rows[d].cells[0].offsetHeight+"'><![CDATA["+g(e.join("|"))+"]]\></row>";k=c.firstChild.rows[0].cells[0].offsetHeight}return a}function A(c){var a=
"<data profile='"+c+"'";m&&(a+=" header='"+m+"'");n&&(a+=" footer='"+n+"'");a+=">";a+="<scale mode='"+scheduler._mode+"' today='"+scheduler._els.dhx_cal_date[0].innerHTML+"'>";if(scheduler._mode=="agenda"){var b=scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;a+="<column>"+g(b[0].innerHTML)+"</column><column>"+g(b[1].innerHTML)+"</column>"}else if(scheduler._mode=="year")for(var b=scheduler._els.dhx_cal_data[0].childNodes,d=0;d<b.length;d++)a+="<month label='"+g(b[d].childNodes[0].innerHTML)+
"'>",a+=q(b[d].childNodes[1].childNodes),a+=w(b[d].childNodes[2]),a+="</month>";else{a+="<x>";b=scheduler._els.dhx_cal_header[0].childNodes;a+=q(b);a+="</x>";var e=scheduler._els.dhx_cal_data[0];if(scheduler.matrix&&scheduler.matrix[scheduler._mode]){a+="<y>";for(d=0;d<e.firstChild.rows.length;d++)a+="<row><![CDATA["+e.firstChild.rows[d].cells[0].innerHTML+"]]\></row>";a+="</y>";k=e.firstChild.rows[0].cells[0].offsetHeight}else if(e.firstChild.tagName=="TABLE")a+=w(e);else{for(e=e.childNodes[e.childNodes.length-
1];e.className.indexOf("dhx_scale_holder")==-1;)e=e.previousSibling;e=e.childNodes;a+="<y>";for(d=0;d<e.length;d++)a+="\n<row><![CDATA["+g(e[d].innerHTML)+"]]\></row>";a+="</y>";k=e[0].offsetHeight}}a+="</scale>";return a}function r(c,a){return(window.getComputedStyle?window.getComputedStyle(c,null)[a]:c.currentStyle?c.currentStyle[a]:null)||""}function B(){var c="",a=scheduler._rendered;if(scheduler._mode=="agenda")for(var b=0;b<a.length;b++)c+="<event><head>"+g(a[b].childNodes[0].innerHTML)+"</head><body>"+
g(a[b].childNodes[2].innerHTML)+"</body></event>";else if(scheduler._mode=="year"){a=scheduler.get_visible_events();for(b=0;b<a.length;b++){var d=a[b].start_date;if(d.valueOf()<scheduler._min_date.valueOf())d=scheduler._min_date;for(;d<a[b].end_date;){var e=d.getMonth()+12*(d.getFullYear()-scheduler._min_date.getFullYear())-scheduler.week_starts._month,h=scheduler.week_starts[e]+d.getDate()-1;c+="<event day='"+h%7+"' week='"+Math.floor(h/7)+"' month='"+e+"'></event>";d=scheduler.date.add(d,1,"day");
if(d.valueOf()>=scheduler._max_date.valueOf())break}}}else for(b=0;b<a.length;b++){var f=j(a[b].style.left),i=j(a[b].style.width),l=t(a[b].style.top),m=t(a[b].style.height),n=a[b].className.split(" ")[0].replace("dhx_cal_",""),o=scheduler.getEvent(a[b].getAttribute("event_id")),h=o._sday,s=o._sweek;if(scheduler._mode!="month"){if(scheduler.matrix&&scheduler.matrix[scheduler._mode])h=0,s=a[b].parentNode.parentNode.parentNode.rowIndex,i+=j(10);else{i+=j(i*20/100);f-=j(20-f*20/100);if(a[b].parentNode==
scheduler._els.dhx_cal_data[0])continue;f+=j(a[b].parentNode.style.left);f-=j(51)}if(scheduler._mode=="timeline"){var q=k;k=180;l=t(a[b].style.top);k=q}}else m=parseInt(a[b].offsetHeight),l=parseInt(a[b].style.top)-22,h=y(a[b],h),s=z(a[b],s);c+="\n<event week='"+s+"' day='"+h+"' type='"+n+"' x='"+f+"' y='"+l+"' width='"+i+"' height='"+m+"'>";if(n=="event"){c+="<header><![CDATA["+g(a[b].childNodes[1].innerHTML)+"]]\></header>";var u=p?r(a[b].childNodes[2],"color"):"",v=p?r(a[b].childNodes[2],"backgroundColor"):
"";c+="<body backgroundColor='"+v+"' color='"+u+"'><![CDATA["+g(a[b].childNodes[2].innerHTML)+"]]\></body>"}else u=p?r(a[b],"color"):"",v=p?r(a[b],"backgroundColor"):"",c+="<body backgroundColor='"+v+"' color='"+u+"'><![CDATA["+g(a[b].innerHTML)+"]]\></body>";c+="</event>"}return c}function C(){var c="</data>";return c}var o=0,k=0,p=!1;f=="fullcolor"&&(p=!0,f="color");f=f||"color";html_regexp=RegExp("<[^>]*>","g");var l=(new Date).valueOf(),i=document.createElement("div");i.style.display="none";document.body.appendChild(i);
i.innerHTML='<form id="'+l+'" method="post" target="_blank" action="'+x+'" accept-charset="utf-8" enctype="application/x-www-form-urlencoded"><input type="hidden" name="mycoolxmlbody"/> </form>';document.getElementById(l).firstChild.value=A(f).replace("\u2013","-")+B()+C();document.getElementById(l).submit();i.parentNode.removeChild(i);grid=null};

View File

@ -1,9 +1,9 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.attachEvent("onTemplatesReady",function(){scheduler.attachEvent("onBeforeLightbox",function(F){if(this.config.readonly_form||this.getEvent(F).readonly){this.config.readonly_active=true}else{this.config.readonly_active=false;return true}for(var E=0;E<this.config.lightbox.sections.length;E++){this.config.lightbox.sections[E].focus=false}return true});function D(E,K,L,J){var G=K.getElementsByTagName(E);var F=L.getElementsByTagName(E);for(var I=F.length-1;I>=0;I--){var L=F[I];if(!J){L.disabled=true}else{var H=document.createElement("SPAN");H.className="dhx_text_disabled";H.innerHTML=J(G[I]);L.parentNode.insertBefore(H,L);L.parentNode.removeChild(L)}}}var B=scheduler._fill_lightbox;scheduler._fill_lightbox=function(){var H=this.config.lightbox.sections;if(this.config.readonly_active){for(var F=0;F<H.length;F++){if(H[F].type=="recurring"){var G=document.getElementById(H[F].id);G.style.display=G.nextSibling.style.display="none";H.splice(F,1);F--}}}var E=B.apply(this,arguments);if(this.config.readonly_active){var I=this._get_lightbox();var J=this._lightbox_r=I.cloneNode(true);D("textarea",I,J,function(K){return K.value});D("input",I,J,false);D("select",I,J,function(K){return K.options[Math.max((K.selectedIndex||0),0)].text});J.removeChild(J.childNodes[2]);J.removeChild(J.childNodes[3]);I.parentNode.insertBefore(J,I);A.call(this,J);this._lightbox=J;this.setLightboxSize();this._lightbox=null;J.onclick=function(K){var L=K?K.target:event.srcElement;if(!L.className){L=L.previousSibling}if(L&&L.className){switch(L.className){case"dhx_cancel_btn":scheduler.callEvent("onEventCancel",[scheduler._lightbox_id]);scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id),false);scheduler.hide_lightbox();break}}}}return E};var A=scheduler.showCover;scheduler.showCover=function(){if(!this.config.readonly_active){A.apply(this,arguments)}};var C=scheduler.hide_lightbox;scheduler.hide_lightbox=function(){if(this._lightbox_r){this._lightbox_r.parentNode.removeChild(this._lightbox_r);this._lightbox_r=null}return C.apply(this,arguments)}});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.attachEvent("onTemplatesReady",function(){function h(d,b,c,f){for(var e=b.getElementsByTagName(d),a=c.getElementsByTagName(d),g=a.length-1;g>=0;g--)if(c=a[g],f){var i=document.createElement("SPAN");i.className="dhx_text_disabled";i.innerHTML=f(e[g]);c.parentNode.insertBefore(i,c);c.parentNode.removeChild(c)}else c.disabled=!0}scheduler.attachEvent("onBeforeLightbox",function(d){if(this.config.readonly_form||this.getEvent(d).readonly)this.config.readonly_active=!0;else return this.config.readonly_active=
!1,!0;for(var b=0;b<this.config.lightbox.sections.length;b++)this.config.lightbox.sections[b].focus=!1;return!0});var k=scheduler._fill_lightbox;scheduler._fill_lightbox=function(){var d=this.config.lightbox.sections;if(this.config.readonly_active)for(var b=0;b<d.length;b++)if(d[b].type=="recurring"){var c=document.getElementById(d[b].id);c.style.display=c.nextSibling.style.display="none";d.splice(b,1);b--}var f=k.apply(this,arguments);if(this.config.readonly_active){var e=this._get_lightbox(),a=
this._lightbox_r=e.cloneNode(!0);a.id=scheduler.uid();a.style.color="red";h("textarea",e,a,function(a){return a.value});h("input",e,a,!1);h("select",e,a,function(a){return a.options[Math.max(a.selectedIndex||0,0)].text});a.removeChild(a.childNodes[2]);a.removeChild(a.childNodes[3]);e.parentNode.insertBefore(a,e);j.call(this,a);scheduler._lightbox&&scheduler._lightbox.parentNode.removeChild(scheduler._lightbox);this._lightbox=a;this.setLightboxSize();this._lightbox=null;a.onclick=function(a){var b=
a?a.target:event.srcElement;if(!b.className)b=b.previousSibling;if(b&&b.className)switch(b.className){case "dhx_cancel_btn":scheduler.callEvent("onEventCancel",[scheduler._lightbox_id]),scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id),!1),scheduler.hide_lightbox()}}}return f};var j=scheduler.showCover;scheduler.showCover=function(){this.config.readonly_active||j.apply(this,arguments)};var l=scheduler.hide_lightbox;scheduler.hide_lightbox=function(){if(this._lightbox_r)this._lightbox_r.parentNode.removeChild(this._lightbox_r),
this._lightbox_r=null;return l.apply(this,arguments)}});

View File

@ -1,9 +0,0 @@
/*
dhtmlxScheduler v.2.3
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
(c) DHTMLX Ltd.
*/
div input.radio{margin:-4px 0 0 -4px!ie;}div input.checkbox{margin:0 0 0 -4px!ie;}.dhx_form_repeat,.dhx_form_repeat input{padding:0;margin:0;font-family:Tahoma,Verdana;font-size:11px;line-height:24px;}.dhx_form_repeat{overflow:hidden;height:0;background-color:#FFF4B5;}.dhx_repeat_center,.dhx_repeat_left{height:115px;padding:10px 0 10px 10px;float:left;}.dhx_repeat_left{width:95px;}.dhx_repeat_center{width:335px;margin-top:12px;}.dhx_repeat_divider{float:left;height:115px;border-left:1px dotted #DCC43E;width:1px;}.dhx_repeat_right{float:right;height:115px;width:160px;padding:10px 3px 10px 10px;margin-top:7px;}input.dhx_repeat_text{height:16px;width:27px;margin:0 4px 0 4px;line-height:18px;padding:0 0 0 2px;}.dhx_form_repeat select{height:20px;width:87px;padding:0 0 0 2px;margin:0 4px 0 4px;}input.dhx_repeat_date{height:18px;width:80px;padding:0 0 0 2px;margin:0 4px 0 4px;background-repeat:no-repeat;background-position:64px 0;border:1px #7f9db9 solid;line-height:18px;}input.dhx_repeat_radio{margin-right:4px;}input.dhx_repeat_checkbox{margin:4px 4px 0 0;}.dhx_repeat_days td{padding-right:5px;}.dhx_repeat_days label{font-size:10px;}.dhx_custom_button_recurring{background-image:url(../imgs/but_repeat.gif);background-position:-5px 20px;width:20px;margin-right:10px;}.dhx_custom_button{width:90px;}.dhx_cal_light{width:640px;}.dhx_cal_larea{width:632px;}

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,8 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.data_attributes=function(){var C=[];var E=scheduler.templates.xml_format;for(var A in this._events){var D=this._events[A];for(var B in D){if(B.substr(0,1)!="_"){C.push([B,((B=="start_date"||B=="end_date")?E:null)])}}break}return C};scheduler.toXML=function(F){var C=[];var B=this.data_attributes();for(var A in this._events){var E=this._events[A];if(E.id.toString().indexOf("#")!=-1){continue}C.push("<event>");for(var D=0;D<B.length;D++){C.push("<"+B[D][0]+"><![CDATA["+(B[D][1]?B[D][1](E[B[D][0]]):E[B[D][0]])+"]]></"+B[D][0]+">")}C.push("</event>")}return(F||"")+"<data>"+C.join("\n")+"</data>"};scheduler.toJSON=function(){var E=[];var C=this.data_attributes();for(var B in this._events){var F=this._events[B];if(F.id.toString().indexOf("#")!=-1){continue}var F=this._events[B];var A=[];for(var D=0;D<C.length;D++){A.push(" "+C[D][0]+':"'+((C[D][1]?C[D][1](F[C[D][0]]):F[C[D][0]])||"").toString().replace(/\n/g,"")+'" ')}E.push("{"+A.join(",")+"}")}return"["+E.join(",\n")+"]"};scheduler.toICal=function(G){var F="BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//dhtmlXScheduler//NONSGML v2.2//EN\nDESCRIPTION:";var C="END:VCALENDAR";var E=scheduler.date.date_to_str("%Y%m%dT%H%i%s");var B=[];for(var A in this._events){var D=this._events[A];if(D.id.toString().indexOf("#")!=-1){continue}B.push("BEGIN:VEVENT");B.push("DTSTART:"+E(D.start_date));B.push("DTEND:"+E(D.end_date));B.push("SUMMARY:"+D.text);B.push("END:VEVENT")}return F+(G||"")+"\n"+B.join("\n")+"\n"+C};
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.data_attributes=function(){var f=[],d=scheduler.templates.xml_format,c;for(c in this._events){var e=this._events[c],a;for(a in e)a.substr(0,1)!="_"&&f.push([a,a=="start_date"||a=="end_date"?d:null]);break}return f};
scheduler.toXML=function(f){var d=[],c=this.data_attributes(),e;for(e in this._events){var a=this._events[e];if(a.id.toString().indexOf("#")==-1){d.push("<event>");for(var b=0;b<c.length;b++)d.push("<"+c[b][0]+"><![CDATA["+(c[b][1]?c[b][1](a[c[b][0]]):a[c[b][0]])+"]]\></"+c[b][0]+">");d.push("</event>")}}return(f||"")+"<data>"+d.join("\n")+"</data>"};
scheduler.toJSON=function(){var f=[],d=this.data_attributes(),c;for(c in this._events){var e=this._events[c];if(e.id.toString().indexOf("#")==-1){for(var e=this._events[c],a=[],b=0;b<d.length;b++)a.push(" "+d[b][0]+':"'+((d[b][1]?d[b][1](e[d[b][0]]):e[d[b][0]])||"").toString().replace(/\n/g,"")+'" ');f.push("{"+a.join(",")+"}")}}return"["+f.join(",\n")+"]"};
scheduler.toICal=function(f){var d="BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//dhtmlXScheduler//NONSGML v2.2//EN\nDESCRIPTION:",c="END:VCALENDAR",e=scheduler.date.date_to_str("%Y%m%dT%H%i%s"),a=[],b;for(b in this._events){var g=this._events[b];g.id.toString().indexOf("#")==-1&&(a.push("BEGIN:VEVENT"),a.push("DTSTART:"+e(g.start_date)),a.push("DTEND:"+e(g.end_date)),a.push("SUMMARY:"+g.text),a.push("END:VEVENT"))}return d+(f||"")+"\n"+a.join("\n")+"\n"+c};

File diff suppressed because one or more lines are too long

View File

@ -1 +1,11 @@
window.dhtmlXTooltip={version:0.1};dhtmlXTooltip.config={className:"dhtmlXTooltip tooltip",timeout_to_display:50,delta_x:15,delta_y:-20};dhtmlXTooltip.tooltip=document.createElement("div");dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className;dhtmlXTooltip.show=function(D,G){dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className;var H=this.position(D);var E=D.target||D.srcElement;if(this.isTooltip(E)){return }var C=H.x+dhtmlXTooltip.config.delta_x||0;var B=H.y-dhtmlXTooltip.config.delta_y||0;this.tooltip.style.visibility="hidden";if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("right");this.tooltip.style.removeAttribute("bottom")}else{this.tooltip.style.removeProperty("right");this.tooltip.style.removeProperty("bottom")}this.tooltip.style.left="0px";this.tooltip.style.top="0px";this.tooltip.innerHTML=G;scheduler._obj.appendChild(this.tooltip);var A=this.tooltip.offsetWidth;var F=this.tooltip.offsetHeight;if(document.body.offsetWidth-C-A<0){if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("left")}else{this.tooltip.style.removeProperty("left")}this.tooltip.style.right=(document.body.offsetWidth-C+2*dhtmlXTooltip.config.delta_x||0)+"px"}else{if(C<0){this.tooltip.style.left=(H.x+Math.abs(dhtmlXTooltip.config.delta_x||0))+"px"}else{this.tooltip.style.left=C+"px"}}if(document.body.offsetHeight-B-F<0){if(this.tooltip.style.removeAttribute){this.tooltip.style.removeAttribute("top")}else{this.tooltip.style.removeProperty("top")}this.tooltip.style.bottom=(document.body.offsetHeight-B-2*dhtmlXTooltip.config.delta_y||0)+"px"}else{if(B<0){this.tooltip.style.top=(H.y+Math.abs(dhtmlXTooltip.config.delta_y||0))+"px"}else{this.tooltip.style.top=B+"px"}}this.tooltip.style.visibility="visible"};dhtmlXTooltip.hide=function(){if(this.tooltip.parentNode){this.tooltip.parentNode.removeChild(this.tooltip)}};dhtmlXTooltip.delay=function(D,B,C,A){if(this.tooltip._timeout_id){window.clearTimeout(this.tooltip._timeout_id)}this.tooltip._timeout_id=setTimeout(function(){var E=D.apply(B,C);D=obj=C=null;return E},A||this.config.timeout_to_display)};dhtmlXTooltip.isTooltip=function(B){var A=false;while(B&&!A){A=(B.className==this.tooltip.className);B=B.parentNode}return A};dhtmlXTooltip.position=function(A){var A=A||window.event;if(A.pageX||A.pageY){return{x:A.pageX,y:A.pageY}}var B=((dhtmlx._isIE)&&(document.compatMode!="BackCompat"))?document.documentElement:document.body;return{x:A.clientX+B.scrollLeft-B.clientLeft,y:A.clientY+B.scrollTop-B.clientTop}};scheduler.attachEvent("onMouseMove",function(D,F){var C=F||window.event;var E=C.target||C.srcElement;if(D||dhtmlXTooltip.isTooltip(E)){var B=scheduler.getEvent(D)||scheduler.getEvent(dhtmlXTooltip.tooltip.event_id);dhtmlXTooltip.tooltip.event_id=B.id;var G=scheduler.templates.tooltip_text(B.start_date,B.end_date,B);if(_isIE){var A=document.createEventObject(C)}dhtmlXTooltip.delay(dhtmlXTooltip.show,dhtmlXTooltip,[A||C,G])}else{dhtmlXTooltip.delay(dhtmlXTooltip.hide,dhtmlXTooltip,[])}});scheduler.templates.tooltip_text=function(C,A,B){return"<b>Event:</b> "+B.text+"<br/><b>Start date:</b> "+scheduler.templates.tooltip_date_format(C)+"<br/><b>End date:</b> "+scheduler.templates.tooltip_date_format(A)};
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterise License
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
window.dhtmlXTooltip={};dhtmlXTooltip.config={className:"dhtmlXTooltip tooltip",timeout_to_display:50,delta_x:15,delta_y:-20};dhtmlXTooltip.tooltip=document.createElement("div");dhtmlXTooltip.tooltip.className=dhtmlXTooltip.config.className;
dhtmlXTooltip.show=function(b,d){var c=dhtmlXTooltip,f=this.tooltip,a=f.style;c.tooltip.className=c.config.className;var e=this.position(b),k=b.target||b.srcElement;if(!this.isTooltip(k)){var g=0,l=0,h=scheduler._obj;if(h.offsetParent){do g+=h.offsetLeft,l+=h.offsetTop;while(h=h.offsetParent)}var i=e.x+(c.config.delta_x||0)-g,j=e.y-(c.config.delta_y||0)-l;a.visibility="hidden";a.removeAttribute?(a.removeAttribute("right"),a.removeAttribute("bottom")):(a.removeProperty("right"),a.removeProperty("bottom"));
a.left="0";a.top="0";this.tooltip.innerHTML=d;scheduler._obj.appendChild(this.tooltip);var m=this.tooltip.offsetWidth,n=this.tooltip.offsetHeight;scheduler._obj.offsetWidth-i-(scheduler.xy.margin_left||0)-m<0?(a.removeAttribute?a.removeAttribute("left"):a.removeProperty("left"),a.right=scheduler._obj.offsetWidth-i+2*(c.config.delta_x||0)+"px"):a.left=i<0?e.x+Math.abs(c.config.delta_x||0)+"px":i+"px";scheduler._obj.offsetHeight-j-(scheduler.xy.margin_top||0)-n<0?(a.removeAttribute?a.removeAttribute("top"):
a.removeProperty("top"),a.bottom=scheduler._obj.offsetHeight-j-2*(c.config.delta_y||0)+"px"):a.top=j<0?e.y+Math.abs(c.config.delta_y||0)+"px":j+"px";a.visibility="visible"}};dhtmlXTooltip.hide=function(){this.tooltip.parentNode&&this.tooltip.parentNode.removeChild(this.tooltip)};dhtmlXTooltip.delay=function(b,d,c,f){this.tooltip._timeout_id&&window.clearTimeout(this.tooltip._timeout_id);this.tooltip._timeout_id=setTimeout(function(){var a=b.apply(d,c);b=d=c=null;return a},f||this.config.timeout_to_display)};
dhtmlXTooltip.isTooltip=function(b){for(var d=!1;b&&!d;)d=b.className==this.tooltip.className,b=b.parentNode;return d};dhtmlXTooltip.position=function(b){b=b||window.event;if(b.pageX||b.pageY)return{x:b.pageX,y:b.pageY};var d=dhtmlx._isIE&&document.compatMode!="BackCompat"?document.documentElement:document.body;return{x:b.clientX+d.scrollLeft-d.clientLeft,y:b.clientY+d.scrollTop-d.clientTop}};
scheduler.attachEvent("onMouseMove",function(b,d){var c=window.event||d,f=c.target||c.srcElement,a=dhtmlXTooltip;if(b||a.isTooltip(f)){var e=scheduler.getEvent(b)||scheduler.getEvent(a.tooltip.event_id);if(e){a.tooltip.event_id=e.id;var k=scheduler.templates.tooltip_text(e.start_date,e.end_date,e),g=void 0;_isIE&&(g=document.createEventObject(c));a.delay(a.show,a,[g||c,k])}}else a.delay(a.hide,a,[])});scheduler.attachEvent("onBeforeDrag",function(){dhtmlXTooltip.hide();return!0});
scheduler.templates.tooltip_date_format=scheduler.date.date_to_str("%Y-%m-%d %H:%i");scheduler.templates.tooltip_text=function(b,d,c){return"<b>Event:</b> "+c.text+"<br/><b>Start date:</b> "+scheduler.templates.tooltip_date_format(b)+"<br/><b>End date:</b> "+scheduler.templates.tooltip_date_format(d)};

View File

@ -1,9 +1,5 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
.dhx_cal_prev_button,.dhx_cal_next_button,.dhx_cal_today_button,.dhx_cal_add_button{top:6px!important;left:10px;border:1px solid #575D65;border-top:1px solid #4E5052;color:#FFF;text-shadow:0 -1px 0 #65696E;background-image:-webkit-gradient(linear,left top,left bottom,from(#B2B6BC),to(#6B737E));background-color:#989B9F;background-position:0 1px;background-repeat:repeat-x;-webkit-border-radius:5px;padding:3px;text-align:center;text-decoration:none;}.dhx_cal_today_button{left:55px;}.dhx_cal_next_button{left:146px;}.dhx_cal_add_button{right:9px;left:auto;width:20px;font-size:20px;padding:1px 2px 2px 2px;}.dhx_cal_navline .dhx_cal_date{top:7px;left:160px;right:350px;padding-top:4px;width:auto;text-align:center;color:#4F5459;}.dhx_cal_navline{background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0,#F4F5F8),color-stop(0.3,#F1F2F4),color-stop(0.7,#C4C7D0),color-stop(1,#A6AAB7));border-bottom:1px solid #797F90;height:40px!important;font-family:Helvetica;font-weight:bold;font-size:13px;}.dhx_cal_tab{top:6px!important;color:#4F5459;text-align:center;padding:5px 10px;width:80px;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#F7F7F7),to(#B9BDC7));background-color:#CFD0D1;background-position:0 1px;background-repeat:repeat-x;text-decoration:none;border:1px solid #95989F;border-top:1px solid #686A6A;height:16px;}.dhx_cal_tab.active{background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#B0B2B6),to(#666D74));background-color:#949799;background-position:0 1px;background-repeat:repeat-x;border:1px solid #4C4D4F;border-top:1px solid #52585C;color:#F8F8F8;text-shadow:0 -1px 0 #5E6063;text-decoration:none;height:16px;padding:5px 10px;z-index:100;}.dhx_cal_light{-webkit-transition:-webkit-transform;-webkit-transform-style:preserve-3d;}.dhx_cal_cover{opacity:.5;}.dhx_cal_ltext{padding-top:0;padding-bottom:0;}.dhx_cal_ltext textarea{-webkit-background-size:0;-webkit-border-radius:0;height:94%;}.dhx_mini_calendar .dhx_month_head{height:35px;line-height:35px;text-align:center;padding-right:0;padding-left:0;}.dhx_mini_calendar .dhx_year_month{height:35px;line-height:30px;background:-webkit-gradient(linear,0% 0,0% 100%,from(#F4F5F8),to(#8A8E9A));font-family:Helvetica;font-weight:bold;font-size:13px;}.dhx_mini_calendar .dhx_year_month .dhx_cal_prev_button,.dhx_mini_calendar .dhx_year_month .dhx_cal_next_button{line-height:normal;}

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,16 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler._props={};scheduler.createUnitsView=function(A,E,D,B,C){if(typeof A=="object"){D=A.list;E=A.property;B=A.size||0;C=A.step||1;A=A.name}scheduler.date[A+"_start"]=scheduler.date.day_start;scheduler.templates[A+"_date"]=function(F){return scheduler.templates.day_date(F)};scheduler.templates[A+"_scale_date"]=function(G){if(!D.length){return""}var F=(scheduler._props[A].position||0)+Math.floor((scheduler._correct_shift(G.valueOf(),1)-scheduler._min_date.valueOf())/(60*60*24*1000));if(D[F].css){return"<span class='"+D[F].css+"'>"+D[F].label+"</span>"}else{return D[F].label}};scheduler.date["add_"+A]=function(F,G){return scheduler.date.add(F,G,"day")};scheduler.date["get_"+A+"_end"]=function(F){return scheduler.date.add(F,B||D.length,"day")};scheduler._props[A]={map_to:E,options:D,size:B,step:C,position:0};scheduler.attachEvent("onOptionsLoad",function(){var F=scheduler._props[A].order={};for(var G=0;G<D.length;G++){F[D[G].key]=G}if(scheduler._date){scheduler.setCurrentView(scheduler._date,scheduler._mode)}});scheduler.callEvent("onOptionsLoad",[])};scheduler.scrollUnit=function(A){var B=scheduler._props[this._mode];if(B){B.position=Math.min(Math.max(0,B.position+A),B.options.length-B.size);this.update_view()}};(function(){var D=function(L,J){if(L&&typeof L.order[J[L.map_to]]=="undefined"){var I=scheduler;var H=24*60*60*1000;var K=Math.floor((J.end_date-I._min_date)/H);J[L.map_to]=L.options[Math.min(K+L.position,L.options.length-1)].key;return true}};var B=scheduler._reset_scale;var F=scheduler.is_visible_events;scheduler.is_visible_events=function(I){var H=F.apply(this,arguments);if(H){var K=scheduler._props[this._mode];if(K&&K.size){var J=K.order[I[K.map_to]];if(J<K.position||J>=K.size+K.position){return false}}}return H};scheduler._reset_scale=function(){var M=scheduler._props[this._mode];var H=B.apply(this,arguments);if(M){this._max_date=this.date.add(this._min_date,1,"day");var L=this._els.dhx_cal_data[0].childNodes;for(var I=0;I<L.length;I++){L[I].className=L[I].className.replace("_now","")}if(M.size&&M.size<M.options.length){var J=this._els.dhx_cal_header[0];var K=document.createElement("DIV");if(M.position){K.className="dhx_cal_prev_button";K.style.cssText="left:1px;top:2px;position:absolute;";K.innerHTML="&nbsp;";J.firstChild.appendChild(K);K.onclick=function(){scheduler.scrollUnit(M.step*-1)}}if(M.position+M.size<M.options.length){K=document.createElement("DIV");K.className="dhx_cal_next_button";K.style.cssText="left:auto; right:0px;top:2px;position:absolute;";K.innerHTML="&nbsp;";J.lastChild.appendChild(K);K.onclick=function(){scheduler.scrollUnit(M.step)}}}}return H};var C=scheduler._get_event_sday;scheduler._get_event_sday=function(H){var I=scheduler._props[this._mode];if(I){D(I,H);return I.order[H[I.map_to]]-I.position}return C.call(this,H)};var A=scheduler.locate_holder_day;scheduler.locate_holder_day=function(I,H,J){var K=scheduler._props[this._mode];if(K){D(K,J);return K.order[J[K.map_to]]*1+(H?1:0)-K.position}return A.apply(this,arguments)};var E=scheduler._mouse_coords;scheduler._mouse_coords=function(){var K=scheduler._props[this._mode];var J=E.apply(this,arguments);if(K){var H=this._drag_event;if(this._drag_id){H=this.getEvent(this._drag_id);this._drag_event._dhx_changed=true}var I=Math.min(J.x+K.position,K.options.length-1);H[K.map_to]=K.options[I].key;J.x=I/10000000}return J};var G=scheduler._time_order;scheduler._time_order=function(H){var I=scheduler._props[this._mode];if(I){H.sort(function(K,J){return I.order[K[I.map_to]]>I.order[J[I.map_to]]?1:-1})}else{G.apply(this,arguments)}};scheduler.attachEvent("onEventAdded",function(K,I){if(this._loading){return true}for(var H in scheduler._props){var J=scheduler._props[H];if(typeof I[J.map_to]=="undefined"){I[J.map_to]=J.options[0].key}}return true});scheduler.attachEvent("onEventCreated",function(K,H){var J=scheduler._props[this._mode];if(J){var I=this.getEvent(K);this._mouse_coords(H);D(J,I);this.event_updated(I)}return true})})();
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler._props={};
scheduler.createUnitsView=function(a,f,j,g,k,l){if(typeof a=="object")j=a.list,f=a.property,g=a.size||0,k=a.step||1,l=a.skip_incorrect,a=a.name;scheduler._props[a]={map_to:f,options:j,step:k,position:0};if(g>scheduler._props[a].options.length)scheduler._props[a]._original_size=g,g=0;scheduler._props[a].size=g;scheduler._props[a].skip_incorrect=l||!1;scheduler.date[a+"_start"]=scheduler.date.day_start;scheduler.templates[a+"_date"]=function(a){return scheduler.templates.day_date(a)};scheduler.templates[a+
"_scale_date"]=function(c){var h=scheduler._props[a].options;if(!h.length)return"";var f=(scheduler._props[a].position||0)+Math.floor((scheduler._correct_shift(c.valueOf(),1)-scheduler._min_date.valueOf())/864E5);return h[f].css?"<span class='"+h[f].css+"'>"+h[f].label+"</span>":h[f].label};scheduler.date["add_"+a]=function(a,f){return scheduler.date.add(a,f,"day")};scheduler.date["get_"+a+"_end"]=function(c){return scheduler.date.add(c,scheduler._props[a].size||scheduler._props[a].options.length,
"day")};scheduler.attachEvent("onOptionsLoad",function(){for(var c=scheduler._props[a],f=c.order={},g=c.options,i=0;i<g.length;i++)f[g[i].key]=i;if(c._original_size&&c.size==0)c.size=c._original_size,delete c.original_size;c.size>g.length?(c._original_size=c.size,c.size=0):c.size=c._original_size||c.size;scheduler._date&&scheduler._mode==a&&scheduler.setCurrentView(scheduler._date,scheduler._mode)});scheduler.callEvent("onOptionsLoad",[])};
scheduler.scrollUnit=function(a){var f=scheduler._props[this._mode];if(f)f.position=Math.min(Math.max(0,f.position+a),f.options.length-f.size),this.update_view()};
(function(){var a=function(b){var d=scheduler._props[scheduler._mode];if(d&&d.order&&d.skip_incorrect){for(var a=[],e=0;e<b.length;e++)typeof d.order[b[e][d.map_to]]!="undefined"&&a.push(b[e]);b.splice(0,b.length);b.push.apply(b,a)}return b},f=scheduler._pre_render_events_table;scheduler._pre_render_events_table=function(b,d){b=a(b);return f.apply(this,[b,d])};var j=scheduler._pre_render_events_line;scheduler._pre_render_events_line=function(b,d){b=a(b);return j.apply(this,[b,d])};var g=function(b,
d){if(b&&typeof b.order[d[b.map_to]]=="undefined"){var a=scheduler,e=864E5,c=Math.floor((d.end_date-a._min_date)/e);d[b.map_to]=b.options[Math.min(c+b.position,b.options.length-1)].key;return!0}},k=scheduler._reset_scale,l=scheduler.is_visible_events;scheduler.is_visible_events=function(b){var d=l.apply(this,arguments);if(d){var a=scheduler._props[this._mode];if(a&&a.size){var e=a.order[b[a.map_to]];if(e<a.position||e>=a.size+a.position)return!1}}return d};scheduler._reset_scale=function(){var b=
scheduler._props[this._mode],a=k.apply(this,arguments);if(b){this._max_date=this.date.add(this._min_date,1,"day");for(var c=this._els.dhx_cal_data[0].childNodes,e=0;e<c.length;e++)c[e].className=c[e].className.replace("_now","");if(b.size&&b.size<b.options.length){var f=this._els.dhx_cal_header[0],g=document.createElement("DIV");if(b.position)g.className="dhx_cal_prev_button",g.style.cssText="left:1px;top:2px;position:absolute;",g.innerHTML="&nbsp;",f.firstChild.appendChild(g),g.onclick=function(){scheduler.scrollUnit(b.step*
-1)};if(b.position+b.size<b.options.length)g=document.createElement("DIV"),g.className="dhx_cal_next_button",g.style.cssText="left:auto; right:0px;top:2px;position:absolute;",g.innerHTML="&nbsp;",f.lastChild.appendChild(g),g.onclick=function(){scheduler.scrollUnit(b.step)}}}return a};var c=scheduler._get_event_sday;scheduler._get_event_sday=function(b){var a=scheduler._props[this._mode];return a?(g(a,b),a.order[b[a.map_to]]-a.position):c.call(this,b)};var h=scheduler.locate_holder_day;scheduler.locate_holder_day=
function(a,d,c){var e=scheduler._props[this._mode];return e?(g(e,c),e.order[c[e.map_to]]*1+(d?1:0)-e.position):h.apply(this,arguments)};var m=scheduler._mouse_coords;scheduler._mouse_coords=function(){var a=scheduler._props[this._mode],d=m.apply(this,arguments);if(a){if(!this._drag_event)this._drag_event={};var c=this._drag_event;if(this._drag_id&&this._drag_mode)c=this.getEvent(this._drag_id),this._drag_event._dhx_changed=!0;var e=Math.min(d.x+a.position,a.options.length-1);c[a.map_to]=a.options[e].key;
d.x=0;d.custom=!0}return d};var i=scheduler._time_order;scheduler._time_order=function(a){var d=scheduler._props[this._mode];d?a.sort(function(a,b){return d.order[a[d.map_to]]>d.order[b[d.map_to]]?1:-1}):i.apply(this,arguments)};scheduler.attachEvent("onEventAdded",function(a,d){if(this._loading)return!0;for(var c in scheduler._props){var e=scheduler._props[c];if(typeof d[e.map_to]=="undefined")d[e.map_to]=e.options[0].key}return!0});scheduler.attachEvent("onEventCreated",function(a,c){var f=scheduler._props[this._mode];
if(f){var e=this.getEvent(a);this._mouse_coords(c);g(f,e);this.event_updated(e)}return!0})})();

View File

@ -1,9 +1,6 @@
/*
dhtmlxScheduler v.2.3
/*
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
(c) DHTMLX Ltd.
*/
scheduler.attachEvent("onTemplatesReady",function(){var C=true;var A=scheduler.date.str_to_date("%Y-%m-%d");var B=scheduler.date.date_to_str("%Y-%m-%d");scheduler.attachEvent("onBeforeViewChange",function(K,D,F,J){if(C){C=false;var E={};var G=(document.location.hash||"").replace("#","").split(",");for(var H=0;H<G.length;H++){var M=G[H].split("=");if(M.length==2){E[M[0]]=M[1]}}if(E.date||E.mode){try{this.setCurrentView((E.date?A(E.date):null),(E.mode||null))}catch(I){this.setCurrentView((E.date?A(E.date):null),F)}return false}}var L="#date="+B(J||D)+",mode="+(F||K);document.location.hash=L;return true})});
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
scheduler.attachEvent("onTemplatesReady",function(){var d=!0,e=scheduler.date.str_to_date("%Y-%m-%d"),h=scheduler.date.date_to_str("%Y-%m-%d");scheduler.attachEvent("onBeforeViewChange",function(i,j,f,k){if(d){d=!1;for(var a={},g=(document.location.hash||"").replace("#","").split(","),b=0;b<g.length;b++){var c=g[b].split("=");c.length==2&&(a[c[0]]=c[1])}if(a.date||a.mode){try{this.setCurrentView(a.date?e(a.date):null,a.mode||null)}catch(m){this.setCurrentView(a.date?e(a.date):null,f)}return!1}}var l=
"#date="+h(k||j)+",mode="+(f||i);document.location.hash=l;return!0})});

View File

@ -0,0 +1,18 @@
/*
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
*/
scheduler._wa={};scheduler.xy.week_agenda_scale_height=20;scheduler.templates.week_agenda_event_text=function(c,e,f){return scheduler.templates.event_date(c)+" "+f.text};scheduler.date.week_agenda_start=scheduler.date.week_start;scheduler.date.week_agenda_end=function(c){return scheduler.date.add(c,7,"day")};scheduler.date.add_week_agenda=function(c,e){return scheduler.date.add(c,e*7,"day")};
scheduler.attachEvent("onSchedulerReady",function(){var c=scheduler.templates;if(!c.week_agenda_date)c.week_agenda_date=c.week_date});(function(){var c=scheduler.date.date_to_str("%l, %F %d");scheduler.templates.week_agenda_scale_date=function(e){return c(e)}})();
scheduler.attachEvent("onTemplatesReady",function(){scheduler.attachEvent("onSchedulerResize",function(){return this._mode=="week_agenda"?(this.week_agenda_view(!0),!1):!0});var c=scheduler.render_data;scheduler.render_data=function(b){if(this._mode=="week_agenda")f();else return c.apply(this,arguments)};var e=function(){scheduler._cols=[];var b=parseInt(scheduler._els.dhx_cal_data[0].style.width);scheduler._cols.push(Math.floor(b/2));scheduler._cols.push(b-scheduler._cols[0]-1);scheduler._colsS=
{0:[],1:[]};for(var a=parseInt(scheduler._els.dhx_cal_data[0].style.height),m=0;m<3;m++)scheduler._colsS[0].push(Math.floor(a/(3-scheduler._colsS[0].length))),a-=scheduler._colsS[0][m];scheduler._colsS[1].push(scheduler._colsS[0][0]);scheduler._colsS[1].push(scheduler._colsS[0][1]);a=scheduler._colsS[0][scheduler._colsS[0].length-1];scheduler._colsS[1].push(Math.floor(a/2));scheduler._colsS[1].push(a-scheduler._colsS[1][scheduler._colsS[1].length-1])},f=function(){for(var b=scheduler._els.dhx_cal_data[0].innerHTML=
"",a=0;a<2;a++){var m=scheduler._cols[a],c="dhx_wa_column";a==1&&(c+=" dhx_wa_column_last");b+="<div class='"+c+"' style='width: "+m+"px;'>";for(var h=0;h<scheduler._colsS[a].length;h++){var k=scheduler.xy.week_agenda_scale_height-2,e=scheduler._colsS[a][h]-k-2;b+="<div class='dhx_wa_day_cont'><div style='height:"+k+"px; line-height:"+k+"px;' class='dhx_wa_scale_bar'></div><div style='height:"+e+"px;' class='dhx_wa_day_data'></div></div>"}b+="</div>"}scheduler._els.dhx_cal_date[0].innerHTML=scheduler.templates[scheduler._mode+
"_date"](scheduler._min_date,scheduler._max_date,scheduler._mode);scheduler._els.dhx_cal_data[0].innerHTML=b;for(var i=scheduler._els.dhx_cal_data[0].getElementsByTagName("div"),l=[],a=0;a<i.length;a++)i[a].className=="dhx_wa_day_cont"&&l.push(i[a]);scheduler._wa._selected_divs=[];for(var f=scheduler.get_visible_events(),j=scheduler.date.week_start(scheduler._date),n=scheduler.date.add(j,1,"day"),a=0;a<7;a++){l[a]._date=j;var s=l[a].childNodes[0],t=l[a].childNodes[1];s.innerHTML=scheduler.templates.week_agenda_scale_date(j);
for(var o=[],q=0;q<f.length;q++){var r=f[q];r.start_date<n&&r.end_date>j&&o.push(r)}o.sort(function(a,b){return a.start_date.valueOf()==b.start_date.valueOf()?a.id>b.id?1:-1:a.start_date>b.start_date?1:-1});for(h=0;h<o.length;h++){var d=o[h],g=document.createElement("div");scheduler._rendered.push(g);g.className="dhx_wa_ev_body";if(d._text_style)g.style.cssText=d._text_style;if(d.color)g.style.backgroundColor=d.color;if(d.textColor)g.style.color=d.textColor;scheduler._select_id&&d.id==scheduler._select_id&&
(g.className+=" dhx_cal_event_selected",scheduler._wa._selected_divs.push(g));var p="";d._timed||(p="middle",d.start_date.valueOf()>=j.valueOf()&&d.start_date.valueOf()<=n.valueOf()&&(p="start"),d.end_date.valueOf()>=j.valueOf()&&d.end_date.valueOf()<=n.valueOf()&&(p="end"));g.innerHTML=scheduler.templates.week_agenda_event_text(d.start_date,d.end_date,d,j,p);g.setAttribute("event_id",d.id);t.appendChild(g)}j=scheduler.date.add(j,1,"day");n=scheduler.date.add(n,1,"day")}};scheduler.week_agenda_view=
function(b){scheduler._min_date=scheduler.date.week_start(scheduler._date);scheduler._max_date=scheduler.date.add(scheduler._min_date,1,"week");scheduler.set_sizes();if(b)scheduler._table_view=!0,scheduler._wa._prev_data_border=scheduler._els.dhx_cal_data[0].style.borderTop,scheduler._els.dhx_cal_data[0].style.borderTop=0,scheduler._els.dhx_cal_data[0].style.overflowY="hidden",scheduler._els.dhx_cal_date[0].innerHTML="",scheduler._els.dhx_cal_data[0].style.top=parseInt(scheduler._els.dhx_cal_data[0].style.top)-
scheduler.xy.bar_height-1+"px",scheduler._els.dhx_cal_data[0].style.height=parseInt(scheduler._els.dhx_cal_data[0].style.height)+scheduler.xy.bar_height+1+"px",scheduler._els.dhx_cal_header[0].style.display="none",e(),f();else{scheduler._table_view=!1;if(scheduler._wa._prev_data_border)scheduler._els.dhx_cal_data[0].style.borderTop=scheduler._wa._prev_data_border;scheduler._els.dhx_cal_data[0].style.overflowY="auto";scheduler._els.dhx_cal_data[0].style.top=parseInt(scheduler._els.dhx_cal_data[0].style.top)+
scheduler.xy.bar_height+"px";scheduler._els.dhx_cal_data[0].style.height=parseInt(scheduler._els.dhx_cal_data[0].style.height)-scheduler.xy.bar_height+"px";scheduler._els.dhx_cal_header[0].style.display="block"}};scheduler.mouse_week_agenda=function(b){for(var a=b.ev,c=a.srcElement||a.target;c.parentNode;){if(c._date)var e=c._date;c=c.parentNode}if(!e)return b;b.x=0;var h=e.valueOf()-scheduler._min_date.valueOf();b.y=Math.ceil(h/6E4/this.config.time_step);if(this._drag_mode=="move"){this._drag_event._dhx_changed=
!0;this._select_id=this._drag_id;for(var k=0;k<scheduler._rendered.length;k++)if(scheduler._drag_id==this._rendered[k].getAttribute("event_id"))var f=this._rendered[k];if(!scheduler._wa._dnd){var i=f.cloneNode(!0);this._wa._dnd=i;i.className=f.className;i.id="dhx_wa_dnd";i.className+=" dhx_wa_dnd";document.body.appendChild(i)}var l=document.getElementById("dhx_wa_dnd");l.style.top=(a.pageY||a.clientY)+20+"px";l.style.left=(a.pageX||a.clientX)+20+"px"}return b};scheduler.attachEvent("onBeforeEventChanged",
function(){if(this._mode=="week_agenda"&&this._drag_mode=="move"){var b=document.getElementById("dhx_wa_dnd");b.parentNode.removeChild(b);scheduler._wa._dnd=!1}return!0});scheduler.attachEvent("onEventSave",function(b,a,c){if(c)this._select_id=b;return!0});scheduler._wa._selected_divs=[];scheduler.attachEvent("onClick",function(b){if(this._mode=="week_agenda"){if(scheduler._wa._selected_divs)for(var a=0;a<this._wa._selected_divs.length;a++){var c=this._wa._selected_divs[a];c.className=c.className.replace(/ dhx_cal_event_selected/,
"")}this.for_rendered(b,function(a){a.className+=" dhx_cal_event_selected";scheduler._wa._selected_divs.push(a)});this._select_id=b;return!1}return!0})});

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,16 @@
There are a lot of files here, but you need only part of them
Desctop scheduler, default skin
dhtmlxscheduler.js
dhtmlxscheduler.css
imgs\
Desctop scheduler, glossy skin
dhtmlxscheduler.js
dhtmlxscheduler_glossy.css
imgs_glossy\
Mobile scheduler
dhtmlxscheduler_mobile.js
dhtmlxscheduler_mobile.css
imgs_mobile\

View File

@ -0,0 +1,228 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed under
the terms of this General Public License. The "Program", below, refers
to any such program or work, and a "work based on the Program" means
either the Program or any derivative work under copyright law: that is
to say, a work containing the Program or a portion of it, either
verbatim or with modifications and/or translated into another language.
(Hereinafter, translation is included without limitation in the term
"modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of running
the Program is not restricted, and the output from the Program is
covered only if its contents constitute a work based on the Program
(independent of having been made by running the Program). Whether that
is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously
and appropriately publish on each copy an appropriate copyright notice
and disclaimer of warranty; keep intact all the notices that refer to
this License and to the absence of any warranty; and give any other
recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of
it, thus forming a work based on the Program, and copy and distribute
such modifications or work under the terms of Section 1 above, provided
that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating
that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole
or in part contains or is derived from the Program or any part thereof,
to be licensed as a whole at no charge to all third parties under the
terms of this License.
c) If the modified program normally reads commands interactively when
run, you must cause it, when started running for such interactive use in
the most ordinary way, to print or display an announcement including an
appropriate copyright notice and a notice that there is no warranty (or
else, saying that you provide a warranty) and that users may
redistribute the program under these conditions, and telling the user
how to view a copy of this License. (Exception: if the Program itself is
interactive but does not normally print such an announcement, your work
based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program, and
can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based on
the Program, the distribution of the whole must be on the terms of this
License, whose permissions for other licensees extend to the entire
whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of a
storage or distribution medium does not bring the other work under the
scope of this License.
3. You may copy and distribute the Program (or a work based on it, under
Section 2) in object code or executable form under the terms of Sections
1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source
code, which must be distributed under the terms of Sections 1 and 2
above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to
give any third party, for a charge no more than your cost of physically
performing source distribution, a complete machine-readable copy of the
corresponding source code, to be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to
distribute corresponding source code. (This alternative is allowed only
for noncommercial distribution and only if you received the program in
object code or executable form with such an offer, in accord with
Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source code
means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to control
compilation and installation of the executable. However, as a special
exception, the source code distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies the
executable.
If distribution of executable or object code is made by offering access
to copy from a designated place, then offering equivalent access to copy
the source code from the same place counts as distribution of the source
code, even though third parties are not compelled to copy the source
along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt otherwise
to copy, modify, sublicense or distribute the Program is void, and will
automatically terminate your rights under this License. However, parties
who have received copies, or rights, from you under this License will
not have their licenses terminated so long as such parties remain in
full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and all
its terms and conditions for copying, distributing or modifying the
Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further restrictions
on the recipients' exercise of the rights granted herein. You are not
responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot distribute
so as to satisfy simultaneously your obligations under this License and
any other pertinent obligations, then as a consequence you may not
distribute the Program at all. For example, if a patent license would
not permit royalty-free redistribution of the Program by all those who
receive copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely from
distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is implemented
by public license practices. Many people have made generous
contributions to the wide range of software distributed through that
system in reliance on consistent application of that system; it is up to
the author/donor to decide if he or she is willing to distribute
software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be
a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License may
add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among countries
not thus excluded. In such case, this License incorporates the
limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Program does not specify a version
number of this License, you may choose any version ever published by the
Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the
author to ask for permission. For software which is copyrighted by the
Free Software Foundation, write to the Free Software Foundation; we
sometimes make exceptions for this. Our decision will be guided by the
two goals of preserving the free status of all derivatives of our free
software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

View File

@ -1,7 +1,6 @@
dhtmlxScheduler v.2.3
dhtmlxScheduler v.3.0 build 110727
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
to use it in non-GPL project. Please contact sales@dhtmlx.com for details
(c) DHTMLX Ltd.

View File

@ -1,4 +1,19 @@
/*
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
*/
scheduler.date={
init:function(){
var s = scheduler.locale.date.month_short;
var t = scheduler.locale.date.month_short_hash = {};
for (var i = 0; i < s.length; i++)
t[s[i]]=i;
var s = scheduler.locale.date.month_full;
var t = scheduler.locale.date.month_full_hash = {};
for (var i = 0; i < s.length; i++)
t[s[i]]=i;
},
date_part:function(date){
date.setHours(0);
date.setMinutes(0);
@ -12,7 +27,7 @@ scheduler.date={
week_start:function(date){
var shift=date.getDay();
if (scheduler.config.start_on_monday){
if (shift==0) shift=6
if (shift===0) shift=6;
else shift--;
}
return this.date_part(this.add(date,-1*shift,"day"));
@ -31,7 +46,14 @@ scheduler.date={
add:function(date,inc,mode){
var ndate=new Date(date.valueOf());
switch(mode){
case "day": ndate.setDate(ndate.getDate()+inc); break;
case "day":
ndate.setDate(ndate.getDate()+inc);
if(date.getDate()==ndate.getDate() && !!inc) {
do {
ndate.setTime(ndate.getTime()+60*60*1000);
} while (date.getDate() == ndate.getDate())
}
break;
case "week": ndate.setDate(ndate.getDate()+7*inc); break;
case "month": ndate.setMonth(ndate.getMonth()+inc); break;
case "year": ndate.setYear(ndate.getFullYear()+inc); break;
@ -73,7 +95,7 @@ scheduler.date={
case "%W": return "\"+scheduler.date.to_fixed(scheduler.date.getISOWeek(date))+\"";
default: return a;
}
})
});
if (utc) format=format.replace(/date\.get/g,"date.getUTC");
return new Function("date","return \""+format+"\";");
},
@ -106,6 +128,12 @@ scheduler.date={
break;
case "%s": splt+="set[5]=temp["+i+"]||0;";
break;
case "%M": splt+="set[1]=scheduler.locale.date.month_short_hash[temp["+i+"]]||0;";
break;
case "%F": splt+="set[1]=scheduler.locale.date.month_full_hash[temp["+i+"]]||0;";
break;
default:
break;
}
}
var code ="set[0],set[1],set[2],set[3],set[4],set[5]";
@ -116,18 +144,18 @@ scheduler.date={
getISOWeek: function(ndate) {
if(!ndate) return false;
var nday = ndate.getDay();
if (nday == 0) {
if (nday === 0) {
nday = 7;
}
var first_thursday = new Date(ndate.valueOf());
first_thursday.setDate(ndate.getDate() + (4 - nday));
var year_number = first_thursday.getFullYear(); // year of the first Thursday
var ordinal_date = Math.floor( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)
var ordinal_date = Math.round( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)
var week_number = 1 + Math.floor( ordinal_date / 7);
return week_number;
},
getUTCISOWeek: function(ndate){
return this.getISOWeek(ndate);
}
}
return this.getISOWeek(ndate);
}
};

View File

@ -1,3 +1,7 @@
/*
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_cal_ltext{
text-align:left;
}

View File

@ -1,3 +1,7 @@
/*
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
*/
/*
%e Day of the month without leading zeros (01..31)
%d Day of the month, 2 digits with leading zeros (01..31)
@ -39,27 +43,35 @@ scheduler.config={
edit_on_create:1,
details_on_create:0,
click_form_details:0,
cascade_event_display: false,
cascade_event_count:4,
cascade_event_margin: 30,
drag_lightbox:true,
preserve_scroll:true,
server_utc:false,
positive_closing:false,
icons_edit:["icon_save","icon_cancel"],
icons_select:["icon_details","icon_edit","icon_delete"],
buttons_left:["dhx_save_btn","dhx_cancel_btn"],
buttons_right:["dhx_delete_btn"],
lightbox:{
sections:[ {name:"description", height:200, map_to:"text", type:"textarea" , focus:true},
{name:"time", height:72, type:"time", map_to:"auto"} ]
}
},
repeat_date_of_end: "01.01.2010"
};
scheduler.templates={}
scheduler.templates={};
scheduler.init_templates=function(){
var d=scheduler.date.date_to_str;
var c=scheduler.config;
var f = function(a,b){
for (var c in b)
if (!a[c]) a[c]=b[c];
}
};
f(scheduler.templates,{
day_date:d(c.default_date),
month_date:d(c.month_date),
@ -99,7 +111,7 @@ scheduler.init_templates=function(){
return ev.text;
}
});
this.callEvent("onTemplatesReady",[])
}
this.callEvent("onTemplatesReady",[]);
};

View File

@ -1,3 +1,7 @@
/*
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
@ -7,10 +11,10 @@ if (window.dhtmlXGridObject){
dhtmlXGridObject.prototype._init_point=function(){
var clear_url=function(url){
url=url.replace(/(\?|\&)connector[^\f]*/g,"");
return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(mygrid.hdr.rows.length > 0 ? "&dhx_no_header=1":"");
return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(this.hdr.rows.length > 0 ? "&dhx_no_header=1":"");
};
var combine_urls=function(url){
return clear_url(url)+(this._connector_sorting||"")+(this._connector_filter||"");
return clear_url.call(this,url)+(this._connector_sorting||"")+(this._connector_filter||"");
};
var sorting_url=function(url,ind,dir){
this._connector_sorting="&dhx_sort["+ind+"]="+dir;
@ -112,14 +116,10 @@ if (window.dhtmlXGridObject){
}
if (this._con_f_used[f*1])
this._con_f_used[f*1]=v;
};
}
this._colls_loaded=true;
}
};
};
}
if (window.dataProcessor){
@ -131,7 +131,9 @@ if (window.dataProcessor){
this.setTransactionMode("POST",true);
this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true";
};
};
}
dhtmlxError.catchError("LoadXML",function(a,b,c){
alert(c[0].responseText);
if (c[0].status != 0) {
alert(c[0].responseText);
}
});

View File

@ -1,3 +1,7 @@
/*
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
*/
scheduler._dp_init=function(dp){
dp._methods=["setEventTextStyle","","changeEventId","deleteEvent"];
@ -5,7 +9,7 @@ scheduler._dp_init=function(dp){
if (!this._loading && this.validId(id))
dp.setUpdated(id,true,"inserted");
});
this.attachEvent("onBeforeEventDelete",function(id){
this.attachEvent("onConfirmedBeforeEventDelete", function(id){
if (!this.validId(id)) return;
var z=dp.getState(id);

View File

@ -0,0 +1,200 @@
/*
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.protoUI({
name:"dayevents",
defaults:{
hourFormat:"%H",
hourClock:12,
firstHour:0,
lastHour:24,
timeScaleWidth:45,
timeScaleHeight: 30,
scroll:true,
scaleBorder:1,
eventOffset:5,
width:"auto",
date: new Date()
},
$init:function(config){
this.name = "DayEvents";
this._dataobj.style.position = "relative";
this.data.provideApi(this,true);
this.data.attachEvent("onStoreUpdated",dhx.bind(this.render,this));
this.attachEvent("onBeforeRender", function(){
this._renderScale();
this.type.color = this.config.color;
this.type.textColor = this.config.textColor;
this._renderobj = this._dataobj.firstChild;
this._prepareEvents();
if(window.scheduler)
this.type.template = scheduler.templates.day_event;
});
if(window.scheduler){
config.hourFormat = scheduler.config.scale_hour;
config.timeScaleWidth = scheduler.xy.scale_width;
config.timeScaleHeight = scheduler.xy.scale_height*2;
}
},
_renderScale:function(){
var html = "<div></div>";
for(var h = this.config.firstHour; h<this.config.lastHour; h++){
html += this.hourScaleItem(h);
}
this._dataobj.innerHTML = html;
},
_id:"dhx_l_id",
on_click:{
},
hourScaleItem: function(hour){
var isAM = (scheduler.config.hour_date.toLowerCase().indexOf("a")!=-1);
var top = '00';
var bottom = '30';
if(isAM){
if(hour===0)
top = 'AM';
if(hour==12)
top = 'PM';
hour = (hour+11)%12+1;
}
if(this.config.hourFormat.indexOf("H")!=-1)
hour = dhx.math.toFixed(hour);
var html = "";
var timeScaleWidth = this.config.timeScaleWidth;
var hourHeight = this.config.timeScaleHeight;
var sectionWidth = Math.floor(this.config.timeScaleWidth/2);
var heightTop = Math.floor(hourHeight/2);
var heightBottom = heightTop-this.config.scaleBorder;
var eventZoneWidth = this._content_width-this.config.scaleBorder-this.config.timeScaleWidth;
html += "<div style='width: 100%; height:"+hourHeight+"px;' class='dhx_dayevents_scale_item'>";
html += "<div class='dhx_dayevents_scale_hour' style='width:"+sectionWidth+"px; height:"+hourHeight+"px;line-height:"+hourHeight+"px;'>"+hour+"</div>";
html += "<div class='dhx_dayevents_scale_minute' style='width:"+sectionWidth+"px'>";
html += "<div class='dhx_dayevents_scale_top' style='width:"+sectionWidth+"px;line-height:"+heightTop+"px'>"+top+"</div>";
html += "<div class='dhx_dayevents_scale_bottom' style='width:"+sectionWidth+"px;line-height:"+heightBottom+"px'>"+bottom+"</div>";
html += "</div>";
html += "<div class='dhx_dayevents_scale_event' style='width:"+eventZoneWidth+"px'>";
html += "<div class='dhx_dayevents_scale_top' style='height:"+heightTop+"px;width:"+eventZoneWidth+"px'></div>";
html += "<div class='dhx_dayevents_scale_bottom' style='width: "+eventZoneWidth+"px;height:"+heightBottom+"px; '></div>";
html += "</div>";
html += "</div>";
return html;
},
type:{
templateStart:dhx.Template("<div dhx_l_id='#id#' class='dhx_dayevents_event_item {common.templateCss()}' style='left:#$left#px;top:#$top#px;width:#$width#px;height:#$height#px;padding:{common.padding}px;overflow:hidden; background-color:{common.templateColor()} ;color:{common.templateTextColor()};'>"),
template:scheduler.templates.day_event,
templateEnd:dhx.Template("</div>"),
templateCss:dhx.Template(""),
templateColor:dhx.Template("#color#"),
templateTextColor:dhx.Template("#textColor#"),
padding:2
},
_prepareEvents:function(){
var evs = this.data.getRange();
var stack = [];
var ev,i,j,k,_is_sorder,_max_sorder,_sorder_set;
for(i=0; i< evs.length;i++){
ev=evs[i];
ev.$inner=false;
while (stack.length && stack[stack.length-1].end_date.valueOf()<=ev.start_date.valueOf()){
stack.splice(stack.length-1,1);
}
_sorder_set = false;
for(j=0;j< stack.length;j++){
if(stack[j].end_date.valueOf()<=ev.start_date.valueOf()){
_sorder_set = true;
ev.$sorder=stack[j].$sorder;
stack.splice(j,1);
ev.$inner=true;
break;
}
}
if (stack.length) stack[stack.length-1].$inner=true;
if(!_sorder_set){
if(stack.length){
if(stack.length<=stack[stack.length-1].$sorder){
if(!stack[stack.length-1].$sorder)
ev.$sorder = 0;
else
for(j=0;j<stack.length;j++){
_is_sorder = false;
for(k=0;k<stack.length;k++){
if(stack[k].$sorder==j){
_is_sorder = true;
break;
}
}
if(!_is_sorder){
ev.$sorder = j;
break;
}
}
ev.$inner = true;
}
else{
var _max_sorder = stack[0].$sorder;
for(j =1;j < stack.length; j++)
if(stack[j].$sorder>_max_sorder)
_max_sorder = stack[j].$sorder;
ev.$sorder = _max_sorder+1;
ev.$inner = false;
}
}
else
ev.$sorder = 0;
}
stack.push(ev);
if (stack.length>(stack.max_count||0)) stack.max_count=stack.length;
}
for (var i=0; i < evs.length; i++){
evs[i].$count=stack.max_count;
this._setPosition(evs[i]);
}
},
_setPosition:function(ev){
var date = this.config.date.getValue?this.config.date.getValue():this.config.date;
var start = dhx.Date.copy(ev.start_date);
var end = dhx.Date.copy(ev.end_date);
var sh = start.getHours();
var eh = end.getHours();
if(dhx.Date.datePart(start).valueOf()>dhx.Date.datePart(end).valueOf()){
end = start;
}
if(dhx.Date.datePart(start).valueOf()<dhx.Date.datePart(date).valueOf()){
start = dhx.Date.datePart(date);
}
if(dhx.Date.datePart(end).valueOf()>dhx.Date.datePart(date).valueOf()){
end = dhx.Date.datePart(date);
end.setMinutes(0);
end.setHours(this.config.lastHour);
}
if (sh < this.config.firstHour || eh >= this.config.lastHour){
if (sh < this.config.firstHour){
end.setHours(this.config.firstHour);
ev.start_date.setMinutes(0);
}
if (eh >= this.config.lastHour){
end.setMinutes(0);
end.setHours(this.config.lastHour);
}
}
var temp_width = Math.floor((this._content_width-this.config.timeScaleWidth-this.config.eventOffset-8)/ev.$count);
ev.$left=ev.$sorder*(temp_width)+this.config.timeScaleWidth+this.config.eventOffset;
if (!ev.$inner) temp_width=temp_width*(ev.$count-ev.$sorder);
ev.$width = temp_width-this.config.eventOffset-this.type.padding*2;
var sm = start.getHours()*60+start.getMinutes();
var em = (end.getHours()*60+end.getMinutes())||(this.config.lastHour*60);
ev.$top = Math.round((sm-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60); //42px/hour
ev.$height = Math.max(10,(em-sm)*(this.config.timeScaleHeight+1)/60-2)-this.type.padding*2;
}
}, dhx.MouseEvents, dhx.SelectionModel, dhx.Scrollable, dhx.RenderStack, dhx.DataLoader, dhx.ui.view, dhx.EventSystem, dhx.Settings);

View File

@ -1,3 +1,37 @@
/*
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
*/
dhtmlx=function(obj){
for (var a in obj) dhtmlx[a]=obj[a];
return dhtmlx; //simple singleton
};
dhtmlx.extend_api=function(name,map,ext){
var t = window[name];
if (!t) return; //component not defined
window[name]=function(obj){
if (obj && typeof obj == "object" && !obj.tagName && !(obj instanceof Array)){
var that = t.apply(this,(map._init?map._init(obj):arguments));
//global settings
for (var a in dhtmlx)
if (map[a]) this[map[a]](dhtmlx[a]);
//local settings
for (var a in obj){
if (map[a]) this[map[a]](obj[a]);
else if (a.indexOf("on")==0){
this.attachEvent(a,obj[a]);
}
}
} else
var that = t.apply(this,arguments);
if (map._patch) map._patch(this);
return that||this;
};
window[name].prototype=t.prototype;
if (ext)
dhtmlXHeir(window[name].prototype,ext);
};
dhtmlxAjax={
get:function(url,callback){
var t=new dtmlXMLLoaderObject(true);
@ -546,12 +580,15 @@ dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){
}
}
var _isFF = false;
var _isIE = false;
var _isOpera = false;
var _isKHTML = false;
var _isMacOS = false;
var _isChrome = false;
_isFF = false;
_isIE = false;
_isOpera = false;
_isKHTML = false;
_isMacOS = false;
_isChrome = false;
_KHTMLrv = false;
_OperaRv = false;
_FFrv = false;
if (navigator.userAgent.indexOf('Macintosh') != -1)
_isMacOS=true;
@ -868,4 +905,10 @@ dhtmlxEventable=function(obj){
this[list[0]].removeEvent(list[1]); //remove event
}
}
obj.detachAllEvents = function(){
for (var name in this){
if (name.indexOf("ev_")==0)
delete this[name];
}
}
}

View File

@ -1,3 +1,7 @@
/*
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
*/
/**
* @desc: constructor, data processor object
* @param: serverProcessorURL - url used for update
@ -362,6 +366,8 @@ dataProcessor.prototype={
var soid = sid;
switch (action) {
case "update":
case "updated":
case "inserted":
case "insert":
if (tid != sid) {

View File

@ -1,3 +1,7 @@
/*
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
*/
dataProcessor.prototype._o_init = dataProcessor.prototype.init;
dataProcessor.prototype.init=function(obj){
this._console=this._console||this._createConsole();
@ -86,7 +90,7 @@ dataProcessor.wrap("sendData",function(rowId){
if (!this.obj._idpull[rowId])
this._log("&nbsp;Error! item with such ID not exists <b>"+rowId+"</b>");
} else {
if (!this.obj.rowsAr[rowId])
if (this.rowsAr && !this.obj.rowsAr[rowId])
this._log("&nbsp;Error! row with such ID not exists <b>"+rowId+"</b>");
}
}
@ -150,7 +154,7 @@ dataProcessor.wrap("afterUpdateCallback",function(sid,tid,action){
if (this.obj.mytype=="tree"){
if (!this.obj._idpull[sid]) this._log("Incorrect SID, item with such ID not exists in grid");
} else {
if (!this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid");
if (this.obj.rowsAr && !this.obj.rowsAr[sid]) this._log("Incorrect SID, row with such ID not exists in grid");
}
this._log("&nbsp;Action: "+action+" SID:"+sid+" TID:"+tid);
},function(){

View File

@ -0,0 +1,57 @@
/*
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
*/
if(dataProcessor) {
dataProcessor.prototype.enableJSONP = function(mode) {
if(mode) {
this._jsonp_attach_id = this.attachEvent("onBeforeDataSending", function(rowId,rowIdState,a1){
if (rowId)
this._in_progress[rowId]=(new Date()).valueOf();
var url = this.serverProcessor+(this._user?(getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):"");
url += ((url.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId);
this._jsonp(url, [], function(data){
var xml = new dtmlXMLLoaderObject(this.afterUpdate,this,true);
xml.loadXMLString(data);
this.afterUpdate(this, null, null, null, xml);
}, this);
this._waitMode++;
return false;
});
}
else {
if(this._jsonp_attach_id)
this.detachEvent(this._jsonp_attach_id);
}
};
dataProcessor.prototype._jsonp = function(url, params, callback, master){
var global_obj = "dataProcessor";
var id = "dp_jsonp_"+new Date().valueOf();
var script = document.createElement('script');
script.id = id;
script.type = 'text/javascript';
var head = document.getElementsByTagName("head")[0];
if (!params)
params = {};
params.jsonp = global_obj+"."+id; // would be called as dataProcessor.dp_jsonp_1938948394
dataProcessor[id]=function(){
callback.apply(master||window, arguments);
script.parentNode.removeChild(script);
callback = head = master = script = null;
delete dataProcessor[id];
};
var vals = [];
for (var key in params) vals.push(key+"="+encodeURIComponent(params[key]));
url += (url.indexOf("?") == -1 ? "?" : "&")+vals.join("&");
script.src = url ;
head.appendChild(script);
};
}

Some files were not shown because too many files have changed in this diff Show More