home *** CD-ROM | disk | FTP | other *** search
/ Chip 2009 November / Chip_2009.11_CD.iso / Chip_WPI / WPIScripts / dhtmlXCommon.js < prev    next >
Encoding:
JavaScript  |  2006-06-23  |  16.9 KB  |  523 lines

  1. /*
  2. Copyright Scand LLC http://www.scbr.com
  3. To use this component please contact info@scbr.com to obtain license
  4. */
  5.         /**
  6.           *     @desc: xmlLoader object
  7.           *     @type: private
  8.           *     @param: funcObject - xml parser function
  9.           *     @param: object - jsControl object
  10.           *     @topic: 0
  11.           */    
  12. function dtmlXMLLoaderObject(funcObject, dhtmlObject,async){
  13.     this.xmlDoc="";
  14.     if(arguments.length==2)
  15.         this.async=true;
  16.     else
  17.         this.async=async;
  18.     this.onloadAction=funcObject||null;
  19.     this.mainObject=dhtmlObject||null;
  20.     return this;
  21. };
  22.         /**  
  23.           *     @desc: xml loading handler
  24.           *     @type: private
  25.           *     @param: dtmlObject - xmlLoader object
  26.           *     @topic: 0
  27.           */
  28.     dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){
  29.         this.check=function (){
  30.             if(dhtmlObject.onloadAction!=null){
  31.                 if  ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){
  32.                     dhtmlObject.onloadAction(dhtmlObject.mainObject,null,null,null,dhtmlObject);
  33.                     dhtmlObject=null;
  34.                     }
  35.             }
  36.         };
  37.         return this.check;
  38.     };
  39.  
  40.         /**
  41.           *     @desc: return XML top node
  42.           *     @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla)
  43.           *     @type: private
  44.           *     @returns: top XML node
  45.           *     @topic: 0  
  46.           */
  47.     dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName){
  48.             if (this.xmlDoc.responseXML)  { 
  49.                 var temp=this.xmlDoc.responseXML.getElementsByTagName(tagName);
  50.                 var z=temp[0];  
  51.             }else
  52.                 var z=this.xmlDoc.documentElement;
  53.             if (z)
  54.                 return z;
  55.  
  56.             if ((_isIE)&&(!this._retry)){    
  57.                 //fall back to MS.XMLDOM
  58.                 this._retry=true;
  59.                        this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  60.                        this.xmlDoc.async=false;
  61.                       this.xmlDoc.load(this.filePath);
  62.                     return this.getXMLTopNode(tagName);
  63.             }
  64.             dhtmlxError.throwError("LoadXML","Incorrect XML",[this.xmlDoc])
  65.             return document.createElement("DIV");
  66.     };
  67.     
  68.         /**
  69.           *     @desc: load XML from string
  70.           *     @type: private
  71.           *     @param: xmlString - xml string
  72.           *     @topic: 0  
  73.           */
  74.     dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
  75.      try
  76.      {
  77.          var parser = new DOMParser();
  78.          this.xmlDoc = parser.parseFromString(xmlString,"text/xml");
  79.  }
  80.      catch(e){
  81.         this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  82.         this.xmlDoc.async=this.async
  83.         this.xmlDoc.loadXML(xmlString);
  84.      }
  85.       this.onloadAction(this.mainObject);
  86.     }
  87.         /**
  88.           *     @desc: load XML
  89.           *     @type: private
  90.           *     @param: filePath - xml file path
  91.           *     @param: postMode - send POST request
  92.           *     @param: postVars - list of vars for post request
  93.           *     @topic: 0
  94.           */
  95.     dtmlXMLLoaderObject.prototype.loadXML=function(filePath,postMode,postVars){
  96.      this.filePath=filePath;
  97.      try
  98.      {
  99.          this.xmlDoc = new XMLHttpRequest();
  100.         this.xmlDoc.open(postMode?"POST":"GET",filePath,this.async);
  101.         if (postMode)
  102.               this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  103.         this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
  104.         this.xmlDoc.send(null||postVars);
  105.      }
  106.      catch(e){
  107.  
  108.             if (document.implementation && document.implementation.createDocument)
  109.             {
  110.                 this.xmlDoc = document.implementation.createDocument("", "", null);
  111.                 this.xmlDoc.onload = new this.waitLoadFunction(this);
  112.                 this.xmlDoc.load(filePath);
  113.             }
  114.             else
  115.             {
  116.                     this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  117.                     this.xmlDoc.open(postMode?"POST":"GET",filePath,this.async);
  118.                     if (postMode) this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  119.                     this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
  120.                     this.xmlDoc.send(null||postVars);
  121.             }
  122.           }
  123.     };
  124.         /**
  125.           *     @desc: destructor, cleans used memory
  126.           *     @type: private
  127.           *     @topic: 0
  128.           */
  129.     dtmlXMLLoaderObject.prototype.destructor=function(){
  130.         this.onloadAction=null;
  131.         this.mainObject=null;
  132.         this.xmlDoc=null;
  133.         return null;
  134.     }
  135.     
  136.         /**  
  137.           *     @desc: Call wrapper
  138.           *     @type: private
  139.           *     @param: funcObject - action handler
  140.           *     @param: dhtmlObject - user data
  141.           *     @returns: function handler
  142.           *     @topic: 0  
  143.           */
  144. function callerFunction(funcObject,dhtmlObject){
  145.     this.handler=function(e){
  146.         if (!e) e=event;
  147.         funcObject(e,dhtmlObject);
  148.         return true;
  149.     };
  150.     return this.handler;
  151. };
  152.  
  153.         /**  
  154.           *     @desc: Calculate absolute position of html object
  155.           *     @type: private
  156.           *     @param: htmlObject - html object
  157.           *     @topic: 0  
  158.           */
  159. function getAbsoluteLeft(htmlObject){
  160.         var xPos = htmlObject.offsetLeft;
  161.         var temp = htmlObject.offsetParent;
  162.         while (temp != null) {
  163.             xPos += temp.offsetLeft;
  164.             temp = temp.offsetParent;
  165.         }
  166.         return xPos;
  167.     }
  168.         /**
  169.           *     @desc: Calculate absolute position of html object
  170.           *     @type: private
  171.           *     @param: htmlObject - html object
  172.           *     @topic: 0  
  173.           */    
  174. function getAbsoluteTop(htmlObject) {
  175.         var yPos = htmlObject.offsetTop;
  176.         var temp = htmlObject.offsetParent;
  177.         while (temp != null) {
  178.             yPos += temp.offsetTop;
  179.             temp = temp.offsetParent;
  180.         }
  181.         return yPos;
  182.    }
  183.    
  184.    
  185. /**  
  186. *     @desc: Convert string to it boolean representation
  187. *     @type: private
  188. *     @param: inputString - string for covertion
  189. *     @topic: 0  
  190. */      
  191. function convertStringToBoolean(inputString){ if (typeof(inputString)=="string") inputString=inputString.toLowerCase();
  192.     switch(inputString){
  193.         case "1":
  194.         case "true":
  195.         case "yes":
  196.         case "y":
  197.         case 1:        
  198.         case true:        
  199.                     return true; 
  200.                     break;
  201.         default:     return false;
  202.     }
  203. }
  204.  
  205. /**  
  206. *     @desc: find out what symbol to use as url param delimiters in further params
  207. *     @type: private
  208. *     @param: str - current url string
  209. *     @topic: 0  
  210. */
  211. function getUrlSymbol(str){
  212.         if(str.indexOf("?")!=-1)
  213.             return "&"
  214.         else
  215.             return "?"
  216.     }
  217.     
  218.     
  219. function dhtmlDragAndDropObject(){
  220.         this.lastLanding=0;
  221.         this.dragNode=0;
  222.         this.dragStartNode=0;
  223.         this.dragStartObject=0;
  224.         this.tempDOMU=null;
  225.         this.tempDOMM=null;
  226.         this.waitDrag=0;
  227.         if (window.dhtmlDragAndDrop) return window.dhtmlDragAndDrop;
  228.         window.dhtmlDragAndDrop=this;
  229.  
  230.         return this;
  231.     };
  232.     
  233.     dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){
  234.         htmlNode.onmousedown=null;
  235.         htmlNode.dragStarter=null;
  236.         htmlNode.dragLanding=null;
  237.     }
  238.     dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode,dhtmlObject){
  239.         htmlNode.onmousedown=this.preCreateDragCopy;
  240.         htmlNode.dragStarter=dhtmlObject;
  241.         this.addDragLanding(htmlNode,dhtmlObject);
  242.     }
  243.     dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode,dhtmlObject){
  244.         htmlNode.dragLanding=dhtmlObject;
  245.     }
  246.     dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e)
  247.     {
  248.         if (window.dhtmlDragAndDrop.waitDrag) {
  249.              window.dhtmlDragAndDrop.waitDrag=0;
  250.              document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU;
  251.              document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM;
  252.              return false;
  253.         }
  254.  
  255.         window.dhtmlDragAndDrop.waitDrag=1;
  256.         window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup;
  257.         window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove;
  258.         window.dhtmlDragAndDrop.dragStartNode=this;
  259.         window.dhtmlDragAndDrop.dragStartObject=this.dragStarter;
  260.         document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy;
  261.         document.body.onmousemove=window.dhtmlDragAndDrop.callDrag;
  262.  
  263.                 if ((e)&&(e.preventDefault)) { e.preventDefault(); return false; }
  264.                 return false;
  265.     };
  266.     dhtmlDragAndDropObject.prototype.callDrag=function(e){
  267.         if (!e) e=window.event;
  268.         dragger=window.dhtmlDragAndDrop;
  269.  
  270.            if ((e.button==0)&&(_isIE)) return dragger.stopDrag();
  271.         if (!dragger.dragNode) {
  272.             dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode,e);
  273.             if (!dragger.dragNode) return dragger.stopDrag();
  274.             dragger.gldragNode=dragger.dragNode;
  275.             document.body.appendChild(dragger.dragNode);
  276.             document.body.onmouseup=dragger.stopDrag;
  277.             dragger.waitDrag=0;
  278.             dragger.dragNode.pWindow=window;
  279.                dragger.initFrameRoute();
  280.             }
  281.  
  282.  
  283.         if (dragger.dragNode.parentNode!=window.document.body){
  284.             var grd=dragger.gldragNode;
  285.             if (dragger.gldragNode.old) grd=dragger.gldragNode.old;
  286.  
  287.             //if (!document.all) dragger.calculateFramePosition();
  288.             grd.parentNode.removeChild(grd);
  289.             var oldBody=dragger.dragNode.pWindow;
  290.             if (_isIE){
  291.             var div=document.createElement("Div");
  292.             div.innerHTML=dragger.dragNode.outerHTML;
  293.             dragger.dragNode=div.childNodes[0];    }
  294.             else dragger.dragNode=dragger.dragNode.cloneNode(true);
  295.             dragger.dragNode.pWindow=window;
  296.             dragger.gldragNode.old=dragger.dragNode;
  297.             document.body.appendChild(dragger.dragNode);
  298.             oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode;
  299.         }
  300.  
  301.             dragger.dragNode.style.left=e.clientX+15+(dragger.fx?dragger.fx*(-1):0)+(document.body.scrollLeft||document.documentElement.scrollLeft)+"px";
  302.             dragger.dragNode.style.top=e.clientY+3+(dragger.fy?dragger.fy*(-1):0)+(document.body.scrollTop||document.documentElement.scrollTop)+"px";
  303.         if (!e.srcElement)     var z=e.target;     else     z=e.srcElement;
  304.         dragger.checkLanding(z,e.clientX, e.clientY );
  305.     }
  306.     
  307.     dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){
  308.         //this.fx = 0, this.fy = 0;
  309.         if (window.name)  {
  310.           var el =parent.frames[window.name].frameElement.offsetParent;
  311.           var fx=0;
  312.           var fy=0;
  313.           while (el)    {      fx += el.offsetLeft;      fy += el.offsetTop;      el = el.offsetParent;   }
  314.           if     ((parent.dhtmlDragAndDrop))    {      var ls=parent.dhtmlDragAndDrop.calculateFramePosition(1);  fx+=ls.split('_')[0]*1;  fy+=ls.split('_')[1]*1;  }
  315.           if (n) return fx+"_"+fy;
  316.           else this.fx=fx; this.fy=fy;
  317.           }
  318.           return "0_0";
  319.     }
  320.     dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject,x,y){
  321.  
  322.         if ((htmlObject)&&(htmlObject.dragLanding)) { if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding);
  323.                                          this.lastLanding=htmlObject; this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding,this.dragStartNode,x,y); }
  324.         else {
  325.              if ((htmlObject)&&(htmlObject.tagName!="BODY")) this.checkLanding(htmlObject.parentNode,x,y);
  326.              else  { if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding,x,y); this.lastLanding=0; }
  327.              }
  328.     }
  329.     dhtmlDragAndDropObject.prototype.stopDrag=function(e,mode){
  330.         dragger=window.dhtmlDragAndDrop;
  331.         if (!mode)
  332.             {
  333.               dragger.stopFrameRoute();
  334.               var temp=dragger.lastLanding;
  335.               dragger.lastLanding=null;
  336.               if (temp) temp.dragLanding._drag(dragger.dragStartNode,dragger.dragStartObject,temp);
  337.             }
  338.         dragger.lastLanding=null;
  339.         if ((dragger.dragNode)&&(dragger.dragNode.parentNode==document.body)) dragger.dragNode.parentNode.removeChild(dragger.dragNode);
  340.         dragger.dragNode=0;
  341.         dragger.gldragNode=0;
  342.         dragger.fx=0;
  343.         dragger.fy=0;
  344.         dragger.dragStartNode=0;
  345.         dragger.dragStartObject=0;
  346.         document.body.onmouseup=dragger.tempDOMU;
  347.         document.body.onmousemove=dragger.tempDOMM;
  348.         dragger.tempDOMU=null;
  349.         dragger.tempDOMM=null;
  350.         dragger.waitDrag=0;
  351.     }    
  352.     
  353.     dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){
  354.         if (win)
  355.             window.dhtmlDragAndDrop.stopDrag(1,1);
  356.                 
  357.         for (var i=0; i<window.frames.length; i++)
  358.             if ((window.frames[i]!=win)&&(window.frames[i].dhtmlDragAndDrop))
  359.                 window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window);
  360.         if ((parent.dhtmlDragAndDrop)&&(parent!=window)&&(parent!=win)) 
  361.                 parent.dhtmlDragAndDrop.stopFrameRoute(window);    
  362.     }
  363.     dhtmlDragAndDropObject.prototype.initFrameRoute=function(win,mode){
  364.         if (win)    {
  365.  
  366.  
  367.                         window.dhtmlDragAndDrop.preCreateDragCopy();
  368.                     window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode;
  369.                     window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject;
  370.                     window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode;
  371.                     window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode;
  372.                     window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag;
  373.                     window.waitDrag=0;
  374.                     if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv<1.8)))
  375.                          window.dhtmlDragAndDrop.calculateFramePosition();
  376.                 }
  377.     if ((parent.dhtmlDragAndDrop)&&(parent!=window)&&(parent!=win))
  378.                 parent.dhtmlDragAndDrop.initFrameRoute(window);
  379.         for (var i=0; i<window.frames.length; i++)
  380.             if ((window.frames[i]!=win)&&(window.frames[i].dhtmlDragAndDrop))
  381.                 window.frames[i].dhtmlDragAndDrop.initFrameRoute(window,((!win||mode)?1:0));
  382.  
  383.     }
  384.  
  385. var _isFF=false; var _isIE=false; var _isOpera=false; var _isKHTML=false; var _isMacOS=false;
  386.  
  387. if (navigator.userAgent.indexOf('Macintosh') != -1) _isMacOS=true;
  388. if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror')!= -1))
  389.     _isKHTML=true;
  390. else if (navigator.userAgent.indexOf('Opera') != -1)
  391.     _isOpera=true;
  392. else if(navigator.appName.indexOf("Microsoft")!=-1)
  393.     _isIE=true;
  394. else {
  395.     _isFF=true;
  396.     var _FFrv=parseFloat(navigator.userAgent.split("rv:")[1])
  397.     }
  398.  
  399. //deprecated, use global constant instead
  400. //determines if current browser is IE
  401. function isIE(){
  402.     if(navigator.appName.indexOf("Microsoft")!=-1)
  403.         if (navigator.userAgent.indexOf('Opera') == -1)
  404.             return true;
  405.     return false;
  406. }
  407.  
  408. //multibrowser Xpath processor
  409. dtmlXMLLoaderObject.prototype.doXPath = function(xpathExp,docObj){
  410.     if ((_isOpera)||(_isKHTML)) return this.doXPathOpera(xpathExp,docObj);
  411.     if(_isIE){//IE
  412.         if(!docObj){
  413.             docObj = this.xmlDoc
  414.         }
  415.         return docObj.selectNodes(xpathExp);
  416.     }else{//Mozilla
  417.         var nodeObj = docObj;
  418.         if(!docObj){
  419.             if(!this.xmlDoc.nodeName){
  420.                 docObj = this.xmlDoc.responseXML
  421.             }else{
  422.                 docObj = this.xmlDoc;
  423.             }
  424.         }
  425.         if(docObj.nodeName.indexOf("document")!=-1){
  426.             nodeObj = docObj;
  427.         }else{
  428.             nodeObj = docObj;
  429.             docObj = docObj.ownerDocument;
  430.  
  431.         }
  432.         var rowsCol = new Array();
  433.             var col = docObj.evaluate(xpathExp, nodeObj, null, XPathResult.ANY_TYPE,null);
  434.             var thisColMemb = col.iterateNext();
  435.             while (thisColMemb) {
  436.                 rowsCol[rowsCol.length] = thisColMemb;
  437.                 thisColMemb = col.iterateNext();
  438.             }
  439.             return rowsCol;
  440.     }
  441. }
  442.    
  443. if  (( window.Node )&&(!_isKHTML))
  444. Node.prototype.removeNode = function( removeChildren )
  445. {
  446.     var self = this;
  447.     if ( Boolean( removeChildren ) )
  448.     {
  449.         return this.parentNode.removeChild( self );
  450.     }
  451.     else
  452.     {
  453.         var range = document.createRange();
  454.         range.selectNodeContents( self );
  455.         return this.parentNode.replaceChild( range.extractContents(), self );
  456.     }
  457. }
  458.  
  459. function _dhtmlxError(type,name,params){
  460.     if (!this.catches)
  461.         this.catches=new Array();
  462.  
  463.     return this;
  464. }
  465.  
  466. _dhtmlxError.prototype.catchError=function(type,func_name){
  467.     this.catches[type]=func_name;
  468. }
  469. _dhtmlxError.prototype.throwError=function(type,name,params){
  470.         if (this.catches[type]) return  this.catches[type](type,name,params);
  471.         if (this.catches["ALL"]) return  this.catches["ALL"](type,name,params);
  472.         alert("Error type: " + arguments[0]+"\nDescription: " + arguments[1] );
  473.         return null;
  474. }
  475.  
  476. window.dhtmlxError=new  _dhtmlxError();
  477.  
  478.  
  479. //opera fake, while 9.0 not released
  480. //multibrowser Xpath processor
  481. dtmlXMLLoaderObject.prototype.doXPathOpera = function(xpathExp,docObj){
  482.     //this is fake for Opera
  483.     var z=xpathExp.replace(/[\/]+/gi,"/").split('/');
  484.     var obj=null;
  485.     var i=1;
  486.  
  487.     if (!z.length) return [];
  488.     if (z[0]==".")
  489.         obj=[docObj];
  490.     else if (z[0]=="")
  491.         {
  492.         obj=this.xmlDoc.responseXML.getElementsByTagName(z[i].replace(/\[[^\]]*\]/g,""));
  493.         i++;
  494.         }
  495.     else return [];
  496.  
  497.     for (i; i<z.length; i++)
  498.         obj=this._getAllNamedChilds(obj,z[i]);
  499.  
  500.     if (z[i-1].indexOf("[")!=-1)
  501.         obj=this._filterXPath(obj,z[i-1]);
  502.     return obj;
  503. }
  504.  
  505. dtmlXMLLoaderObject.prototype._filterXPath = function(a,b){
  506.     var c=new Array();
  507.     var b=b.replace(/[^\[]*\[\@/g,"").replace(/[\[\]\@]*/g,"");
  508.     for (var i=0; i<a.length; i++)
  509.         if (a[i].getAttribute(b))
  510.             c[c.length]=a[i];
  511.  
  512.     return c;
  513. }
  514. dtmlXMLLoaderObject.prototype._getAllNamedChilds = function(a,b){
  515.     var c=new Array();
  516.     for (var i=0; i<a.length; i++)
  517.         for (var j=0; j<a[i].childNodes.length; j++)
  518.             if (a[i].childNodes[j].tagName==b) c[c.length]=a[i].childNodes[j];
  519.  
  520.     return c;
  521. }
  522.  
  523.