941 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			941 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
//v.2.6 build 100722
 | 
						|
 | 
						|
/*
 | 
						|
Copyright DHTMLX LTD. http://www.dhtmlx.com
 | 
						|
You allowed to use this component or parts of it under GPL terms
 | 
						|
To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
 | 
						|
*/
 | 
						|
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){
 | 
						|
			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);
 | 
						|
		t.async=(arguments.length<3);
 | 
						|
		t.waitCall=callback;
 | 
						|
		t.loadXML(url)
 | 
						|
		return t;
 | 
						|
	},
 | 
						|
	post:function(url,post,callback){
 | 
						|
		var t=new dtmlXMLLoaderObject(true);
 | 
						|
		t.async=(arguments.length<4);
 | 
						|
		t.waitCall=callback;
 | 
						|
		t.loadXML(url,true,post)
 | 
						|
		return t;
 | 
						|
	},
 | 
						|
	getSync:function(url){
 | 
						|
		return this.get(url,null,true)
 | 
						|
	},
 | 
						|
	postSync:function(url,post){
 | 
						|
		return this.post(url,post,null,true);		
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  *     @desc: xmlLoader object
 | 
						|
  *     @type: private
 | 
						|
  *     @param: funcObject - xml parser function
 | 
						|
  *     @param: object - jsControl object
 | 
						|
  *     @param: async - sync/async mode (async by default)
 | 
						|
  *     @param: rSeed - enable/disable random seed ( prevent IE caching)
 | 
						|
  *     @topic: 0
 | 
						|
  */
 | 
						|
function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){
 | 
						|
	this.xmlDoc="";
 | 
						|
 | 
						|
	if (typeof (async) != "undefined")
 | 
						|
		this.async=async;
 | 
						|
	else
 | 
						|
		this.async=true;
 | 
						|
 | 
						|
	this.onloadAction=funcObject||null;
 | 
						|
	this.mainObject=dhtmlObject||null;
 | 
						|
	this.waitCall=null;
 | 
						|
	this.rSeed=rSeed||false;
 | 
						|
	return this;
 | 
						|
};
 | 
						|
/**
 | 
						|
  *     @desc: xml loading handler
 | 
						|
  *     @type: private
 | 
						|
  *     @param: dtmlObject - xmlLoader object
 | 
						|
  *     @topic: 0
 | 
						|
  */
 | 
						|
dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){
 | 
						|
	var once = true;
 | 
						|
	this.check=function (){
 | 
						|
		if ((dhtmlObject)&&(dhtmlObject.onloadAction != null)){
 | 
						|
			if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){
 | 
						|
				if (!once)
 | 
						|
					return;
 | 
						|
 | 
						|
				once=false; //IE 5 fix
 | 
						|
				if (typeof dhtmlObject.onloadAction == "function")
 | 
						|
					dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);
 | 
						|
 | 
						|
				if (dhtmlObject.waitCall){
 | 
						|
					dhtmlObject.waitCall.call(this,dhtmlObject);
 | 
						|
					dhtmlObject.waitCall=null;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	};
 | 
						|
	return this.check;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  *     @desc: return XML top node
 | 
						|
  *     @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla)
 | 
						|
  *     @type: private
 | 
						|
  *     @returns: top XML node
 | 
						|
  *     @topic: 0  
 | 
						|
  */
 | 
						|
dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){
 | 
						|
	if (this.xmlDoc.responseXML){
 | 
						|
		var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
 | 
						|
		if(temp.length==0 && tagName.indexOf(":")!=-1)
 | 
						|
			var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]);
 | 
						|
		var z = temp[0];
 | 
						|
	} else
 | 
						|
		var z = this.xmlDoc.documentElement;
 | 
						|
 | 
						|
	if (z){
 | 
						|
		this._retry=false;
 | 
						|
		return z;
 | 
						|
	}
 | 
						|
 | 
						|
	if ((_isIE)&&(!this._retry)){
 | 
						|
		//fall back to MS.XMLDOM
 | 
						|
		var xmlString = this.xmlDoc.responseText;
 | 
						|
		var oldObj = this.xmlDoc;
 | 
						|
		this._retry=true;
 | 
						|
		this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
 | 
						|
		this.xmlDoc.async=false;
 | 
						|
		this.xmlDoc["loadXM"+"L"](xmlString);
 | 
						|
 | 
						|
		return this.getXMLTopNode(tagName, oldObj);
 | 
						|
	}
 | 
						|
	dhtmlxError.throwError("LoadXML", "Incorrect XML", [
 | 
						|
		(oldObj||this.xmlDoc),
 | 
						|
		this.mainObject
 | 
						|
	]);
 | 
						|
 | 
						|
	return document.createElement("DIV");
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  *     @desc: load XML from string
 | 
						|
  *     @type: private
 | 
						|
  *     @param: xmlString - xml string
 | 
						|
  *     @topic: 0  
 | 
						|
  */
 | 
						|
dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
 | 
						|
	{
 | 
						|
		try{
 | 
						|
			var parser = new DOMParser();
 | 
						|
			this.xmlDoc=parser.parseFromString(xmlString, "text/xml");
 | 
						|
		}
 | 
						|
		catch (e){
 | 
						|
			this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
 | 
						|
			this.xmlDoc.async=this.async;
 | 
						|
			this.xmlDoc["loadXM"+"L"](xmlString);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	this.onloadAction(this.mainObject, null, null, null, this);
 | 
						|
 | 
						|
	if (this.waitCall){
 | 
						|
		this.waitCall();
 | 
						|
		this.waitCall=null;
 | 
						|
	}
 | 
						|
}
 | 
						|
/**
 | 
						|
  *     @desc: load XML
 | 
						|
  *     @type: private
 | 
						|
  *     @param: filePath - xml file path
 | 
						|
  *     @param: postMode - send POST request
 | 
						|
  *     @param: postVars - list of vars for post request
 | 
						|
  *     @topic: 0
 | 
						|
  */
 | 
						|
dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){
 | 
						|
	if (this.rSeed)
 | 
						|
		filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf();
 | 
						|
	this.filePath=filePath;
 | 
						|
 | 
						|
	if ((!_isIE)&&(window.XMLHttpRequest))
 | 
						|
		this.xmlDoc=new XMLHttpRequest();
 | 
						|
	else {
 | 
						|
		if (document.implementation&&document.implementation.createDocument){
 | 
						|
			this.xmlDoc=document.implementation.createDocument("", "", null);
 | 
						|
			this.xmlDoc.onload=new this.waitLoadFunction(this);
 | 
						|
			this.xmlDoc.load(filePath);
 | 
						|
			return;
 | 
						|
		} else
 | 
						|
			this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP");
 | 
						|
	}
 | 
						|
 | 
						|
	if (this.async)
 | 
						|
		this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
 | 
						|
	this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
 | 
						|
 | 
						|
	if (rpc){
 | 
						|
		this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")");
 | 
						|
		this.xmlDoc.setRequestHeader("Content-type", "text/xml");
 | 
						|
	}
 | 
						|
 | 
						|
	else if (postMode)
 | 
						|
		this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
 | 
						|
		
 | 
						|
	this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");
 | 
						|
	this.xmlDoc.send(null||postVars);
 | 
						|
 | 
						|
	if (!this.async)
 | 
						|
		(new this.waitLoadFunction(this))();
 | 
						|
};
 | 
						|
/**
 | 
						|
  *     @desc: destructor, cleans used memory
 | 
						|
  *     @type: private
 | 
						|
  *     @topic: 0
 | 
						|
  */
 | 
						|
dtmlXMLLoaderObject.prototype.destructor=function(){
 | 
						|
	this._filterXPath = null;
 | 
						|
	this._getAllNamedChilds = null;
 | 
						|
	this._retry = null;
 | 
						|
	this.async = null;
 | 
						|
	this.rSeed = null;
 | 
						|
	this.filePath = null;
 | 
						|
	this.onloadAction = null;
 | 
						|
	this.mainObject = null;
 | 
						|
	this.xmlDoc = null;
 | 
						|
	this.doXPath = null;
 | 
						|
	this.doXPathOpera = null;
 | 
						|
	this.doXSLTransToObject = null;
 | 
						|
	this.doXSLTransToString = null;
 | 
						|
	this.loadXML = null;
 | 
						|
	this.loadXMLString = null;
 | 
						|
	// this.waitLoadFunction = null;
 | 
						|
	this.doSerialization = null;
 | 
						|
	this.xmlNodeToJSON = null;
 | 
						|
	this.getXMLTopNode = null;
 | 
						|
	this.setXSLParamValue = null;
 | 
						|
	return null;
 | 
						|
}
 | 
						|
 | 
						|
dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){
 | 
						|
        var t={};
 | 
						|
        for (var i=0; i<node.attributes.length; i++)
 | 
						|
            t[node.attributes[i].name]=node.attributes[i].value;
 | 
						|
        t["_tagvalue"]=node.firstChild?node.firstChild.nodeValue:"";
 | 
						|
        for (var i=0; i<node.childNodes.length; i++){
 | 
						|
            var name=node.childNodes[i].tagName;
 | 
						|
            if (name){
 | 
						|
                if (!t[name]) t[name]=[];
 | 
						|
                t[name].push(this.xmlNodeToJSON(node.childNodes[i]));
 | 
						|
            }            
 | 
						|
        }        
 | 
						|
        return t;
 | 
						|
    }
 | 
						|
 | 
						|
