dhtmlxcommon.js 26 KB

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