home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Programming / dhtmlxMenu.exe / dhtmlxMenu / libCompiler / dhtmlxcommon.js < prev    next >
Encoding:
Text File  |  2009-10-02  |  24.2 KB  |  909 lines

  1. dhtmlx=function(obj){
  2.     for (var a in obj) dhtmlx[a]=obj[a];
  3.     return dhtmlx; //simple singleton
  4. };
  5. dhtmlx.extend_api=function(name,map,ext){
  6.     var t = window[name];
  7.     if (!t) return; //component not defined
  8.     window[name]=function(obj){
  9.         if (obj && typeof obj == "object" && !obj.tagName){
  10.             var that = t.apply(this,(map._init?map._init(obj):arguments));
  11.             //global settings
  12.             for (var a in dhtmlx)
  13.                 if (map[a]) this[map[a]](dhtmlx[a]);            
  14.             //local settings
  15.             for (var a in obj){
  16.                 if (map[a]) this[map[a]](obj[a]);
  17.                 else if (a.indexOf("on")==0){
  18.                     this.attachEvent(a,obj[a]);
  19.                 }
  20.             }
  21.         } else
  22.             var that = t.apply(this,arguments);
  23.         if (map._patch) map._patch(this);
  24.         return that||this;
  25.     };
  26.     window[name].prototype=t.prototype;
  27.     if (ext)
  28.         dhtmlXHeir(window[name].prototype,ext);
  29. };
  30.  
  31. dhtmlxAjax={
  32.     get:function(url,callback){
  33.         var t=new dtmlXMLLoaderObject(true);
  34.         t.async=(arguments.length<3);
  35.         t.waitCall=callback;
  36.         t.loadXML(url)
  37.         return t;
  38.     },
  39.     post:function(url,post,callback){
  40.         var t=new dtmlXMLLoaderObject(true);
  41.         t.async=(arguments.length<4);
  42.         t.waitCall=callback;
  43.         t.loadXML(url,true,post)
  44.         return t;
  45.     },
  46.     getSync:function(url){
  47.         return this.get(url,null,true)
  48.     },
  49.     postSync:function(url,post){
  50.         return this.post(url,post,null,true);        
  51.     }
  52. }
  53.  
  54. /**
  55.   *     @desc: xmlLoader object
  56.   *     @type: private
  57.   *     @param: funcObject - xml parser function
  58.   *     @param: object - jsControl object
  59.   *     @param: async - sync/async mode (async by default)
  60.   *     @param: rSeed - enable/disable random seed ( prevent IE caching)
  61.   *     @topic: 0
  62.   */
  63. function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){
  64.     this.xmlDoc="";
  65.  
  66.     if (typeof (async) != "undefined")
  67.         this.async=async;
  68.     else
  69.         this.async=true;
  70.  
  71.     this.onloadAction=funcObject||null;
  72.     this.mainObject=dhtmlObject||null;
  73.     this.waitCall=null;
  74.     this.rSeed=rSeed||false;
  75.     return this;
  76. };
  77. /**
  78.   *     @desc: xml loading handler
  79.   *     @type: private
  80.   *     @param: dtmlObject - xmlLoader object
  81.   *     @topic: 0
  82.   */
  83. dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){
  84.     var once = true;
  85.     this.check=function (){
  86.         if ((dhtmlObject)&&(dhtmlObject.onloadAction != null)){
  87.             if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){
  88.                 if (!once)
  89.                     return;
  90.  
  91.                 once=false; //IE 5 fix
  92.                 if (typeof dhtmlObject.onloadAction == "function")
  93.                     dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);
  94.  
  95.                 if (dhtmlObject.waitCall){
  96.                     dhtmlObject.waitCall.call(this,dhtmlObject);
  97.                     dhtmlObject.waitCall=null;
  98.                 }
  99.             }
  100.         }
  101.     };
  102.     return this.check;
  103. };
  104.  
  105. /**
  106.   *     @desc: return XML top node
  107.   *     @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla)
  108.   *     @type: private
  109.   *     @returns: top XML node
  110.   *     @topic: 0  
  111.   */
  112. dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){
  113.     if (this.xmlDoc.responseXML){
  114.         var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
  115.         if(temp.length==0 && tagName.indexOf(":")!=-1)
  116.             var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]);
  117.         var z = temp[0];
  118.     } else
  119.         var z = this.xmlDoc.documentElement;
  120.  
  121.     if (z){
  122.         this._retry=false;
  123.         return z;
  124.     }
  125.  
  126.     if ((_isIE)&&(!this._retry)){
  127.         //fall back to MS.XMLDOM
  128.         var xmlString = this.xmlDoc.responseText;
  129.         var oldObj = this.xmlDoc;
  130.         this._retry=true;
  131.         this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  132.         this.xmlDoc.async=false;
  133.         this.xmlDoc["loadXM"+"L"](xmlString);
  134.  
  135.         return this.getXMLTopNode(tagName, oldObj);
  136.     }
  137.     dhtmlxError.throwError("LoadXML", "Incorrect XML", [
  138.         (oldObj||this.xmlDoc),
  139.         this.mainObject
  140.     ]);
  141.  
  142.     return document.createElement("DIV");
  143. };
  144.  
  145. /**
  146.   *     @desc: load XML from string
  147.   *     @type: private
  148.   *     @param: xmlString - xml string
  149.   *     @topic: 0  
  150.   */
  151. dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
  152.     {
  153.         try{
  154.             var parser = new DOMParser();
  155.             this.xmlDoc=parser.parseFromString(xmlString, "text/xml");
  156.         }
  157.         catch (e){
  158.             this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  159.             this.xmlDoc.async=this.async;
  160.             this.xmlDoc["loadXM"+"L"](xmlString);
  161.         }
  162.     }
  163.  
  164.     this.onloadAction(this.mainObject, null, null, null, this);
  165.  
  166.     if (this.waitCall){
  167.         this.waitCall();
  168.         this.waitCall=null;
  169.     }
  170. }
  171. /**
  172.   *     @desc: load XML
  173.   *     @type: private
  174.   *     @param: filePath - xml file path
  175.   *     @param: postMode - send POST request
  176.   *     @param: postVars - list of vars for post request
  177.   *     @topic: 0
  178.   */
  179. dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){
  180.     if (this.rSeed)
  181.         filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf();
  182.     this.filePath=filePath;
  183.  
  184.     if ((!_isIE)&&(window.XMLHttpRequest))
  185.         this.xmlDoc=new XMLHttpRequest();
  186.     else {
  187.         if (document.implementation&&document.implementation.createDocument){
  188.             this.xmlDoc=document.implementation.createDocument("", "", null);
  189.             this.xmlDoc.onload=new this.waitLoadFunction(this);
  190.             this.xmlDoc.load(filePath);
  191.             return;
  192.         } else
  193.             this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP");
  194.     }
  195.  
  196.     if (this.async)
  197.         this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
  198.     this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
  199.  
  200.     if (rpc){
  201.         this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")");
  202.         this.xmlDoc.setRequestHeader("Content-type", "text/xml");
  203.     }
  204.  
  205.     else if (postMode)
  206.         this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  207.         
  208.     this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");
  209.     this.xmlDoc.send(null||postVars);
  210.  
  211.     if (!this.async)
  212.         (new this.waitLoadFunction(this))();
  213. };
  214. /**
  215.   *     @desc: destructor, cleans used memory
  216.   *     @type: private
  217.   *     @topic: 0
  218.   */
  219. dtmlXMLLoaderObject.prototype.destructor=function(){
  220.     this.onloadAction=null;
  221.     this.mainObject=null;
  222.     this.xmlDoc=null;
  223.     return null;
  224. }
  225.  
  226. dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){
  227.         var t={};
  228.         for (var i=0; i<node.attributes.length; i++)
  229.             t[node.attributes[i].name]=node.attributes[i].value;
  230.         t["_tagvalue"]=node.firstChild?node.firstChild.nodeValue:"";
  231.         for (var i=0; i<node.childNodes.length; i++){
  232.             var name=node.childNodes[i].tagName;
  233.             if (name){
  234.                 if (!t[name]) t[name]=[];
  235.                 t[name].push(this.xmlNodeToJSON(node.childNodes[i]));
  236.             }            
  237.         }        
  238.         return t;
  239.     }
  240.  
  241. /**  
  242.   *     @desc: Call wrapper
  243.   *     @type: private
  244.   *     @param: funcObject - action handler
  245.   *     @param: dhtmlObject - user data
  246.   *     @returns: function handler
  247.   *     @topic: 0  
  248.   */
  249. function callerFunction(funcObject, dhtmlObject){
  250.     this.handler=function(e){
  251.         if (!e)
  252.             e=window.event;
  253.         funcObject(e, dhtmlObject);
  254.         return true;
  255.     };
  256.     return this.handler;
  257. };
  258.  
  259. /**  
  260.   *     @desc: Calculate absolute position of html object
  261.   *     @type: private
  262.   *     @param: htmlObject - html object
  263.   *     @topic: 0  
  264.   */
  265. function getAbsoluteLeft(htmlObject){
  266.     return getOffset(htmlObject).left;
  267. }
  268. /**
  269.   *     @desc: Calculate absolute position of html object
  270.   *     @type: private
  271.   *     @param: htmlObject - html object
  272.   *     @topic: 0  
  273.   */
  274. function getAbsoluteTop(htmlObject){
  275.     return getOffset(htmlObject).top;
  276. }
  277.  
  278. function getOffsetSum(elem) {
  279.     var top=0, left=0;
  280.     while(elem) {
  281.         top = top + parseInt(elem.offsetTop);
  282.         left = left + parseInt(elem.offsetLeft);
  283.         elem = elem.offsetParent;
  284.     }
  285.     return {top: top, left: left};
  286. }
  287. function getOffsetRect(elem) {
  288.     var box = elem.getBoundingClientRect();
  289.     var body = document.body;
  290.     var docElem = document.documentElement;
  291.     var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
  292.     var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
  293.     var clientTop = docElem.clientTop || body.clientTop || 0;
  294.     var clientLeft = docElem.clientLeft || body.clientLeft || 0;
  295.     var top  = box.top +  scrollTop - clientTop;
  296.     var left = box.left + scrollLeft - clientLeft;
  297.     return { top: Math.round(top), left: Math.round(left) };
  298. }
  299. function getOffset(elem) {
  300.     if (elem.getBoundingClientRect && !_isChrome) {
  301.         return getOffsetRect(elem);
  302.     } else {
  303.         return getOffsetSum(elem);
  304.     }
  305. }
  306.  
  307. /**  
  308. *     @desc: Convert string to it boolean representation
  309. *     @type: private
  310. *     @param: inputString - string for covertion
  311. *     @topic: 0
  312. */
  313. function convertStringToBoolean(inputString){
  314.     if (typeof (inputString) == "string")
  315.         inputString=inputString.toLowerCase();
  316.  
  317.     switch (inputString){
  318.         case "1":
  319.         case "true":
  320.         case "yes":
  321.         case "y":
  322.         case 1:
  323.         case true:
  324.             return true;
  325.             break;
  326.  
  327.         default: return false;
  328.     }
  329. }
  330.  
  331. /**  
  332. *     @desc: find out what symbol to use as url param delimiters in further params
  333. *     @type: private
  334. *     @param: str - current url string
  335. *     @topic: 0  
  336. */
  337. function getUrlSymbol(str){
  338.     if (str.indexOf("?") != -1)
  339.         return "&"
  340.     else
  341.         return "?"
  342. }
  343.  
  344. function dhtmlDragAndDropObject(){
  345.     if (window.dhtmlDragAndDrop)
  346.         return window.dhtmlDragAndDrop;
  347.  
  348.     this.lastLanding=0;
  349.     this.dragNode=0;
  350.     this.dragStartNode=0;
  351.     this.dragStartObject=0;
  352.     this.tempDOMU=null;
  353.     this.tempDOMM=null;
  354.     this.waitDrag=0;
  355.     window.dhtmlDragAndDrop=this;
  356.  
  357.     return this;
  358. };
  359.  
  360. dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){
  361.     htmlNode.onmousedown=null;
  362.     htmlNode.dragStarter=null;
  363.     htmlNode.dragLanding=null;
  364. }
  365. dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode, dhtmlObject){
  366.     htmlNode.onmousedown=this.preCreateDragCopy;
  367.     htmlNode.dragStarter=dhtmlObject;
  368.     this.addDragLanding(htmlNode, dhtmlObject);
  369. }
  370. dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode, dhtmlObject){
  371.     htmlNode.dragLanding=dhtmlObject;
  372. }
  373. dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e){
  374.     if ((e||event) && (e||event).button == 2)
  375.         return;
  376.  
  377.     if (window.dhtmlDragAndDrop.waitDrag){
  378.         window.dhtmlDragAndDrop.waitDrag=0;
  379.         document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU;
  380.         document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM;
  381.         return false;
  382.     }
  383.  
  384.     window.dhtmlDragAndDrop.waitDrag=1;
  385.     window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup;
  386.     window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove;
  387.     window.dhtmlDragAndDrop.dragStartNode=this;
  388.     window.dhtmlDragAndDrop.dragStartObject=this.dragStarter;
  389.     document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy;
  390.     document.body.onmousemove=window.dhtmlDragAndDrop.callDrag;
  391.     window.dhtmlDragAndDrop.downtime = new Date().valueOf();
  392.     
  393.  
  394.     if ((e)&&(e.preventDefault)){
  395.         e.preventDefault();
  396.         return false;
  397.     }
  398.     return false;
  399. };
  400. dhtmlDragAndDropObject.prototype.callDrag=function(e){
  401.     if (!e)
  402.         e=window.event;
  403.     dragger=window.dhtmlDragAndDrop;
  404.     if ((new Date()).valueOf()-dragger.downtime<100) return;
  405.  
  406.     if ((e.button == 0)&&(_isIE))
  407.         return dragger.stopDrag();
  408.  
  409.     if (!dragger.dragNode&&dragger.waitDrag){
  410.         dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode, e);
  411.  
  412.         if (!dragger.dragNode)
  413.             return dragger.stopDrag();
  414.  
  415.         dragger.dragNode.onselectstart=function(){return false;}
  416.         dragger.gldragNode=dragger.dragNode;
  417.         document.body.appendChild(dragger.dragNode);
  418.         document.body.onmouseup=dragger.stopDrag;
  419.         dragger.waitDrag=0;
  420.         dragger.dragNode.pWindow=window;
  421.         dragger.initFrameRoute();
  422.     }
  423.  
  424.     if (dragger.dragNode.parentNode != window.document.body){
  425.         var grd = dragger.gldragNode;
  426.  
  427.         if (dragger.gldragNode.old)
  428.             grd=dragger.gldragNode.old;
  429.  
  430.         //if (!document.all) dragger.calculateFramePosition();
  431.         grd.parentNode.removeChild(grd);
  432.         var oldBody = dragger.dragNode.pWindow;
  433.  
  434.         //        var oldp=dragger.dragNode.parentObject;
  435.         if (_isIE){
  436.             var div = document.createElement("Div");
  437.             div.innerHTML=dragger.dragNode.outerHTML;
  438.             dragger.dragNode=div.childNodes[0];
  439.         } else
  440.             dragger.dragNode=dragger.dragNode.cloneNode(true);
  441.  
  442.         dragger.dragNode.pWindow=window;
  443.         //        dragger.dragNode.parentObject=oldp;
  444.  
  445.         dragger.gldragNode.old=dragger.dragNode;
  446.         document.body.appendChild(dragger.dragNode);
  447.         oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode;
  448.     }
  449.  
  450.     dragger.dragNode.style.left=e.clientX+15+(dragger.fx
  451.         ? dragger.fx*(-1)
  452.         : 0)
  453.         +(document.body.scrollLeft||document.documentElement.scrollLeft)+"px";
  454.     dragger.dragNode.style.top=e.clientY+3+(dragger.fy
  455.         ? dragger.fy*(-1)
  456.         : 0)
  457.         +(document.body.scrollTop||document.documentElement.scrollTop)+"px";
  458.  
  459.     if (!e.srcElement)
  460.         var z = e.target;
  461.     else
  462.         z=e.srcElement;
  463.     dragger.checkLanding(z, e);
  464. }
  465.  
  466. dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){
  467.     //this.fx = 0, this.fy = 0;
  468.     if (window.name){
  469.         var el = parent.frames[window.name].frameElement.offsetParent;
  470.         var fx = 0;
  471.         var fy = 0;
  472.  
  473.         while (el){
  474.             fx+=el.offsetLeft;
  475.             fy+=el.offsetTop;
  476.             el=el.offsetParent;
  477.         }
  478.  
  479.         if ((parent.dhtmlDragAndDrop)){
  480.             var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1);
  481.             fx+=ls.split('_')[0]*1;
  482.             fy+=ls.split('_')[1]*1;
  483.         }
  484.  
  485.         if (n)
  486.             return fx+"_"+fy;
  487.         else
  488.             this.fx=fx;
  489.         this.fy=fy;
  490.     }
  491.     return "0_0";
  492. }
  493. dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject, e){
  494.     if ((htmlObject)&&(htmlObject.dragLanding)){
  495.         if (this.lastLanding)
  496.             this.lastLanding.dragLanding._dragOut(this.lastLanding);
  497.         this.lastLanding=htmlObject;
  498.         this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX,
  499.             e.clientY, e);
  500.         this.lastLanding_scr=(_isIE ? e.srcElement : e.target);
  501.     } else {
  502.         if ((htmlObject)&&(htmlObject.tagName != "BODY"))
  503.             this.checkLanding(htmlObject.parentNode, e);
  504.         else {
  505.             if (this.lastLanding)
  506.                 this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e);
  507.             this.lastLanding=0;
  508.  
  509.             if (this._onNotFound)
  510.                 this._onNotFound();
  511.         }
  512.     }
  513. }
  514. dhtmlDragAndDropObject.prototype.stopDrag=function(e, mode){
  515.     dragger=window.dhtmlDragAndDrop;
  516.  
  517.     if (!mode){
  518.         dragger.stopFrameRoute();
  519.         var temp = dragger.lastLanding;
  520.         dragger.lastLanding=null;
  521.  
  522.         if (temp)
  523.             temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp, (_isIE
  524.                 ? event.srcElement
  525.                 : e.target));
  526.     }
  527.     dragger.lastLanding=null;
  528.  
  529.     if ((dragger.dragNode)&&(dragger.dragNode.parentNode == document.body))
  530.         dragger.dragNode.parentNode.removeChild(dragger.dragNode);
  531.     dragger.dragNode=0;
  532.     dragger.gldragNode=0;
  533.     dragger.fx=0;
  534.     dragger.fy=0;
  535.     dragger.dragStartNode=0;
  536.     dragger.dragStartObject=0;
  537.     document.body.onmouseup=dragger.tempDOMU;
  538.     document.body.onmousemove=dragger.tempDOMM;
  539.     dragger.tempDOMU=null;
  540.     dragger.tempDOMM=null;
  541.     dragger.waitDrag=0;
  542. }
  543.  
  544. dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){
  545.     if (win)
  546.         window.dhtmlDragAndDrop.stopDrag(1, 1);
  547.  
  548.     for (var i = 0; i < window.frames.length; i++){
  549.         try{
  550.         if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
  551.             window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window);
  552.         } catch(e){}
  553.     }
  554.  
  555.     try{
  556.     if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
  557.         parent.dhtmlDragAndDrop.stopFrameRoute(window);
  558.     } catch(e){}
  559. }
  560. dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){
  561.     if (win){
  562.         window.dhtmlDragAndDrop.preCreateDragCopy();
  563.         window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode;
  564.         window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject;
  565.         window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode;
  566.         window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode;
  567.         window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag;
  568.         window.waitDrag=0;
  569.  
  570.         if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv < 1.8)))
  571.             window.dhtmlDragAndDrop.calculateFramePosition();
  572.     }
  573.     try{
  574.     if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
  575.         parent.dhtmlDragAndDrop.initFrameRoute(window);
  576.     }catch(e){}
  577.  
  578.     for (var i = 0; i < window.frames.length; i++){
  579.         try{
  580.         if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
  581.             window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win||mode) ? 1 : 0));
  582.         } catch(e){}
  583.     }
  584. }
  585.  
  586. var _isFF = false;
  587. var _isIE = false;
  588. var _isOpera = false;
  589. var _isKHTML = false;
  590. var _isMacOS = false;
  591. var _isChrome = false;
  592.  
  593. if (navigator.userAgent.indexOf('Macintosh') != -1)
  594.     _isMacOS=true;
  595.  
  596.  
  597. if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1)
  598.     _isChrome=true;
  599.  
  600. if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){
  601.     var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));
  602.  
  603.     if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+
  604.         _isFF=true;
  605.         var _FFrv = 1.9;
  606.     } else
  607.         _isKHTML=true;
  608. } else if (navigator.userAgent.indexOf('Opera') != -1){
  609.     _isOpera=true;
  610.     _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));
  611. }
  612.  
  613.  
  614. else if (navigator.appName.indexOf("Microsoft") != -1){
  615.     _isIE=true;
  616.     if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;
  617. } else {
  618.     _isFF=true;
  619.     var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
  620. }
  621.  
  622.  
  623. //multibrowser Xpath processor
  624. dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){
  625.     if (_isKHTML || (!_isIE && !window.XPathResult))
  626.         return this.doXPathOpera(xpathExp, docObj);
  627.  
  628.     if (_isIE){ //IE
  629.         if (!docObj)
  630.             if (!this.xmlDoc.nodeName)
  631.                 docObj=this.xmlDoc.responseXML
  632.             else
  633.                 docObj=this.xmlDoc;
  634.  
  635.         if (!docObj)
  636.             dhtmlxError.throwError("LoadXML", "Incorrect XML", [
  637.                 (docObj||this.xmlDoc),
  638.                 this.mainObject
  639.             ]);
  640.  
  641.         if (namespace != null)
  642.             docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); //
  643.  
  644.         if (result_type == 'single'){
  645.             return docObj.selectSingleNode(xpathExp);
  646.         }
  647.         else {
  648.             return docObj.selectNodes(xpathExp)||new Array(0);
  649.         }
  650.     } else { //Mozilla
  651.         var nodeObj = docObj;
  652.  
  653.         if (!docObj){
  654.             if (!this.xmlDoc.nodeName){
  655.                 docObj=this.xmlDoc.responseXML
  656.             }
  657.             else {
  658.                 docObj=this.xmlDoc;
  659.             }
  660.         }
  661.  
  662.         if (!docObj)
  663.             dhtmlxError.throwError("LoadXML", "Incorrect XML", [
  664.                 (docObj||this.xmlDoc),
  665.                 this.mainObject
  666.             ]);
  667.  
  668.         if (docObj.nodeName.indexOf("document") != -1){
  669.             nodeObj=docObj;
  670.         }
  671.         else {
  672.             nodeObj=docObj;
  673.             docObj=docObj.ownerDocument;
  674.         }
  675.         var retType = XPathResult.ANY_TYPE;
  676.  
  677.         if (result_type == 'single')
  678.             retType=XPathResult.FIRST_ORDERED_NODE_TYPE
  679.         var rowsCol = new Array();
  680.         var col = docObj.evaluate(xpathExp, nodeObj, function(pref){
  681.             return namespace
  682.         }, retType, null);
  683.  
  684.         if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){
  685.             return col.singleNodeValue;
  686.         }
  687.         var thisColMemb = col.iterateNext();
  688.  
  689.         while (thisColMemb){
  690.             rowsCol[rowsCol.length]=thisColMemb;
  691.             thisColMemb=col.iterateNext();
  692.         }
  693.         return rowsCol;
  694.     }
  695. }
  696.  
  697. function _dhtmlxError(type, name, params){
  698.     if (!this.catches)
  699.         this.catches=new Array();
  700.  
  701.     return this;
  702. }
  703.  
  704. _dhtmlxError.prototype.catchError=function(type, func_name){
  705.     this.catches[type]=func_name;
  706. }
  707. _dhtmlxError.prototype.throwError=function(type, name, params){
  708.     if (this.catches[type])
  709.         return this.catches[type](type, name, params);
  710.  
  711.     if (this.catches["ALL"])
  712.         return this.catches["ALL"](type, name, params);
  713.  
  714.     alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);
  715.     return null;
  716. }
  717.  
  718. window.dhtmlxError=new _dhtmlxError();
  719.  
  720.  
  721. //opera fake, while 9.0 not released
  722. //multibrowser Xpath processor
  723. dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){
  724.     //this is fake for Opera
  725.     var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
  726.     var obj = null;
  727.     var i = 1;
  728.  
  729.     if (!z.length)
  730.         return [];
  731.  
  732.     if (z[0] == ".")
  733.         obj=[docObj]; else if (z[0] == ""){
  734.         obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
  735.         i++;
  736.     } else
  737.         return [];
  738.  
  739.     for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]);
  740.  
  741.     if (z[i-1].indexOf("[") != -1)
  742.         obj=this._filterXPath(obj, z[i-1]);
  743.     return obj;
  744. }
  745.  
  746. dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){
  747.     var c = new Array();
  748.     var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
  749.  
  750.     for (var i = 0; i < a.length; i++)
  751.         if (a[i].getAttribute(b))
  752.             c[c.length]=a[i];
  753.  
  754.     return c;
  755. }
  756. dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){
  757.     var c = new Array();
  758.  
  759.     if (_isKHTML)
  760.         b=b.toUpperCase();
  761.  
  762.     for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){
  763.         if (_isKHTML){
  764.             if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b)
  765.                 c[c.length]=a[i].childNodes[j];
  766.         }
  767.  
  768.         else if (a[i].childNodes[j].tagName == b)
  769.             c[c.length]=a[i].childNodes[j];
  770.     }
  771.  
  772.     return c;
  773. }
  774.  
  775. function dhtmlXHeir(a, b){
  776.     for (var c in b)
  777.         if (typeof (b[c]) == "function")
  778.             a[c]=b[c];
  779.     return a;
  780. }
  781.  
  782. function dhtmlxEvent(el, event, handler){
  783.     if (el.addEventListener)
  784.         el.addEventListener(event, handler, false);
  785.  
  786.     else if (el.attachEvent)
  787.         el.attachEvent("on"+event, handler);
  788. }
  789.  
  790. //============= XSL Extension ===================================
  791.  
  792. dtmlXMLLoaderObject.prototype.xslDoc=null;
  793. dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){
  794.     if (!xslDoc)
  795.         xslDoc=this.xslDoc
  796.  
  797.     if (xslDoc.responseXML)
  798.         xslDoc=xslDoc.responseXML;
  799.     var item =
  800.         this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
  801.             "http:/\/www.w3.org/1999/XSL/Transform", "single");
  802.  
  803.     if (item != null)
  804.         item.firstChild.nodeValue=paramValue
  805. }
  806. dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){
  807.     if (!xslDoc)
  808.         xslDoc=this.xslDoc;
  809.  
  810.     if (xslDoc.responseXML)
  811.         xslDoc=xslDoc.responseXML
  812.  
  813.     if (!xmlDoc)
  814.         xmlDoc=this.xmlDoc;
  815.  
  816.     if (xmlDoc.responseXML)
  817.         xmlDoc=xmlDoc.responseXML
  818.  
  819.     //MOzilla
  820.     if (!_isIE){
  821.         if (!this.XSLProcessor){
  822.             this.XSLProcessor=new XSLTProcessor();
  823.             this.XSLProcessor.importStylesheet(xslDoc);
  824.         }
  825.         var result = this.XSLProcessor.transformToDocument(xmlDoc);
  826.     } else {
  827.         var result = new ActiveXObject("Msxml2.DOMDocument.3.0");
  828.         try{
  829.             xmlDoc.transformNodeToObject(xslDoc, result);
  830.         }catch(e){
  831.             result = xmlDoc.transformNode(xslDoc);
  832.         }
  833.     }
  834.     return result;
  835. }
  836.  
  837. dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){
  838.     var res = this.doXSLTransToObject(xslDoc, xmlDoc);
  839.     if(typeof(res)=="string")
  840.         return res;
  841.     return this.doSerialization(res);
  842. }
  843.  
  844. dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){
  845.     if (!xmlDoc)
  846.             xmlDoc=this.xmlDoc;
  847.     if (xmlDoc.responseXML)
  848.             xmlDoc=xmlDoc.responseXML
  849.     if (!_isIE){
  850.         var xmlSerializer = new XMLSerializer();
  851.         return xmlSerializer.serializeToString(xmlDoc);
  852.     } else
  853.         return xmlDoc.xml;
  854. }
  855.  
  856. /**
  857. *   @desc: 
  858. *   @type: private
  859. */
  860. dhtmlxEventable=function(obj){
  861.         obj.dhx_SeverCatcherPath="";
  862.         obj.attachEvent=function(name, catcher, callObj){
  863.             name='ev_'+name.toLowerCase();
  864.             if (!this[name])
  865.                 this[name]=new this.eventCatcher(callObj||this);
  866.                 
  867.             return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID)
  868.         }
  869.         obj.callEvent=function(name, arg0){ 
  870.             name='ev_'+name.toLowerCase();
  871.             if (this[name])
  872.                 return this[name].apply(this, arg0);
  873.             return true;
  874.         }
  875.         obj.checkEvent=function(name){
  876.             return (!!this['ev_'+name.toLowerCase()])
  877.         }
  878.         obj.eventCatcher=function(obj){
  879.             var dhx_catch = [];
  880.             var z = function(){
  881.                 var res = true;
  882.                 for (var i = 0; i < dhx_catch.length; i++){
  883.                     if (dhx_catch[i] != null){
  884.                         var zr = dhx_catch[i].apply(obj, arguments);
  885.                         res=res&&zr;
  886.                     }
  887.                 }
  888.                 return res;
  889.             }
  890.             z.addEvent=function(ev){
  891.                 if (typeof (ev) != "function")
  892.                     ev=eval(ev);
  893.                 if (ev)
  894.                     return dhx_catch.push(ev)-1;
  895.                 return false;
  896.             }
  897.             z.removeEvent=function(id){
  898.                 dhx_catch[id]=null;
  899.             }
  900.             return z;
  901.         }
  902.         obj.detachEvent=function(id){
  903.             if (id != false){
  904.                 var list = id.split(':');           //get EventName and ID
  905.                 this[list[0]].removeEvent(list[1]); //remove event
  906.             }
  907.         }
  908. }
  909.