/**  
 | 
						|
  *     @desc: Call wrapper
 | 
						|
  *     @type: private
 | 
						|
  *     @param: funcObject - action handler
 | 
						|
  *     @param: dhtmlObject - user data
 | 
						|
  *     @returns: function handler
 | 
						|
  *     @topic: 0  
 | 
						|
  */
 | 
						|
function callerFunction(funcObject, dhtmlObject){
 | 
						|
	this.handler=function(e){
 | 
						|
		if (!e)
 | 
						|
			e=window.event;
 | 
						|
		funcObject(e, dhtmlObject);
 | 
						|
		return true;
 | 
						|
	};
 | 
						|
	return this.handler;
 | 
						|
};
 | 
						|
 | 
						|
/**  
 | 
						|
  *     @desc: Calculate absolute position of html object
 | 
						|
  *     @type: private
 | 
						|
  *     @param: htmlObject - html object
 | 
						|
  *     @topic: 0  
 | 
						|
  */
 | 
						|
function getAbsoluteLeft(htmlObject){
 | 
						|
	return getOffset(htmlObject).left;
 | 
						|
}
 | 
						|
/**
 | 
						|
  *     @desc: Calculate absolute position of html object
 | 
						|
  *     @type: private
 | 
						|
  *     @param: htmlObject - html object
 | 
						|
  *     @topic: 0  
 | 
						|
  */
 | 
						|
function getAbsoluteTop(htmlObject){
 | 
						|
	return getOffset(htmlObject).top;
 | 
						|
}
 | 
						|
 | 
						|
function getOffsetSum(elem) {
 | 
						|
	var top=0, left=0;
 | 
						|
	while(elem) {
 | 
						|
		top = top + parseInt(elem.offsetTop);
 | 
						|
		left = left + parseInt(elem.offsetLeft);
 | 
						|
		elem = elem.offsetParent;
 | 
						|
	}
 | 
						|
	return {top: top, left: left};
 | 
						|
}
 | 
						|
function getOffsetRect(elem) {
 | 
						|
	var box = elem.getBoundingClientRect();
 | 
						|
	var body = document.body;
 | 
						|
	var docElem = document.documentElement;
 | 
						|
	var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
 | 
						|
	var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
 | 
						|
	var clientTop = docElem.clientTop || body.clientTop || 0;
 | 
						|
	var clientLeft = docElem.clientLeft || body.clientLeft || 0;
 | 
						|
	var top  = box.top +  scrollTop - clientTop;
 | 
						|
	var left = box.left + scrollLeft - clientLeft;
 | 
						|
	return { top: Math.round(top), left: Math.round(left) };
 | 
						|
}
 | 
						|
function getOffset(elem) {
 | 
						|
	if (elem.getBoundingClientRect) {
 | 
						|
		return getOffsetRect(elem);
 | 
						|
	} else {
 | 
						|
		return getOffsetSum(elem);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**  
 | 
						|
*     @desc: Convert string to it boolean representation
 | 
						|
*     @type: private
 | 
						|
*     @param: inputString - string for covertion
 | 
						|
*     @topic: 0
 | 
						|
*/
 | 
						|
function convertStringToBoolean(inputString){
 | 
						|
	if (typeof (inputString) == "string")
 | 
						|
		inputString=inputString.toLowerCase();
 | 
						|
 | 
						|
	switch (inputString){
 | 
						|
		case "1":
 | 
						|
		case "true":
 | 
						|
		case "yes":
 | 
						|
		case "y":
 | 
						|
		case 1:
 | 
						|
		case true:
 | 
						|
			return true;
 | 
						|
			break;
 | 
						|
 | 
						|
		default: return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**  
 | 
						|
*     @desc: find out what symbol to use as url param delimiters in further params
 | 
						|
*     @type: private
 | 
						|
*     @param: str - current url string
 | 
						|
*     @topic: 0  
 | 
						|
*/
 | 
						|
function getUrlSymbol(str){
 | 
						|
	if (str.indexOf("?") != -1)
 | 
						|
		return "&"
 | 
						|
	else
 | 
						|
		return "?"
 | 
						|
}
 | 
						|
 | 
						|
function dhtmlDragAndDropObject(){
 | 
						|
	if (window.dhtmlDragAndDrop)
 | 
						|
		return window.dhtmlDragAndDrop;
 | 
						|
 | 
						|
	this.lastLanding=0;
 | 
						|
	this.dragNode=0;
 | 
						|
	this.dragStartNode=0;
 | 
						|
	this.dragStartObject=0;
 | 
						|
	this.tempDOMU=null;
 | 
						|
	this.tempDOMM=null;
 | 
						|
	this.waitDrag=0;
 | 
						|
	window.dhtmlDragAndDrop=this;
 | 
						|
 | 
						|
	return this;
 | 
						|
};
 | 
						|
 | 
						|
dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){
 | 
						|
	htmlNode.onmousedown=null;
 | 
						|
	htmlNode.dragStarter=null;
 | 
						|
	htmlNode.dragLanding=null;
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode, dhtmlObject){
 | 
						|
	htmlNode.onmousedown=this.preCreateDragCopy;
 | 
						|
	htmlNode.dragStarter=dhtmlObject;
 | 
						|
	this.addDragLanding(htmlNode, dhtmlObject);
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode, dhtmlObject){
 | 
						|
	htmlNode.dragLanding=dhtmlObject;
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e){
 | 
						|
	if ((e||window.event) && (e||event).button == 2)
 | 
						|
		return;
 | 
						|
 | 
						|
	if (window.dhtmlDragAndDrop.waitDrag){
 | 
						|
		window.dhtmlDragAndDrop.waitDrag=0;
 | 
						|
		document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU;
 | 
						|
		document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM;
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	window.dhtmlDragAndDrop.waitDrag=1;
 | 
						|
	window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup;
 | 
						|
	window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove;
 | 
						|
	window.dhtmlDragAndDrop.dragStartNode=this;
 | 
						|
	window.dhtmlDragAndDrop.dragStartObject=this.dragStarter;
 | 
						|
	document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy;
 | 
						|
	document.body.onmousemove=window.dhtmlDragAndDrop.callDrag;
 | 
						|
	window.dhtmlDragAndDrop.downtime = new Date().valueOf();
 | 
						|
	
 | 
						|
 | 
						|
	if ((e)&&(e.preventDefault)){
 | 
						|
		e.preventDefault();
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	return false;
 | 
						|
};
 | 
						|
dhtmlDragAndDropObject.prototype.callDrag=function(e){
 | 
						|
	if (!e)
 | 
						|
		e=window.event;
 | 
						|
	dragger=window.dhtmlDragAndDrop;
 | 
						|
	if ((new Date()).valueOf()-dragger.downtime<100) return;
 | 
						|
 | 
						|
	if ((e.button == 0)&&(_isIE))
 | 
						|
		return dragger.stopDrag();
 | 
						|
 | 
						|
	if (!dragger.dragNode&&dragger.waitDrag){
 | 
						|
		dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode, e);
 | 
						|
 | 
						|
		if (!dragger.dragNode)
 | 
						|
			return dragger.stopDrag();
 | 
						|
 | 
						|
		dragger.dragNode.onselectstart=function(){return false;}
 | 
						|
		dragger.gldragNode=dragger.dragNode;
 | 
						|
		document.body.appendChild(dragger.dragNode);
 | 
						|
		document.body.onmouseup=dragger.stopDrag;
 | 
						|
		dragger.waitDrag=0;
 | 
						|
		dragger.dragNode.pWindow=window;
 | 
						|
		dragger.initFrameRoute();
 | 
						|
	}
 | 
						|
 | 
						|
	if (dragger.dragNode.parentNode != window.document.body){
 | 
						|
		var grd = dragger.gldragNode;
 | 
						|
 | 
						|
		if (dragger.gldragNode.old)
 | 
						|
			grd=dragger.gldragNode.old;
 | 
						|
 | 
						|
		//if (!document.all) dragger.calculateFramePosition();
 | 
						|
		grd.parentNode.removeChild(grd);
 | 
						|
		var oldBody = dragger.dragNode.pWindow;
 | 
						|
 | 
						|
		if (grd.pWindow &&	grd.pWindow.dhtmlDragAndDrop.lastLanding)
 | 
						|
			grd.pWindow.dhtmlDragAndDrop.lastLanding.dragLanding._dragOut(grd.pWindow.dhtmlDragAndDrop.lastLanding);	
 | 
						|
			
 | 
						|
		//		var oldp=dragger.dragNode.parentObject;
 | 
						|
		if (_isIE){
 | 
						|
			var div = document.createElement("Div");
 | 
						|
			div.innerHTML=dragger.dragNode.outerHTML;
 | 
						|
			dragger.dragNode=div.childNodes[0];
 | 
						|
		} else
 | 
						|
			dragger.dragNode=dragger.dragNode.cloneNode(true);
 | 
						|
 | 
						|
		dragger.dragNode.pWindow=window;
 | 
						|
		//		dragger.dragNode.parentObject=oldp;
 | 
						|
 | 
						|
		dragger.gldragNode.old=dragger.dragNode;
 | 
						|
		document.body.appendChild(dragger.dragNode);
 | 
						|
		oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode;
 | 
						|
	}
 | 
						|
 | 
						|
	dragger.dragNode.style.left=e.clientX+15+(dragger.fx
 | 
						|
		? dragger.fx*(-1)
 | 
						|
		: 0)
 | 
						|
		+(document.body.scrollLeft||document.documentElement.scrollLeft)+"px";
 | 
						|
	dragger.dragNode.style.top=e.clientY+3+(dragger.fy
 | 
						|
		? dragger.fy*(-1)
 | 
						|
		: 0)
 | 
						|
		+(document.body.scrollTop||document.documentElement.scrollTop)+"px";
 | 
						|
 | 
						|
	if (!e.srcElement)
 | 
						|
		var z = e.target;
 | 
						|
	else
 | 
						|
		z=e.srcElement;
 | 
						|
	dragger.checkLanding(z, e);
 | 
						|
}
 | 
						|
 | 
						|
dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){
 | 
						|
	//this.fx = 0, this.fy = 0;
 | 
						|
	if (window.name){
 | 
						|
		var el = parent.frames[window.name].frameElement.offsetParent;
 | 
						|
		var fx = 0;
 | 
						|
		var fy = 0;
 | 
						|
 | 
						|
		while (el){
 | 
						|
			fx+=el.offsetLeft;
 | 
						|
			fy+=el.offsetTop;
 | 
						|
			el=el.offsetParent;
 | 
						|
		}
 | 
						|
 | 
						|
		if ((parent.dhtmlDragAndDrop)){
 | 
						|
			var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1);
 | 
						|
			fx+=ls.split('_')[0]*1;
 | 
						|
			fy+=ls.split('_')[1]*1;
 | 
						|
		}
 | 
						|
 | 
						|
		if (n)
 | 
						|
			return fx+"_"+fy;
 | 
						|
		else
 | 
						|
			this.fx=fx;
 | 
						|
		this.fy=fy;
 | 
						|
	}
 | 
						|
	return "0_0";
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject, e){
 | 
						|
	if ((htmlObject)&&(htmlObject.dragLanding)){
 | 
						|
		if (this.lastLanding)
 | 
						|
			this.lastLanding.dragLanding._dragOut(this.lastLanding);
 | 
						|
		this.lastLanding=htmlObject;
 | 
						|
		this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX,
 | 
						|
			e.clientY, e);
 | 
						|
		this.lastLanding_scr=(_isIE ? e.srcElement : e.target);
 | 
						|
	} else {
 | 
						|
		if ((htmlObject)&&(htmlObject.tagName != "BODY"))
 | 
						|
			this.checkLanding(htmlObject.parentNode, e);
 | 
						|
		else {
 | 
						|
			if (this.lastLanding)
 | 
						|
				this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e);
 | 
						|
			this.lastLanding=0;
 | 
						|
 | 
						|
			if (this._onNotFound)
 | 
						|
				this._onNotFound();
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.stopDrag=function(e, mode){
 | 
						|
	dragger=window.dhtmlDragAndDrop;
 | 
						|
 | 
						|
	if (!mode){
 | 
						|
		dragger.stopFrameRoute();
 | 
						|
		var temp = dragger.lastLanding;
 | 
						|
		dragger.lastLanding=null;
 | 
						|
 | 
						|
		if (temp)
 | 
						|
			temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp, (_isIE
 | 
						|
				? event.srcElement
 | 
						|
				: e.target));
 | 
						|
	}
 | 
						|
	dragger.lastLanding=null;
 | 
						|
 | 
						|
	if ((dragger.dragNode)&&(dragger.dragNode.parentNode == document.body))
 | 
						|
		dragger.dragNode.parentNode.removeChild(dragger.dragNode);
 | 
						|
	dragger.dragNode=0;
 | 
						|
	dragger.gldragNode=0;
 | 
						|
	dragger.fx=0;
 | 
						|
	dragger.fy=0;
 | 
						|
	dragger.dragStartNode=0;
 | 
						|
	dragger.dragStartObject=0;
 | 
						|
	document.body.onmouseup=dragger.tempDOMU;
 | 
						|
	document.body.onmousemove=dragger.tempDOMM;
 | 
						|
	dragger.tempDOMU=null;
 | 
						|
	dragger.tempDOMM=null;
 | 
						|
	dragger.waitDrag=0;
 | 
						|
}
 | 
						|
 | 
						|
dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){
 | 
						|
	if (win)
 | 
						|
		window.dhtmlDragAndDrop.stopDrag(1, 1);
 | 
						|
 | 
						|
	for (var i = 0; i < window.frames.length; i++){
 | 
						|
		try{
 | 
						|
		if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
 | 
						|
			window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window);
 | 
						|
		} catch(e){}
 | 
						|
	}
 | 
						|
 | 
						|
	try{
 | 
						|
	if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
 | 
						|
		parent.dhtmlDragAndDrop.stopFrameRoute(window);
 | 
						|
	} catch(e){}
 | 
						|
}
 | 
						|
dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){
 | 
						|
	if (win){
 | 
						|
		window.dhtmlDragAndDrop.preCreateDragCopy();
 | 
						|
		window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode;
 | 
						|
		window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject;
 | 
						|
		window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode;
 | 
						|
		window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode;
 | 
						|
		window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag;
 | 
						|
		window.waitDrag=0;
 | 
						|
 | 
						|
		if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv < 1.8)))
 | 
						|
			window.dhtmlDragAndDrop.calculateFramePosition();
 | 
						|
	}
 | 
						|
	try{
 | 
						|
	if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
 | 
						|
		parent.dhtmlDragAndDrop.initFrameRoute(window);
 | 
						|
	}catch(e){}
 | 
						|
 | 
						|
	for (var i = 0; i < window.frames.length; i++){
 | 
						|
		try{
 | 
						|
		if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
 | 
						|
			window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win||mode) ? 1 : 0));
 | 
						|
		} catch(e){}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var _isFF = false;
 | 
						|
var _isIE = false;
 | 
						|
var _isOpera = false;
 | 
						|
var _isKHTML = false;
 | 
						|
var _isMacOS = false;
 | 
						|
var _isChrome = false;
 | 
						|
 | 
						|
if (navigator.userAgent.indexOf('Macintosh') != -1)
 | 
						|
	_isMacOS=true;
 | 
						|
 | 
						|
 | 
						|
if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1)
 | 
						|
	_isChrome=true;
 | 
						|
 | 
						|
if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){
 | 
						|
	var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));
 | 
						|
 | 
						|
	if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+
 | 
						|
		_isFF=true;
 | 
						|
		var _FFrv = 1.9;
 | 
						|
	} else
 | 
						|
		_isKHTML=true;
 | 
						|
} else if (navigator.userAgent.indexOf('Opera') != -1){
 | 
						|
	_isOpera=true;
 | 
						|
	_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
else if (navigator.appName.indexOf("Microsoft") != -1){
 | 
						|
	_isIE=true;
 | 
						|
	if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;
 | 
						|
} else {
 | 
						|
	_isFF=true;
 | 
						|
	var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//multibrowser Xpath processor
 | 
						|
dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){
 | 
						|
	if (_isKHTML || (!_isIE && !window.XPathResult))
 | 
						|
		return this.doXPathOpera(xpathExp, docObj);
 | 
						|
 | 
						|
	if (_isIE){ //IE
 | 
						|
		if (!docObj)
 | 
						|
			if (!this.xmlDoc.nodeName)
 | 
						|
				docObj=this.xmlDoc.responseXML
 | 
						|
			else
 | 
						|
				docObj=this.xmlDoc;
 | 
						|
 | 
						|
		if (!docObj)
 | 
						|
			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
 | 
						|
				(docObj||this.xmlDoc),
 | 
						|
				this.mainObject
 | 
						|
			]);
 | 
						|
 | 
						|
		if (namespace != null)
 | 
						|
			docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); //
 | 
						|
 | 
						|
		if (result_type == 'single'){
 | 
						|
			return docObj.selectSingleNode(xpathExp);
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			return docObj.selectNodes(xpathExp)||new Array(0);
 | 
						|
		}
 | 
						|
	} else { //Mozilla
 | 
						|
		var nodeObj = docObj;
 | 
						|
 | 
						|
		if (!docObj){
 | 
						|
			if (!this.xmlDoc.nodeName){
 | 
						|
				docObj=this.xmlDoc.responseXML
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				docObj=this.xmlDoc;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (!docObj)
 | 
						|
			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
 | 
						|
				(docObj||this.xmlDoc),
 | 
						|
				this.mainObject
 | 
						|
			]);
 | 
						|
 | 
						|
		if (docObj.nodeName.indexOf("document") != -1){
 | 
						|
			nodeObj=docObj;
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			nodeObj=docObj;
 | 
						|
			docObj=docObj.ownerDocument;
 | 
						|
		}
 | 
						|
		var retType = XPathResult.ANY_TYPE;
 | 
						|
 | 
						|
		if (result_type == 'single')
 | 
						|
			retType=XPathResult.FIRST_ORDERED_NODE_TYPE
 | 
						|
		var rowsCol = new Array();
 | 
						|
		var col = docObj.evaluate(xpathExp, nodeObj, function(pref){
 | 
						|
			return namespace
 | 
						|
		}, retType, null);
 | 
						|
 | 
						|
		if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){
 | 
						|
			return col.singleNodeValue;
 | 
						|
		}
 | 
						|
		var thisColMemb = col.iterateNext();
 | 
						|
 | 
						|
		while (thisColMemb){
 | 
						|
			rowsCol[rowsCol.length]=thisColMemb;
 | 
						|
			thisColMemb=col.iterateNext();
 | 
						|
		}
 | 
						|
		return rowsCol;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function _dhtmlxError(type, name, params){
 | 
						|
	if (!this.catches)
 | 
						|
		this.catches=new Array();
 | 
						|
 | 
						|
	return this;
 | 
						|
}
 | 
						|
 | 
						|
_dhtmlxError.prototype.catchError=function(type, func_name){
 | 
						|
	this.catches[type]=func_name;
 | 
						|
}
 | 
						|
_dhtmlxError.prototype.throwError=function(type, name, params){
 | 
						|
	if (this.catches[type])
 | 
						|
		return this.catches[type](type, name, params);
 | 
						|
 | 
						|
	if (this.catches["ALL"])
 | 
						|
		return this.catches["ALL"](type, name, params);
 | 
						|
 | 
						|
	alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);
 | 
						|
	return null;
 | 
						|
}
 | 
						|
 | 
						|
window.dhtmlxError=new _dhtmlxError();
 | 
						|
 | 
						|
 | 
						|
//opera fake, while 9.0 not released
 | 
						|
//multibrowser Xpath processor
 | 
						|
dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){
 | 
						|
	//this is fake for Opera
 | 
						|
	var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
 | 
						|
	var obj = null;
 | 
						|
	var i = 1;
 | 
						|
 | 
						|
	if (!z.length)
 | 
						|
		return [];
 | 
						|
 | 
						|
	if (z[0] == ".")
 | 
						|
		obj=[docObj]; else if (z[0] == ""){
 | 
						|
		obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
 | 
						|
		i++;
 | 
						|
	} else
 | 
						|
		return [];
 | 
						|
 | 
						|
	for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]);
 | 
						|
 | 
						|
	if (z[i-1].indexOf("[") != -1)
 | 
						|
		obj=this._filterXPath(obj, z[i-1]);
 | 
						|
	return obj;
 | 
						|
}
 | 
						|
 | 
						|
dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){
 | 
						|
	var c = new Array();
 | 
						|
	var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
 | 
						|
 | 
						|
	for (var i = 0; i < a.length; i++)
 | 
						|
		if (a[i].getAttribute(b))
 | 
						|
			c[c.length]=a[i];
 | 
						|
 | 
						|
	return c;
 | 
						|
}
 | 
						|
dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){
 | 
						|
	var c = new Array();
 | 
						|
 | 
						|
	if (_isKHTML)
 | 
						|
		b=b.toUpperCase();
 | 
						|
 | 
						|
	for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){
 | 
						|
		if (_isKHTML){
 | 
						|
			if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b)
 | 
						|
				c[c.length]=a[i].childNodes[j];
 | 
						|
		}
 | 
						|
 | 
						|
		else if (a[i].childNodes[j].tagName == b)
 | 
						|
			c[c.length]=a[i].childNodes[j];
 | 
						|
	}
 | 
						|
 | 
						|
	return c;
 | 
						|
}
 | 
						|
 | 
						|
function dhtmlXHeir(a, b){
 | 
						|
	for (var c in b)
 | 
						|
		if (typeof (b[c]) == "function")
 | 
						|
			a[c]=b[c];
 | 
						|
	return a;
 | 
						|
}
 | 
						|
 | 
						|
function dhtmlxEvent(el, event, handler){
 | 
						|
	if (el.addEventListener)
 | 
						|
		el.addEventListener(event, handler, false);
 | 
						|
 | 
						|
	else if (el.attachEvent)
 | 
						|
		el.attachEvent("on"+event, handler);
 | 
						|
}
 | 
						|
 | 
						|
//============= XSL Extension ===================================
 | 
						|
 | 
						|
dtmlXMLLoaderObject.prototype.xslDoc=null;
 | 
						|
dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){
 | 
						|
	if (!xslDoc)
 | 
						|
		xslDoc=this.xslDoc
 | 
						|
 | 
						|
	if (xslDoc.responseXML)
 | 
						|
		xslDoc=xslDoc.responseXML;
 | 
						|
	var item =
 | 
						|
		this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
 | 
						|
			"http:/\/www.w3.org/1999/XSL/Transform", "single");
 | 
						|
 | 
						|
	if (item != null)
 | 
						|
		item.firstChild.nodeValue=paramValue
 | 
						|
}
 | 
						|
dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){
 | 
						|
	if (!xslDoc)
 | 
						|
		xslDoc=this.xslDoc;
 | 
						|
 | 
						|
	if (xslDoc.responseXML)
 | 
						|
		xslDoc=xslDoc.responseXML
 | 
						|
 | 
						|
	if (!xmlDoc)
 | 
						|
		xmlDoc=this.xmlDoc;
 | 
						|
 | 
						|
	if (xmlDoc.responseXML)
 | 
						|
		xmlDoc=xmlDoc.responseXML
 | 
						|
 | 
						|
	//MOzilla
 | 
						|
	if (!_isIE){
 | 
						|
		if (!this.XSLProcessor){
 | 
						|
			this.XSLProcessor=new XSLTProcessor();
 | 
						|
			this.XSLProcessor.importStylesheet(xslDoc);
 | 
						|
		}
 | 
						|
		var result = this.XSLProcessor.transformToDocument(xmlDoc);
 | 
						|
	} else {
 | 
						|
		var result = new ActiveXObject("Msxml2.DOMDocument.3.0");
 | 
						|
		try{
 | 
						|
			xmlDoc.transformNodeToObject(xslDoc, result);
 | 
						|
		}catch(e){
 | 
						|
			result = xmlDoc.transformNode(xslDoc);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return result;
 | 
						|
}
 | 
						|
 | 
						|
dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){
 | 
						|
	var res = this.doXSLTransToObject(xslDoc, xmlDoc);
 | 
						|
	if(typeof(res)=="string")
 | 
						|
		return res;
 | 
						|
	return this.doSerialization(res);
 | 
						|
}
 | 
						|
 | 
						|
dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){
 | 
						|
	if (!xmlDoc)
 | 
						|
			xmlDoc=this.xmlDoc;
 | 
						|
	if (xmlDoc.responseXML)
 | 
						|
			xmlDoc=xmlDoc.responseXML
 | 
						|
	if (!_isIE){
 | 
						|
		var xmlSerializer = new XMLSerializer();
 | 
						|
		return xmlSerializer.serializeToString(xmlDoc);
 | 
						|
	} else
 | 
						|
		return xmlDoc.xml;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
*   @desc: 
 | 
						|
*   @type: private
 | 
						|
*/
 | 
						|
dhtmlxEventable=function(obj){
 | 
						|
		obj.attachEvent=function(name, catcher, callObj){
 | 
						|
			name='ev_'+name.toLowerCase();
 | 
						|
			if (!this[name])
 | 
						|
				this[name]=new this.eventCatcher(callObj||this);
 | 
						|
				
 | 
						|
			return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID)
 | 
						|
		}
 | 
						|
		obj.callEvent=function(name, arg0){ 
 | 
						|
			name='ev_'+name.toLowerCase();
 | 
						|
			if (this[name])
 | 
						|
				return this[name].apply(this, arg0);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		obj.checkEvent=function(name){
 | 
						|
			return (!!this['ev_'+name.toLowerCase()])
 | 
						|
		}
 | 
						|
		obj.eventCatcher=function(obj){
 | 
						|
			var dhx_catch = [];
 | 
						|
			var z = function(){
 | 
						|
				var res = true;
 | 
						|
				for (var i = 0; i < dhx_catch.length; i++){
 | 
						|
					if (dhx_catch[i] != null){
 | 
						|
						var zr = dhx_catch[i].apply(obj, arguments);
 | 
						|
						res=res&&zr;
 | 
						|
					}
 | 
						|
				}
 | 
						|
				return res;
 | 
						|
			}
 | 
						|
			z.addEvent=function(ev){
 | 
						|
				if (typeof (ev) != "function")
 | 
						|
					ev=eval(ev);
 | 
						|
				if (ev)
 | 
						|
					return dhx_catch.push(ev)-1;
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			z.removeEvent=function(id){
 | 
						|
				dhx_catch[id]=null;
 | 
						|
			}
 | 
						|
			return z;
 | 
						|
		}
 | 
						|
		obj.detachEvent=function(id){
 | 
						|
			if (id != false){
 | 
						|
				var list = id.split(':');           //get EventName and ID
 | 
						|
				this[list[0]].removeEvent(list[1]); //remove event
 | 
						|
			}
 | 
						|
		}
 | 
						|
		obj.detachAllEvents = function(){
 | 
						|
			for (var name in this){
 | 
						|
				if (name.indexOf("ev_")==0) 
 | 
						|
					delete this[name];
 | 
						|
			}
 | 
						|
		}
 | 
						|
}
 |