2383 lines
		
	
	
		
			72 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			2383 lines
		
	
	
		
			72 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
| Product Name: dhtmlxVault 
 | ||
| Version: 2.4 
 | ||
| Edition: Standard 
 | ||
| License: content of this file is covered by GPL. Usage outside GPL terms is prohibited. To obtain Commercial or Enterprise license contact sales@dhtmlx.com
 | ||
| Copyright UAB Dinamenta http://www.dhtmlx.com
 | ||
| */
 | ||
| 
 | ||
| /* dhtmlx.com */
 | ||
| 
 | ||
| if (typeof(window.dhx4) == "undefined") {
 | ||
| 	
 | ||
| 	window.dhx4 = {
 | ||
| 		
 | ||
| 		version: "4.1.2",
 | ||
| 		
 | ||
| 		skin: null, // allow to be set by user
 | ||
| 		
 | ||
| 		skinDetect: function(comp) {
 | ||
| 			return {10:"dhx_skyblue",20:"dhx_web",30:"dhx_terrace"}[this.readFromCss(comp+"_skin_detect")]||null;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// read value from css
 | ||
| 		readFromCss: function(className, property) {
 | ||
| 			var t = document.createElement("DIV");
 | ||
| 			t.className = className;
 | ||
| 			if (document.body.firstChild != null) document.body.insertBefore(t, document.body.firstChild); else document.body.appendChild(t);
 | ||
| 			var w = t[property||"offsetWidth"];
 | ||
| 			t.parentNode.removeChild(t);
 | ||
| 			t = null;
 | ||
| 			return w;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// id manager
 | ||
| 		lastId: 1,
 | ||
| 		newId: function() {
 | ||
| 			return this.lastId++;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// z-index manager
 | ||
| 		zim: {
 | ||
| 			data: {},
 | ||
| 			step: 5,
 | ||
| 			first: function() {
 | ||
| 				return 100;
 | ||
| 			},
 | ||
| 			last: function() {
 | ||
| 				var t = this.first();
 | ||
| 				for (var a in this.data) t = Math.max(t, this.data[a]);
 | ||
| 				return t;
 | ||
| 			},
 | ||
| 			reserve: function(id) {
 | ||
| 				this.data[id] = this.last()+this.step;
 | ||
| 				return this.data[id];
 | ||
| 			},
 | ||
| 			clear: function(id) {
 | ||
| 				if (this.data[id] != null) {
 | ||
| 					this.data[id] = null;
 | ||
| 					delete this.data[id];
 | ||
| 				}
 | ||
| 			}
 | ||
| 		},
 | ||
| 		
 | ||
| 		// string to boolean
 | ||
| 		s2b: function(r) {
 | ||
| 			if (typeof(r) == "string") r = r.toLowerCase();
 | ||
| 			return (r == true || r == 1 || r == "true" || r == "1" || r == "yes" || r == "y");
 | ||
| 		},
 | ||
| 		
 | ||
| 		// string to json
 | ||
| 		s2j: function(s) {
 | ||
| 			var obj = null;
 | ||
| 			dhx4.temp = null;
 | ||
| 			try { eval("dhx4.temp="+s); } catch(e) { dhx4.temp = null; }
 | ||
| 			obj = dhx4.temp;
 | ||
| 			dhx4.temp = null;
 | ||
| 			return obj;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// absolute top/left position on screen
 | ||
| 		absLeft: function(obj) {
 | ||
| 			if (typeof(obj) == "string") obj = document.getElementById(obj);
 | ||
| 			return this.getOffset(obj).left;
 | ||
| 		},
 | ||
| 		absTop: function(obj) {
 | ||
| 			if (typeof(obj) == "string") obj = document.getElementById(obj);
 | ||
| 			return this.getOffset(obj).top;
 | ||
| 		},
 | ||
| 		_aOfs: function(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};
 | ||
| 		},
 | ||
| 		_aOfsRect: function(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) };
 | ||
| 		},
 | ||
| 		getOffset: function(elem) {
 | ||
| 			if (elem.getBoundingClientRect) {
 | ||
| 				return this._aOfsRect(elem);
 | ||
| 			} else {
 | ||
| 				return this._aOfs(elem);
 | ||
| 			}
 | ||
| 		},
 | ||
| 		
 | ||
| 		// copy obj
 | ||
| 		_isObj: function(k) {
 | ||
| 			return (k != null && typeof(k) == "object" && typeof(k.length) == "undefined");
 | ||
| 		},
 | ||
| 		_copyObj: function(r) {
 | ||
| 			if (this._isObj(r)) {
 | ||
| 				var t = {};
 | ||
| 				for (var a in r) {
 | ||
| 					if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a];
 | ||
| 				}
 | ||
| 			} else {
 | ||
| 				var t = [];
 | ||
| 				for (var a=0; a<r.length; a++) {
 | ||
| 					if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a];
 | ||
| 				}
 | ||
| 			}
 | ||
| 			return t;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// screen dim
 | ||
| 		screenDim: function() {
 | ||
| 			var isIE = (navigator.userAgent.indexOf("MSIE") >= 0);
 | ||
| 			var dim = {};
 | ||
| 			dim.left = document.body.scrollLeft;
 | ||
| 			dim.right = dim.left+(window.innerWidth||document.body.clientWidth);
 | ||
| 			dim.top = Math.max((isIE?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop);
 | ||
| 			dim.bottom = dim.top+(isIE?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0):window.innerHeight);
 | ||
| 			return dim;
 | ||
| 		},
 | ||
| 		
 | ||
| 		// input/textarea range selection
 | ||
| 		selectTextRange: function(inp, start, end) {
 | ||
| 			
 | ||
| 			inp = (typeof(inp)=="string"?document.getElementById(inp):inp);
 | ||
| 			
 | ||
| 			var len = inp.value.length;
 | ||
| 			start = Math.max(Math.min(start, len), 0);
 | ||
| 			end = Math.min(end, len);
 | ||
| 			
 | ||
| 			if (inp.setSelectionRange) {
 | ||
| 				try {inp.setSelectionRange(start, end);} catch(e){}; // combo in grid under IE requires try/catch
 | ||
| 			} else if (inp.createTextRange) {
 | ||
| 				var range = inp.createTextRange();
 | ||
| 				range.moveStart("character", start);
 | ||
| 				range.moveEnd("character", end-len);
 | ||
| 				try {range.select();} catch(e){};
 | ||
| 			}
 | ||
| 		},
 | ||
| 		// transition
 | ||
| 		transData: null,
 | ||
| 		transDetect: function() {
 | ||
| 			
 | ||
| 			if (this.transData == null) {
 | ||
| 				
 | ||
| 				this.transData = {transProp: false, transEv: null};
 | ||
| 				
 | ||
| 				// transition, MozTransition, WebkitTransition, msTransition, OTransition
 | ||
| 				var k = {
 | ||
| 					"MozTransition": "transitionend",
 | ||
| 					"WebkitTransition": "webkitTransitionEnd",
 | ||
| 					"OTransition": "oTransitionEnd",
 | ||
| 					"msTransition": "transitionend",
 | ||
| 					"transition": "transitionend"
 | ||
| 				};
 | ||
| 				
 | ||
| 				for (var a in k) {
 | ||
| 					if (this.transData.transProp == false && document.documentElement.style[a] != null) {
 | ||
| 						this.transData.transProp = a;
 | ||
| 						this.transData.transEv = k[a];
 | ||
| 					}
 | ||
| 				}
 | ||
| 				k = null;
 | ||
| 			}
 | ||
| 			
 | ||
| 			return this.transData;
 | ||
| 			
 | ||
| 		},
 | ||
| 		
 | ||
| 		// xml parser
 | ||
| 		_xmlNodeValue: function(node) {
 | ||
| 			var value = "";
 | ||
| 			for (var q=0; q<node.childNodes.length; q++) {
 | ||
| 				value += (node.childNodes[q].nodeValue!=null?node.childNodes[q].nodeValue.toString().replace(/^[\n\r\s]{0,}/,"").replace(/[\n\r\s]{0,}$/,""):"");
 | ||
| 			}
 | ||
| 			return value;
 | ||
| 		}
 | ||
| 		
 | ||
| 	};
 | ||
| 	
 | ||
| 	// browser
 | ||
| 	window.dhx4.isIE = (navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("Trident") >= 0);
 | ||
| 	window.dhx4.isIE6 = (window.XMLHttpRequest == null && navigator.userAgent.indexOf("MSIE") >= 0);
 | ||
| 	window.dhx4.isIE7 = (navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0);
 | ||
| 	window.dhx4.isIE8 = (navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0);
 | ||
| 	window.dhx4.isOpera = (navigator.userAgent.indexOf("Opera") >= 0);
 | ||
| 	window.dhx4.isChrome = (navigator.userAgent.indexOf("Chrome") >= 0);
 | ||
| 	window.dhx4.isKHTML = (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0);
 | ||
| 	window.dhx4.isFF = (navigator.userAgent.indexOf("Firefox") >= 0);
 | ||
| 	window.dhx4.isIPad = (navigator.userAgent.search(/iPad/gi) >= 0);
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| if (typeof(window.dhx4.ajax) == "undefined") {
 | ||
| 	
 | ||
| 	window.dhx4.ajax = {
 | ||
| 		
 | ||
| 		// if false - dhxr param will added to prevent caching on client side (default),
 | ||
| 		// if true - do not add extra params
 | ||
| 		cache: false,
 | ||
| 		
 | ||
| 		// default method for load/loadStruct, post/get allowed
 | ||
| 		// get - since 4.1.1, this should fix 412 error for macos safari
 | ||
| 		method: "get",
 | ||
| 		
 | ||
| 		parse: function(data) {
 | ||
| 			data = data.replace(/^[\s]+/,"");
 | ||
| 			if (window.DOMParser && !dhx4.isIE) { // ff,ie9
 | ||
| 				var obj = (new window.DOMParser()).parseFromString(data, "text/xml");
 | ||
| 			} else if (window.ActiveXObject !== window.undefined) {
 | ||
| 				var obj = new window.ActiveXObject("Microsoft.XMLDOM");
 | ||
| 				obj.async = "false";
 | ||
| 				obj.loadXML(data);
 | ||
| 			}
 | ||
| 			return obj;
 | ||
| 		},
 | ||
| 		xmltop: function(tagname, xhr, obj) {
 | ||
| 			if (typeof xhr.status == "undefined" || xhr.status < 400) {
 | ||
| 				xml = (!xhr.responseXML) ? dhx4.ajax.parse(xhr.responseText || xhr) : (xhr.responseXML || xhr);
 | ||
| 				if (xml && xml.documentElement !== null && !xml.getElementsByTagName("parsererror").length)
 | ||
| 					return xml.getElementsByTagName(tagname)[0];
 | ||
| 			}
 | ||
| 
 | ||
| 			dhx4.callEvent("onLoadXMLError",["Incorrect XML", arguments[1], obj ]);
 | ||
| 			return document.createElement("DIV");
 | ||
| 		},
 | ||
| 		xpath: function(xpathExp, docObj) {
 | ||
| 			if (!docObj.nodeName)
 | ||
| 				docObj = docObj.responseXML || docObj;
 | ||
| 
 | ||
| 			if (dhx4.isIE){
 | ||
| 				return docObj.selectNodes(xpathExp)||[];
 | ||
| 			}else {
 | ||
| 				var rows = [], first;
 | ||
| 				var col = (docObj.ownerDocument||docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null);
 | ||
| 				while (first = col.iterateNext())
 | ||
| 					rows.push(first);
 | ||
| 				return rows;
 | ||
| 			}
 | ||
| 		},
 | ||
| 		query:function(config){
 | ||
| 			dhx4.ajax._call(
 | ||
| 				(config.method || "GET"),
 | ||
| 				config.url,
 | ||
| 				config.data || "",
 | ||
| 				(config.async || true),
 | ||
| 				config.callback,
 | ||
| 				null,
 | ||
| 				config.headers
 | ||
| 			);
 | ||
| 		},
 | ||
| 		get: function(url, onLoad) {
 | ||
| 			this._call("GET", url, null, true, onLoad);
 | ||
| 		},
 | ||
| 		getSync: function(url) {
 | ||
| 			return this._call("GET", url, null, false);
 | ||
| 		},
 | ||
| 		put: function(url, postData, onLoad) {
 | ||
| 			this._call("PUT", url, postData, true, onLoad);
 | ||
| 		},
 | ||
| 		del: function(url, postData, onLoad) {
 | ||
| 			this._call("DELETE", url, postData, true, onLoad);
 | ||
| 		},
 | ||
| 		post: function(url, postData, onLoad) {
 | ||
| 			if (arguments.length == 1) {
 | ||
| 				postData = "";
 | ||
| 			} else if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]) == "function")) {
 | ||
| 				onLoad = postData;
 | ||
| 				postData = "";
 | ||
| 			} else {
 | ||
| 				postData = String(postData);
 | ||
| 			}
 | ||
| 			this._call("POST", url, postData, true, onLoad);
 | ||
| 		},
 | ||
| 		postSync: function(url, postData) {
 | ||
| 			postData = (postData == null ? "" : String(postData));
 | ||
| 			return this._call("POST", url, postData, false);
 | ||
| 		},
 | ||
| 		getLong: function(url, onLoad) {
 | ||
| 			this._call("GET", url, null, true, onLoad, {url:url});
 | ||
| 		},
 | ||
| 		postLong: function(url, postData, onLoad) {
 | ||
| 			if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]))) {
 | ||
| 				onLoad = postData;
 | ||
| 				postData = "";
 | ||
| 			}
 | ||
| 			this._call("POST", url, postData, true, onLoad, {url:url, postData:postData});
 | ||
| 		},
 | ||
| 		_call: function(method, url, postData, async, onLoad, longParams, headers) {
 | ||
| 			
 | ||
| 			var t = (window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
 | ||
| 			var isQt = (navigator.userAgent.match(/AppleWebKit/) != null && navigator.userAgent.match(/Qt/) != null && navigator.userAgent.match(/Safari/) != null);
 | ||
| 			
 | ||
| 			if (async == true) {
 | ||
| 				t.onreadystatechange = function() {
 | ||
| 					if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { // what for long response and status 404?
 | ||
| 						if (t.status != 200 || t.responseText == "")
 | ||
| 							if (!dhx4.callEvent("onAjaxError", [t])) return;
 | ||
| 
 | ||
| 						window.setTimeout(function(){
 | ||
| 							if (typeof(onLoad) == "function") {
 | ||
| 								onLoad.apply(window, [{xmlDoc:t}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText
 | ||
| 							}
 | ||
| 							if (longParams != null) {
 | ||
| 								if (typeof(longParams.postData) != "undefined") {
 | ||
| 									dhx4.ajax.postLong(longParams.url, longParams.postData, onLoad);
 | ||
| 								} else {
 | ||
| 									dhx4.ajax.getLong(longParams.url, onLoad);
 | ||
| 								}
 | ||
| 							}
 | ||
| 							onLoad = null;
 | ||
| 							t = null;
 | ||
| 						},1);
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			
 | ||
| 			if (method == "GET" && this.cache != true) {
 | ||
| 				url += (url.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime()+"=1";
 | ||
| 			}
 | ||
| 			
 | ||
| 			t.open(method, url, async);
 | ||
| 			
 | ||
| 			if (headers){
 | ||
| 				for (var key in headers)
 | ||
| 					t.setRequestHeader(key, headers[key]);
 | ||
| 			} else if (method == "POST") {
 | ||
| 				t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 | ||
| 			} else if (method == "GET") {
 | ||
| 				postData = null;
 | ||
| 			}
 | ||
| 			
 | ||
| 			t.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 | ||
| 			
 | ||
| 			t.send(postData);
 | ||
| 			
 | ||
| 			if (!async) return {xmlDoc:t}; // dhtmlx-compat, response.xmlDoc.responseXML/responseText
 | ||
| 			
 | ||
| 		}
 | ||
| 	};
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| if (typeof(window.dhx4._enableDataLoading) == "undefined") {
 | ||
| 
 | ||
| 	window.dhx4._enableDataLoading = function(obj, initObj, xmlToJson, xmlRootTag, mode) {
 | ||
| 		
 | ||
| 		if (mode == "clear") {
 | ||
| 			
 | ||
| 			// clear attached functionality
 | ||
| 			
 | ||
| 			for (var a in obj._dhxdataload) {
 | ||
| 				obj._dhxdataload[a] = null;
 | ||
| 				delete obj._dhxdataload[a];
 | ||
| 			};
 | ||
| 			
 | ||
| 			obj._loadData = null;
 | ||
| 			obj._dhxdataload = null;
 | ||
| 			obj.load = null;
 | ||
| 			obj.loadStruct = null;
 | ||
| 			
 | ||
| 			obj = null;
 | ||
| 			
 | ||
| 			return;
 | ||
| 			
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj._dhxdataload = { // move to obj.conf?
 | ||
| 			initObj: initObj,
 | ||
| 			xmlToJson: xmlToJson,
 | ||
| 			xmlRootTag: xmlRootTag,
 | ||
| 			onBeforeXLS: null
 | ||
| 		};
 | ||
| 		
 | ||
| 		obj._loadData = function(data, loadParams, onLoad) {
 | ||
| 			
 | ||
| 			if (arguments.length == 2) {
 | ||
| 				onLoad = loadParams;
 | ||
| 				loadParams = null;
 | ||
| 			}
 | ||
| 			
 | ||
| 			var obj = null;
 | ||
| 			
 | ||
| 			// deprecated from 4.0, compatability with version (url, type[json|xml], onLoad)
 | ||
| 			if (arguments.length == 3) onLoad = arguments[2];
 | ||
| 			
 | ||
| 			if (typeof(data) == "string") {
 | ||
| 				
 | ||
| 				var k = data.replace(/^\s{1,}/,"").replace(/\s{1,}$/,"");
 | ||
| 				
 | ||
| 				var tag = new RegExp("^<"+this._dhxdataload.xmlRootTag);
 | ||
| 				
 | ||
| 				// xml
 | ||
| 				if (tag.test(k.replace(/^<\?xml[^\?]*\?>\s*/, ""))) { // remove leading <?xml ...?> if any, \n can be also presenе
 | ||
| 					obj = dhx4.ajax.parse(data);
 | ||
| 					if (obj != null) obj = this[this._dhxdataload.xmlToJson].apply(this, [obj]); // xml to json
 | ||
| 				}
 | ||
| 				
 | ||
| 				if (obj == null && (k.match(/^\{.*\}$/) != null || k.match(/^\[.*\]$/) != null)) {
 | ||
| 					obj = dhx4.s2j(k);
 | ||
| 				}
 | ||
| 				
 | ||
| 				if (obj == null) {
 | ||
| 					
 | ||
| 					this.callEvent("onXLS",[]);
 | ||
| 					
 | ||
| 					var params = [];
 | ||
| 					
 | ||
| 					// allow to modify url and add params
 | ||
| 					if (typeof(this._dhxdataload.onBeforeXLS) == "function") {
 | ||
| 						var k = this._dhxdataload.onBeforeXLS.apply(this,[data]);
 | ||
| 						if (k != null && typeof(k) == "object") {
 | ||
| 							if (k.url != null) data = k.url;
 | ||
| 							if (k.params != null) { for (var a in k.params) params.push(a+"="+encodeURIComponent(k.params[a])); }
 | ||
| 						}
 | ||
| 					}
 | ||
| 					
 | ||
| 					var t = this;
 | ||
| 					var callBack = function(r) {
 | ||
| 						
 | ||
| 						var obj = null;
 | ||
| 						
 | ||
| 						if ((r.xmlDoc.getResponseHeader("Content-Type")||"").search(/xml/gi) >= 0 || (r.xmlDoc.responseText.replace(/^\s{1,}/,"")).match(/^</) != null) {
 | ||
| 							obj = t[t._dhxdataload.xmlToJson].apply(t,[r.xmlDoc.responseXML]);
 | ||
| 						} else {
 | ||
| 							obj = dhx4.s2j(r.xmlDoc.responseText);
 | ||
| 						}
 | ||
| 						
 | ||
| 						// init
 | ||
| 						if (obj != null) t[t._dhxdataload.initObj].apply(t,[obj,data]); // data => url
 | ||
| 						
 | ||
| 						t.callEvent("onXLE",[]);
 | ||
| 						
 | ||
| 						if (onLoad != null) {
 | ||
| 							if (typeof(onLoad) == "function") {
 | ||
| 								onLoad.apply(t,[]);
 | ||
| 							} else if (typeof(window[onLoad]) == "function") {
 | ||
| 								window[onLoad].apply(t,[]);
 | ||
| 							}
 | ||
| 						}
 | ||
| 						
 | ||
| 						callBack = onLoad = null;
 | ||
| 						obj = r = t = null;
 | ||
| 						
 | ||
| 					};
 | ||
| 					
 | ||
| 					params = params.join("&")+(typeof(loadParams)=="string"?"&"+loadParams:"");
 | ||
| 					
 | ||
| 					if (dhx4.ajax.method == "post") {
 | ||
| 						dhx4.ajax.post(data, params, callBack);
 | ||
| 					} else if (dhx4.ajax.method == "get") {
 | ||
| 						dhx4.ajax.get(data+(params.length>0?(data.indexOf("?")>0?"&":"?")+params:""), callBack);
 | ||
| 					}
 | ||
| 					
 | ||
| 					return;
 | ||
| 				}
 | ||
| 				
 | ||
| 			} else {
 | ||
| 				if (typeof(data.documentElement) == "object" || (typeof(data.tagName) != "undefined" && typeof(data.getElementsByTagName) != "undefined" && data.getElementsByTagName(this._dhxdataload.xmlRootTag).length > 0)) { // xml
 | ||
| 					obj = this[this._dhxdataload.xmlToJson].apply(this, [data]);
 | ||
| 				} else { // json
 | ||
| 					obj = window.dhx4._copyObj(data);
 | ||
| 				}
 | ||
| 				
 | ||
| 			}
 | ||
| 			
 | ||
| 			// init
 | ||
| 			if (obj != null) this[this._dhxdataload.initObj].apply(this,[obj]);
 | ||
| 			
 | ||
| 			if (onLoad != null) {
 | ||
| 				if (typeof(onLoad) == "function") {
 | ||
| 					onLoad.apply(this, []);
 | ||
| 				} else if (typeof(window[onLoad]) == "function") {
 | ||
| 					window[onLoad].apply(this, []);
 | ||
| 				}
 | ||
| 				onLoad = null;
 | ||
| 			}
 | ||
| 			
 | ||
| 		};
 | ||
| 		
 | ||
| 		// loadStruct for hdr/conf
 | ||
| 		// load for data
 | ||
| 		if (mode != null) {
 | ||
| 			var k = {struct: "loadStruct", data: "load"};
 | ||
| 			for (var a in mode) {
 | ||
| 				if (mode[a] == true) obj[k[a]] = function() {return this._loadData.apply(this, arguments);}
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj = null;
 | ||
| 		
 | ||
| 	};
 | ||
| };
 | ||
| 
 | ||
| if (typeof(window.dhx4._eventable) == "undefined") {
 | ||
| 	
 | ||
| 	window.dhx4._eventable = function(obj, mode) {
 | ||
| 		
 | ||
| 		if (mode == "clear") {
 | ||
| 			
 | ||
| 			obj.detachAllEvents();
 | ||
| 			
 | ||
| 			obj.dhxevs = null;
 | ||
| 			
 | ||
| 			obj.attachEvent = null;
 | ||
| 			obj.detachEvent = null;
 | ||
| 			obj.checkEvent = null;
 | ||
| 			obj.callEvent = null;
 | ||
| 			obj.detachAllEvents = null;
 | ||
| 			
 | ||
| 			obj = null;
 | ||
| 			
 | ||
| 			return;
 | ||
| 			
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj.dhxevs = { data: {} };
 | ||
| 		
 | ||
| 		obj.attachEvent = function(name, func) {
 | ||
| 			name = String(name).toLowerCase();
 | ||
| 			if (!this.dhxevs.data[name]) this.dhxevs.data[name] = {};
 | ||
| 			var eventId = window.dhx4.newId();
 | ||
| 			this.dhxevs.data[name][eventId] = func;
 | ||
| 			return eventId;
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj.detachEvent = function(eventId) {
 | ||
| 			for (var a in this.dhxevs.data) {
 | ||
| 				var k = 0;
 | ||
| 				for (var b in this.dhxevs.data[a]) {
 | ||
| 					if (b == eventId) {
 | ||
| 						this.dhxevs.data[a][b] = null;
 | ||
| 						delete this.dhxevs.data[a][b];
 | ||
| 					} else {
 | ||
| 						k++;
 | ||
| 					}
 | ||
| 				}
 | ||
| 				if (k == 0) {
 | ||
| 					this.dhxevs.data[a] = null;
 | ||
| 					delete this.dhxevs.data[a];
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj.checkEvent = function(name) {
 | ||
| 			name = String(name).toLowerCase();
 | ||
| 			return (this.dhxevs.data[name] != null);
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj.callEvent = function(name, params) {
 | ||
| 			name = String(name).toLowerCase();
 | ||
| 			if (this.dhxevs.data[name] == null) return true;
 | ||
| 			var r = true;
 | ||
| 			for (var a in this.dhxevs.data[name]) {
 | ||
| 				r = this.dhxevs.data[name][a].apply(this, params) && r;
 | ||
| 			}
 | ||
| 			return r;
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj.detachAllEvents = function() {
 | ||
| 			for (var a in this.dhxevs.data) {
 | ||
| 				for (var b in this.dhxevs.data[a]) {
 | ||
| 					this.dhxevs.data[a][b] = null;
 | ||
| 					delete this.dhxevs.data[a][b];
 | ||
| 				}
 | ||
| 				this.dhxevs.data[a] = null;
 | ||
| 				delete this.dhxevs.data[a];
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		obj = null;
 | ||
| 	};
 | ||
| 
 | ||
| 
 | ||
| 	dhx4._eventable(dhx4);
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| function dhtmlXVaultObject(conf) {
 | ||
| 	
 | ||
| 	var that = this;
 | ||
| 	
 | ||
| 	this.conf = {
 | ||
| 		version: "2.4",
 | ||
| 		skin: (conf.skin||window.dhx4.skin||(typeof(dhtmlx)!="undefined"?dhtmlx.skin:null)||window.dhx4.skinDetect("dhxvault")||"dhx_skyblue"),
 | ||
| 		param_name: (typeof(conf.paramName)!="undefined"?conf.paramName:"file"),
 | ||
| 		engine: null,
 | ||
| 		list: "list_default",
 | ||
| 		url: conf.uploadUrl||"",
 | ||
| 		download_url: (conf.downloadUrl||""), // added in 2.4
 | ||
| 		// multiple files, html5/flash only
 | ||
| 		multiple_files: (typeof(conf.multiple)!="undefined"?conf.multiple==true:true),
 | ||
| 		// swf-file path
 | ||
| 		swf_file: conf.swfPath||"",
 | ||
| 		swf_url:  conf.swfUrl||"",
 | ||
| 		swf_logs: conf.swfLogs||"no",
 | ||
| 		// sl-data
 | ||
| 		sl_xap:  conf.slXap,
 | ||
| 		sl_url:  conf.slUrl,
 | ||
| 		sl_logs: conf.slLogs,
 | ||
| 		// common
 | ||
| 		enabled: true,
 | ||
| 		auto_start: (typeof(conf.autoStart)!="undefined"?conf.autoStart==true:true), // true by default
 | ||
| 		auto_remove: (typeof(conf.autoRemove)!="undefined"?conf.autoRemove==true:false), // false by default
 | ||
| 		files_added: 0,
 | ||
| 		uploaded_count: 0,
 | ||
| 		files_limit: (typeof(conf.filesLimit)!="undefined"?conf.filesLimit:0), // max files
 | ||
| 		max_file_size: parseInt(conf.maxFileSize)||0,
 | ||
| 		buttons: { // visible buttons
 | ||
| 			upload: (typeof(conf.buttonUpload)!="undefined"?(conf.buttonUpload==true):false),
 | ||
| 			clear: (typeof(conf.buttonClear)!="undefined"?(conf.buttonClear==true):true)
 | ||
| 		},
 | ||
| 		// offsets
 | ||
| 		ofs: {
 | ||
| 			dhx_skyblue: 5,
 | ||
| 			dhx_web: 7,
 | ||
| 			dhx_terrace: 10,
 | ||
| 			bootstrap: 10
 | ||
| 		},
 | ||
| 		// data
 | ||
| 		uploaded_state: {}, // save state tru/false for uploaded or failed
 | ||
| 		uploaded_files: {}, // uploaded files data
 | ||
| 		// progress mode
 | ||
| 		progress_mode: "percent", // "percent","eta"
 | ||
| 		// icons
 | ||
| 		icon_def: "",
 | ||
| 		icons: {} // generated
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.list = new this[this.conf.list]();
 | ||
| 	
 | ||
| 	// icons
 | ||
| 	this.conf.icon_def = this.icon_def;
 | ||
| 	for (var a in this.icons) {
 | ||
| 		for (var q=0; q<this.icons[a].length; q++) this.conf.icons[this.icons[a][q]] = a;
 | ||
| 	}
 | ||
| 	
 | ||
| 	// engine detect
 | ||
| 	if (typeof(conf.mode) == "string" && typeof(this[conf.mode]) == "function") {
 | ||
| 		this.conf.engine = conf.mode;
 | ||
| 	} else {
 | ||
| 		this.conf.engine = "html4";
 | ||
| 		
 | ||
| 		var k = null;
 | ||
| 		if (typeof(window.FormData) != "undefined" && typeof(window.XMLHttpRequest) != "undefined") {
 | ||
| 			k = new XMLHttpRequest();
 | ||
| 			if (typeof(k.upload) == "undefined") k = null;
 | ||
| 		}
 | ||
| 		
 | ||
| 		if (k != null) {
 | ||
| 			// IE10, IE11, FF, Chrome, Opera
 | ||
| 			this.conf.engine = "html5";
 | ||
| 		} else if (typeof(window.swfobject) != "undefined" || k === false) {
 | ||
| 			var k = swfobject.getFlashPlayerVersion();
 | ||
| 			if (k.major >= 10) this.conf.engine = "flash";
 | ||
| 		} else {
 | ||
| 			// check if silverlight installed
 | ||
| 			this.conf.sl_v = this.getSLVersion();
 | ||
| 			if (this.conf.sl_v) this.conf.engine = "sl";
 | ||
| 		}
 | ||
| 		k = null;
 | ||
| 	}
 | ||
| 	
 | ||
| 	var base = (typeof(conf.parent) != "undefined" ? conf.parent : conf.container);
 | ||
| 	base = (typeof(base)=="string"?document.getElementById(base):base);
 | ||
| 	conf.parent = conf.container = null;
 | ||
| 	
 | ||
| 	if (base._attach_mode == true) {
 | ||
| 		this.base = base;
 | ||
| 	} else {
 | ||
| 		this.base = document.createElement("DIV");
 | ||
| 		base.appendChild(this.base);
 | ||
| 	}
 | ||
| 	this.base.className += " dhx_vault_"+this.conf.skin;
 | ||
| 	if (base._no_border == true) this.base.style.border = "0px solid white";
 | ||
| 	
 | ||
| 	base = conf = null;
 | ||
| 	
 | ||
| 	// buttons
 | ||
| 	this.p_controls = document.createElement("DIV");
 | ||
| 	this.p_controls.className = "dhx_vault_controls";
 | ||
| 	this.base.appendChild(this.p_controls);
 | ||
| 	this.p_controls.onselectstart = function(e){
 | ||
| 		e = e||event;
 | ||
| 		if (e.preventDefault) e.preventDefault(); else e.returnValue = false;
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 	
 | ||
| 	// files
 | ||
| 	this.p_files = document.createElement("DIV");
 | ||
| 	this.p_files.className = "dhx_vault_files";
 | ||
| 	this.base.appendChild(this.p_files);
 | ||
| 	
 | ||
| 	this.p_files.ondragstart = function(e){
 | ||
| 		e = e||event;
 | ||
| 		var t = e.target||e.srcElement;
 | ||
| 		if (t.tagName != null && t.tagName.toLowerCase() == "a") {
 | ||
| 			if (e.preventDefault) e.preventDefault(); else e.returnValue = false;
 | ||
| 			return false;
 | ||
| 		}
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._doOnFilesClick = function(e) {
 | ||
| 		e = e||event;
 | ||
| 		var t = e.target||e.srcElement;
 | ||
| 		var action = null;
 | ||
| 		while (t != that.p_files && action == null) {
 | ||
| 			if (action == null && t != null && t._action != null) {
 | ||
| 				action = t._action;
 | ||
| 			} else {
 | ||
| 				t = t.parentNode;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		if (action == null) return;
 | ||
| 		if (action.data == "delete_file" && that.conf.enabled == true) {
 | ||
| 			that._removeFileFromQueue(action.id);
 | ||
| 		}
 | ||
| 		if (action.data == "download_file" && that.conf.enabled == true) {
 | ||
| 			that._doDownloadFile(action.id);
 | ||
| 		}
 | ||
| 		action = null;
 | ||
| 	}
 | ||
| 	if (typeof(window.addEventListener) == "function") {
 | ||
| 		this.p_files.addEventListener("click", this._doOnFilesClick, false);
 | ||
| 	} else {
 | ||
| 		this.p_files.attachEvent("onclick", this._doOnFilesClick);
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.file_data = {};
 | ||
| 	
 | ||
| 	this._initToolbar = function() {
 | ||
| 		
 | ||
| 		// add
 | ||
| 		this.b_opts = {
 | ||
| 			browse:	{ str: "btnAdd", onclick: null },
 | ||
| 			upload:	{ str: "btnUpload", onclick: function() { if (!that.conf.enabled) return; if (!that.conf.uploading) { that._uploadStart(); } } },
 | ||
| 			cancel:	{ str: "btnCancel", onclick: function() { if (!that.conf.enabled) return; that._uploadStop(); that._switchButton(false); } },
 | ||
| 			clear:	{ str: "btnClean", onclick: function() { if (!that.conf.enabled) return; that.clear(); }, css: "float:right!important;"}
 | ||
| 		};
 | ||
| 		
 | ||
| 		this.buttons = {};
 | ||
| 		
 | ||
| 		for (var a in this.b_opts) {
 | ||
| 			var k = document.createElement("DIV");
 | ||
| 			k.innerHTML = "<div class='dhxvault_button_icon dhx_vault_icon_"+a+"'></div>"+
 | ||
| 					"<div class='dhxvault_button_text'>"+this.strings[this.b_opts[a].str]+"</div>";
 | ||
| 			
 | ||
| 			if (this.b_opts[a].css != null) k.style.cssText += this.b_opts[a].css;
 | ||
| 			k.className = "dhx_vault_button";
 | ||
| 			k._css = k.className;
 | ||
| 			k._onclick = this.b_opts[a].onclick;
 | ||
| 			k.onmouseover = function() {
 | ||
| 				if (that.conf.enabled != true) return;
 | ||
| 				if (this._hover == true) return;
 | ||
| 				this._hover = true;
 | ||
| 				this.className = this._css+" dhx_vault_button"+this._css_p+"_hover";
 | ||
| 			}
 | ||
| 			k.onmouseout = function() {
 | ||
| 				if (that.conf.enabled != true) return;
 | ||
| 				if (this._hover != true) return;
 | ||
| 				this._hover = false;
 | ||
| 				this.className = this._css;
 | ||
| 			}
 | ||
| 			k.onmousedown = function() {
 | ||
| 				if (that.conf.enabled != true) return;
 | ||
| 				if (this._hover != true) return;
 | ||
| 				this._pressed = true;
 | ||
| 				this.className = this._css+" dhx_vault_button"+this._css_p+"_pressed";
 | ||
| 			}
 | ||
| 			k.onmouseup = function(e) {
 | ||
| 				if (that.conf.enabled != true) return;
 | ||
| 				if (this._pressed != true) return;
 | ||
| 				this._pressed = false;
 | ||
| 				this.className = this._css+(this._hover?" dhx_vault_button"+this._css_p+"_hover":"");
 | ||
| 				if (this._onclick != null) this._onclick();
 | ||
| 			}
 | ||
| 			if (this.b_opts[a].tooltip) k.title = this.b_opts[a].tooltip;
 | ||
| 			this.p_controls.appendChild(k);
 | ||
| 			this.buttons[a] = k;
 | ||
| 			k = null;
 | ||
| 			
 | ||
| 			// visibile
 | ||
| 			if (a == "upload" || a == "clear") this.buttons[a].style.display = (this.conf.buttons[a] == true?"":"none");
 | ||
| 			
 | ||
| 			this.b_opts[a].onclick = null;
 | ||
| 			this.b_opts[a] = null;
 | ||
| 			delete this.b_opts[a];
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.b_opts = null;
 | ||
| 		delete this.b_opts;
 | ||
| 		
 | ||
| 		this.buttons.cancel.style.display = "none";
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._beforeAddFileToList = function(name, size, lastModifiedDate) {
 | ||
| 		return (this.callEvent("onBeforeFileAdd", [{
 | ||
| 			id: null,
 | ||
| 			name: name,
 | ||
| 			size: size,
 | ||
| 			lastModifiedDate: lastModifiedDate,
 | ||
| 			serverName: null,
 | ||
| 			uploaded: false,
 | ||
| 			error: false
 | ||
| 		}])===true);
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._addFileToList = function(id, name, size, state, progress) {
 | ||
| 		
 | ||
| 		var ext = this.getFileExtension(name);
 | ||
| 		var icon = (ext.length>0?(this.conf.icons[ext.toLowerCase()]||this.conf.icon_def):this.conf.icon_def);
 | ||
| 		var error = false;
 | ||
| 		
 | ||
| 		// check filesize
 | ||
| 		if (state == "added" && typeof(size) == "number" && size > 0 && this.conf.max_file_size > 0 && size > this.conf.max_file_size) {
 | ||
| 			state = this.file_data[id].state = "size_exceeded";
 | ||
| 			error = true;
 | ||
| 		}
 | ||
| 		
 | ||
| 		// add div for new file
 | ||
| 		this.list.addFileItem(id, this.p_files);
 | ||
| 		
 | ||
| 		// render file in list
 | ||
| 		this.list.renderFileRecord(id, {name: name, icon: icon, size: size, readableSize: this.readableSize(size||0), state: state, progress: progress});
 | ||
| 		
 | ||
| 		// if filesize exceeded - update status
 | ||
| 		if (state == "size_exceeded") {
 | ||
| 			this.list.updateFileState(id, {state: state, str_size_exceeded: window.dhx4.template(this.strings.size_exceeded,{size:this.readableSize(this.conf.max_file_size)})});
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.callEvent("onFileAdd", [{
 | ||
| 			id: id,
 | ||
| 			name: name,
 | ||
| 			size: size,
 | ||
| 			lastModifiedDate: this.file_data[id].file.lastModifiedDate||null,
 | ||
| 			serverName: null,
 | ||
| 			uploaded: false,
 | ||
| 			error: error
 | ||
| 		}]);
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._removeFileFromList = function(id) {
 | ||
| 		
 | ||
| 		// remove div from list
 | ||
| 		this.list.removeFileRecord(id);
 | ||
| 		
 | ||
| 		if (this.conf.uploaded_files[id] != null) {
 | ||
| 			this.conf.uploaded_files[id] = null;
 | ||
| 			delete this.conf.uploaded_files[id];
 | ||
| 		}
 | ||
| 		
 | ||
| 		if (this.conf.uploaded_state[id] != null) {
 | ||
| 			this.conf.uploaded_state[id] = null;
 | ||
| 			delete this.conf.uploaded_state[id];
 | ||
| 		}
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._updateFileInList = function(id, state, progress) {
 | ||
| 		if (this.list.isFileItemExist(id) == false) return;
 | ||
| 		if (state == "uploading" && this.conf.progress_mode == "eta" && this._etaStart != null) this._etaStart(id);
 | ||
| 		// progress
 | ||
| 		this._updateProgress(id, state, progress);
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._updateProgress = function(id, state, progress) {
 | ||
| 		if (state == "added") {
 | ||
| 			this.list.updateFileState(id, {state: state});
 | ||
| 			if (this.conf.progress_mode == "eta" && this._etaEnd != null) this._etaEnd(id);
 | ||
| 			return;
 | ||
| 		}
 | ||
| 		if (state == "fail") {
 | ||
| 			this.list.updateFileState(id, {state: state, str_error: this.strings.error});
 | ||
| 			if (this.conf.progress_mode == "eta" && this._etaEnd != null) this._etaEnd(id);
 | ||
| 			return;
 | ||
| 		}
 | ||
| 		if (state == "uploaded") {
 | ||
| 			if (this.conf.progress_mode == "eta" && this._etaEnd != null) this._etaEnd(id);
 | ||
| 			var str_done = this.strings.done;
 | ||
| 			var nameSizeData = (this.conf.engine != "html4" ? {} : {name: this.file_data[id].name, size: this.file_data[id].size, readableSize: this.readableSize(this.file_data[id].size||0)}); // for html4 mode - update size
 | ||
| 			window.setTimeout(function(){
 | ||
| 				that.list.updateFileState(id, {state: "uploaded", str_done: str_done});
 | ||
| 				nameSizeData.download = (that.conf.download_url.length > 0);
 | ||
| 				that.list.updateFileNameSize(id, nameSizeData);
 | ||
| 			}, 100); // for very little files or goood internet line
 | ||
| 			return;
 | ||
| 		}
 | ||
| 		if (state == "uploading") {
 | ||
| 			if ((progress < 100 && this.conf.progress_type == "loader") || this.file_data[id].custom == true) {
 | ||
| 				/* html4 mode or custom record - no progress */
 | ||
| 				this.list.updateFileState(id, {state: "uploading_html4"});
 | ||
| 			} else if (this.conf.progress_mode == "eta") {
 | ||
| 				var eta = (this._etaCheck!=null?this._etaCheck(id,progress):null);
 | ||
| 				this.list.updateFileState(id, {state: "uploading", progress: progress, eta: (eta==null?null:"eta: "+eta)});
 | ||
| 			} else if (this.conf.progress_mode == "percent") {
 | ||
| 				this.list.updateFileState(id, {state: "uploading", progress: progress, eta: progress+"%"});
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._removeFilesByState = function(state) {
 | ||
| 		for (var a in this.file_data) {
 | ||
| 			if (state === true || this.file_data[a].state == state) {
 | ||
| 				this._removeFileFromQueue(a);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._switchButton = function(state) {
 | ||
| 		
 | ||
| 		if (state == true) {
 | ||
| 			if (this.conf.buttons.upload == true) {
 | ||
| 				this.buttons.upload.style.display = "none";
 | ||
| 				this.buttons.cancel.style.display = "";
 | ||
| 			}
 | ||
| 		} else {
 | ||
| 			var t = this.conf.uploaded_count;
 | ||
| 			var f = [];
 | ||
| 			for (var a in this.conf.uploaded_state) {
 | ||
| 				f.push({
 | ||
| 					id: a,
 | ||
| 					name: this._fileName,
 | ||
| 					size: (this.file_data[a]!=null?this.file_data[a].size:null),
 | ||
| 					lastModifiedDate: (this.file_data[a]!=null?(this.file_data[a].file.lastModifiedDate||null):null),
 | ||
| 					serverName: (this.conf.uploaded_files[a]?this.conf.uploaded_files[a].serverName:null),
 | ||
| 					uploaded: this.conf.uploaded_state[a],
 | ||
| 					error: !this.conf.uploaded_state[a]
 | ||
| 				});
 | ||
| 			}
 | ||
| 			if (this.conf.buttons.upload == true) {
 | ||
| 				this.buttons.upload.style.display = "";
 | ||
| 				this.buttons.cancel.style.display = "none";
 | ||
| 			}
 | ||
| 			this.conf.uploaded_count = 0;
 | ||
| 			this.conf.uploaded_state = {};
 | ||
| 			if (t > 0) this.callEvent("onUploadComplete",[f]);
 | ||
| 		}
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._uploadStart = function() {
 | ||
| 		
 | ||
| 		this._switchButton(true);
 | ||
| 		
 | ||
| 		// change status for prev fail auploads if any
 | ||
| 		if (!this.conf.uploading) {
 | ||
| 			for (var a in this.file_data) {
 | ||
| 				if (this.file_data[a].state == "fail") {
 | ||
| 					this.file_data[a].state = "added";
 | ||
| 					this._updateFileInList(a, "added", 0);
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.conf.uploading = true;
 | ||
| 		
 | ||
| 		var t = false;
 | ||
| 		
 | ||
| 		for (var a in this.file_data) {
 | ||
| 			if (!t && [this.file_data[a].state] == "added") {
 | ||
| 				t = true;
 | ||
| 				this.file_data[a].state = "uploading";
 | ||
| 				this._updateFileInList(a, "uploading", 0);
 | ||
| 				this._doUploadFile(a);
 | ||
| 			}
 | ||
| 		}
 | ||
| 		if (!t) {
 | ||
| 			this.conf.uploading = false;
 | ||
| 			this._switchButton(false);
 | ||
| 		}
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._onUploadSuccess = function(id, serverName, r, extra) {
 | ||
| 		
 | ||
| 		// flash mode
 | ||
| 		if (typeof(r) != "undefined" && this.conf.engine == "flash") {
 | ||
| 			var t = window.dhx4.s2j(r.data);
 | ||
| 			if (t != null && t.state == true && t.name != null) {
 | ||
| 				serverName = t.name;
 | ||
| 				if (t.extra != null) extra = t.extra;
 | ||
| 			} else {
 | ||
| 				this._onUploadFail(id, (t!=null&&t.extra!=null?t.extra:null));
 | ||
| 				return;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		//
 | ||
| 		this.conf.uploaded_count++;
 | ||
| 		this.conf.uploaded_files[id] = {realName: this.file_data[id].name, serverName: serverName};
 | ||
| 		this.file_data[id].state = "uploaded";
 | ||
| 		this.conf.uploaded_state[id] = true;
 | ||
| 		this._updateFileInList(id, "uploaded", 100);
 | ||
| 		this.callEvent("onUploadFile", [{
 | ||
| 			id: id,
 | ||
| 			name: this.file_data[id].name,
 | ||
| 			size: this.file_data[id].size,
 | ||
| 			lastModifiedDate: this.file_data[id].file.lastModifiedDate||null,
 | ||
| 			serverName: serverName,
 | ||
| 			uploaded: true,
 | ||
| 			error: false
 | ||
| 		}, extra]);
 | ||
| 		if (this.conf.auto_remove) this._removeFileFromQueue(id);
 | ||
| 		if (this.conf.uploading) this._uploadStart();
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._onUploadFail = function(id, extra) {
 | ||
| 		this.file_data[id].state = "fail";
 | ||
| 		this._updateFileInList(id, "fail", 0);
 | ||
| 		this.conf.uploaded_state[id] = false;
 | ||
| 		this.callEvent("onUploadFail", [{
 | ||
| 			id: id,
 | ||
| 			name: this.file_data[id].name,
 | ||
| 			size: this.file_data[id].size,
 | ||
| 			lastModifiedDate: this.file_data[id].file.lastModifiedDate||null,
 | ||
| 			serverName: null,
 | ||
| 			uploaded: false,
 | ||
| 			error: true
 | ||
| 		}, extra]);
 | ||
| 		if (this.conf.uploading) this._uploadStart();
 | ||
| 	}
 | ||
| 	
 | ||
| 	this._onUploadAbort = function(id) {
 | ||
| 		this.conf.uploading = false;
 | ||
| 		this.file_data[id].state = "added";
 | ||
| 		this._updateFileInList(id, "added", 0);
 | ||
| 		this.callEvent("onUploadCancel",[{
 | ||
| 			id: id,
 | ||
| 			name: this.file_data[id].name,
 | ||
| 			size: this.file_data[id].size,
 | ||
| 			lastModifiedDate: this.file_data[id].file.lastModifiedDate,
 | ||
| 			serverName: null,
 | ||
| 			uploaded: false,
 | ||
| 			error: false
 | ||
| 		}]);
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.unload = function() {
 | ||
| 		
 | ||
| 		this.callEvent = function(){return true;}; // some events while files will removed from list
 | ||
| 		
 | ||
| 		//
 | ||
| 		if (typeof(window.addEventListener) == "function") {
 | ||
| 			this.p_files.removeEventListener("click", this._doOnFilesClick, false);
 | ||
| 		} else {
 | ||
| 			this.p_files.detachEvent("onclick", this._doOnFilesClick);
 | ||
| 		}
 | ||
| 		
 | ||
| 		// remove all files from queue/list
 | ||
| 		this._removeFilesByState(true);
 | ||
| 		this.conf.uploaded_files = null;
 | ||
| 		this.file_data = null;
 | ||
| 		
 | ||
| 		// custom engine stuff
 | ||
| 		this._unloadEngine();
 | ||
| 		
 | ||
| 		this.list.unload();
 | ||
| 		this.list = null;
 | ||
| 		this.icons = null;
 | ||
| 		
 | ||
| 		// buttons
 | ||
| 		for (var a in this.buttons) {
 | ||
| 			this.buttons[a].onclick = null;
 | ||
| 			this.buttons[a].onmouseover = null;
 | ||
| 			this.buttons[a].onmouseout = null;
 | ||
| 			this.buttons[a].onmousedown = null;
 | ||
| 			this.buttons[a].onmouseup = null;
 | ||
| 			this.buttons[a]._onclick = null;
 | ||
| 			this.buttons[a].parentNode.removeChild(this.buttons[a]);
 | ||
| 			this.buttons[a] = null;
 | ||
| 			delete this.buttons[a];
 | ||
| 		}
 | ||
| 		this.buttons = null;
 | ||
| 		
 | ||
| 		// buttons container
 | ||
| 		this.p_controls.onselectstart = null;
 | ||
| 		this.p_controls.parentNode.removeChild(this.p_controls);
 | ||
| 		this.p_controls = null;
 | ||
| 		
 | ||
| 		// buttons container
 | ||
| 		this.p_files.ondragstart = null;
 | ||
| 		this.p_files.parentNode.removeChild(this.p_files);
 | ||
| 		this.p_files = null;
 | ||
| 		
 | ||
| 		window.dhx4._eventable(this, "clear");
 | ||
| 		this.callEvent = null;
 | ||
| 		
 | ||
| 		for (var a in this.conf) {
 | ||
| 			this.conf[a] = null;
 | ||
| 			delete this.conf[a];
 | ||
| 		}
 | ||
| 		this.conf = null;
 | ||
| 		this.strings = null;
 | ||
| 		
 | ||
| 		for (var a in this) {
 | ||
| 			if (typeof(this[a]) == "function") this[a] = null;
 | ||
| 		}
 | ||
| 		
 | ||
| 		// main container
 | ||
| 		if (this.base._attach_mode != true) this.base.parentNode.removeChild(this.base);
 | ||
| 		this.base = null;
 | ||
| 		
 | ||
| 		that = a = null;
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	// init engine-relative funcs
 | ||
| 	var e = new this[this.conf.engine]();
 | ||
| 	for (var a in e) { this[a] = e[a]; e[a] = null; }
 | ||
| 	a = e = p = null;
 | ||
| 	
 | ||
| 	// init app
 | ||
| 	this._initToolbar();
 | ||
| 	this._initEngine();
 | ||
| 	this.setSkin(this.conf.skin);
 | ||
| 	
 | ||
| 	window.dhx4._eventable(this);
 | ||
| 	
 | ||
| 	// files limit
 | ||
| 	this.attachEvent("onFileAdd", function(){
 | ||
| 		this.conf.files_added++;
 | ||
| 	});
 | ||
| 	this.attachEvent("onBeforeFileAdd", function(){
 | ||
| 		if (this.conf.files_limit == 0) return true;
 | ||
| 		return (this.conf.files_added < this.conf.files_limit);
 | ||
| 	});
 | ||
| 	
 | ||
| 	// IE7 size fix
 | ||
| 	if (window.dhx4.isIE7 || navigator.userAgent.indexOf("MSIE 7.0")>=0) {
 | ||
| 		var vault = this;
 | ||
| 		window.setTimeout(function(){vault.setSizes();vault=null;},1);
 | ||
| 	}
 | ||
| 	
 | ||
| 	// server settings if any
 | ||
| 	var callBack = function(r) {
 | ||
| 		var t = window.dhx4.s2j(r.xmlDoc.responseText);
 | ||
| 		if (t != null && t.maxFileSize != null && that.conf.max_file_size == 0) {
 | ||
| 			// update only if max file size was not set on init stage
 | ||
| 			that.conf.max_file_size = (parseInt(t.maxFileSize)||0);
 | ||
| 		}
 | ||
| 		t = r = callBack = null;
 | ||
| 	};
 | ||
| 	if (window.dhx4.ajax.method == "post") {
 | ||
| 		window.dhx4.ajax.post(this.conf.url, "mode=conf", callBack);
 | ||
| 	} else {
 | ||
| 		window.dhx4.ajax.get(this.conf.url+(this.conf.url.indexOf("?")>0?"&":"?")+"mode=conf", callBack);
 | ||
| 	}
 | ||
| 	
 | ||
| 	return this;
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.readableSize = function(t) {
 | ||
| 	var i = false;
 | ||
| 	var b = ["b","Kb","Mb","Gb","Tb","Pb","Eb"];
 | ||
| 	for (var q=0; q<b.length; q++) if (t > 1024) t = t / 1024; else if (i === false) i = q;
 | ||
| 	if (i === false) i = b.length-1;
 | ||
| 	return Math.round(t*100)/100+" "+b[i];
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.icon_def = "icon_def";
 | ||
| dhtmlXVaultObject.prototype.icons = {
 | ||
| 	// css => list_of_extensions
 | ||
| 	icon_image:	["jpg", "jpeg", "gif", "png", "bmp", "tiff", "pcx", "svg", "ico"],
 | ||
| 	icon_psd:	["psd"],
 | ||
| 	icon_video:	["avi", "mpg", "mpeg", "rm", "move", "mov", "mkv", "flv", "f4v", "mp4", "3gp"],
 | ||
| 	icon_audio:	["wav", "aiff", "au", "mp3", "aac", "wma", "ogg", "flac", "ape", "wv", "m4a", "mid", "midi"],
 | ||
| 	icon_arch:	["rar", "zip", "tar", "tgz", "arj", "gzip", "bzip2", "7z", "ace", "apk", "deb"],
 | ||
| 	icon_text:	["txt", "nfo", "djvu", "xml"],
 | ||
| 	icon_html:	["htm", "html"],
 | ||
| 	icon_doc:	["doc", "docx", "rtf", "odt"],
 | ||
| 	icon_xls:	["xls", "xlsx"],
 | ||
| 	icon_pdf:	["pdf", "ps"],
 | ||
| 	icon_exe:	["exe"],
 | ||
| 	icon_dmg:	["dmg"]
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.upload = function() {
 | ||
| 	if (!this.conf.uploading) this._uploadStart();
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setAutoStart = function(state) {
 | ||
| 	this.conf.auto_start = (state==true);
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setAutoRemove = function(state) {
 | ||
| 	this.conf.auto_remove = (state==true);
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setURL = function(url) {
 | ||
| 	this.conf.url = url;
 | ||
| };
 | ||
| 
 | ||
| // ability to donwload uploaded files, added in 2.4
 | ||
| dhtmlXVaultObject.prototype.setDownloadURL = function(url) {
 | ||
| 	this.conf.download_url = url||"";
 | ||
| 	for (var a in this.conf.uploaded_files) {
 | ||
| 		this.list.updateFileNameSize(a, {download: (this.conf.download_url.length>0)});
 | ||
| 	}
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype._buildDownloadUrl = function(id) {
 | ||
| 	var url = null;
 | ||
| 	if (this.conf.download_url.length > 0 && this.conf.uploaded_files[id] != null) {
 | ||
| 		var url = String(this.conf.download_url).replace(/\{serverName\}/g, encodeURIComponent(this.conf.uploaded_files[id].serverName));
 | ||
| 		if (window.dhx4.ajax.cache != true) url += (url.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime()+"=1";
 | ||
| 	}
 | ||
| 	return url;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype._doDownloadFile = function(id) {
 | ||
| 	
 | ||
| 	if (!this._dframe) {
 | ||
| 		this._dframe = document.createElement("IFRAME");
 | ||
| 		this._dframe.className = "dhxvault_dframe";
 | ||
| 		this._dframe.border = this._dframe.frameBorder = 0;
 | ||
| 		this.conf.df_name = this._dframe.name = "dhxvault_dframe_"+window.dhx4.newId();
 | ||
| 		document.body.appendChild(this._dframe);
 | ||
| 	}
 | ||
| 	
 | ||
| 	var form = document.createElement("FORM");
 | ||
| 	form.method = "POST";
 | ||
| 	form.target = this.conf.df_name;
 | ||
| 	form.action = this._buildDownloadUrl(id);
 | ||
| 	document.body.appendChild(form);
 | ||
| 	
 | ||
| 	form.submit();
 | ||
| 	window.setTimeout(function(){
 | ||
| 		document.body.removeChild(form);
 | ||
| 		form = null;
 | ||
| 	},1);
 | ||
| };
 | ||
| 
 | ||
| //
 | ||
| dhtmlXVaultObject.prototype.enable = function() {
 | ||
| 	if (this.conf.enabled == true) return;
 | ||
| 	this.conf.enabled = true;
 | ||
| 	this.base.className = String(this.base.className).replace(/\s{0,}dhx_vault_dis/gi,"");
 | ||
| 	if (this.conf.engine == "flash") document.getElementById(this.conf.swf_obj_id).style.display = "";
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.disable = function() {
 | ||
| 	if (this.conf.enabled != true) return;
 | ||
| 	this.conf.enabled = false;
 | ||
| 	this.base.className += " dhx_vault_dis";
 | ||
| 	if (this.conf.engine == "flash") document.getElementById(this.conf.swf_obj_id).style.display = "none";
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setWidth = function(w) { // set width of the control in pixels
 | ||
| 	if (this.base._attach_mode == true) return;
 | ||
| 	this.base.parentNode.style.width = w+"px";
 | ||
| 	this.setSizes();
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setHeight = function(h) { // set height of the control in pixels
 | ||
| 	if (this.base._attach_mode == true) return;
 | ||
| 	this.base.parentNode.style.height = h+"px";
 | ||
| 	this.setSizes();
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setFilesLimit = function(t) { // control the number of uploaded files
 | ||
| 	this.conf.files_added = 0; // reset old settings
 | ||
| 	this.conf.files_limit = t;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.getStatus = function() {
 | ||
| 	// 0 - filelist is empty
 | ||
| 	// 1 - all files in filelist uploaded
 | ||
| 	//-1 - not all files uploaded
 | ||
| 	var t = 0;
 | ||
| 	for (var a in this.file_data) {
 | ||
| 		if (this.file_data[a].state != "uploaded") return -1;
 | ||
| 		t = 1;
 | ||
| 	}
 | ||
| 	return t;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.getData = function() {
 | ||
| 	// return struct of uploaded files
 | ||
| 	var t = [];
 | ||
| 	for (var a in this.conf.uploaded_files) {
 | ||
| 		t.push({
 | ||
| 			id: a,
 | ||
| 			name: this.file_data[a].name,
 | ||
| 			size: this.file_data[a].size,
 | ||
| 			serverName: this.conf.uploaded_files[a].serverName,
 | ||
| 			uploaded: true,
 | ||
| 			error: false
 | ||
| 		});
 | ||
| 	}
 | ||
| 	return t;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.clear = function() {
 | ||
| 	if (this.callEvent("onBeforeClear", []) !== true) return;
 | ||
| 	if (this.conf.uploading) this._uploadStop();
 | ||
| 	this._switchButton(false);
 | ||
| 	this._removeFilesByState(true);
 | ||
| 	this.callEvent("onClear",[]);
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setSkin = function(skin) {
 | ||
| 	if (skin != this.conf.skin) {
 | ||
| 		this.base.className = String(this.base.className).replace(new RegExp("\s{0,}dhx_vault_"+this.conf.skin)," dhx_vault_"+skin);
 | ||
| 		this.conf.skin = skin;
 | ||
| 	}
 | ||
| 	
 | ||
| 	// update buttons data
 | ||
| 	this._updateBttonsSkin();
 | ||
| 	
 | ||
| 	
 | ||
| 	var ofs = this.conf.ofs[this.conf.skin];
 | ||
| 	
 | ||
| 	this.buttons.browse.style.marginLeft = ofs+"px";
 | ||
| 	this.buttons.upload.style.marginLeft = (skin=="dhx_terrace"?"-1px":ofs+"px");
 | ||
| 	this.buttons.cancel.style.marginLeft = this.buttons.upload.style.marginLeft;
 | ||
| 	this.buttons.clear.style.marginRight = ofs+"px";
 | ||
| 	
 | ||
| 	// border-radius
 | ||
| 	var r = "";
 | ||
| 	if (skin == "dhx_terrace") {
 | ||
| 		r = (this.conf.buttons.upload == true) ? "0px":"3px";
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.buttons.browse.style.borderTopRightRadius = r;
 | ||
| 	this.buttons.browse.style.borderBottomRightRadius = r;
 | ||
| 	this.buttons.upload.style.borderTopLeftRadius = r;
 | ||
| 	this.buttons.upload.style.borderBottomLeftRadius = r;
 | ||
| 	this.buttons.cancel.style.borderTopLeftRadius = this.buttons.upload.style.borderTopLeftRadius;
 | ||
| 	this.buttons.cancel.style.borderBottomLeftRadius = this.buttons.upload.style.borderBottomLeftRadius;
 | ||
| 	
 | ||
| 	this.setSizes();
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype._updateBttonsSkin = function() {
 | ||
| 	for (var a in this.buttons) {
 | ||
| 		var css = "dhx_vault_button";
 | ||
| 		var css_p = "";
 | ||
| 		if (this.buttonCss != null && this.buttonCss[this.conf.skin] != null && this.buttonCss[this.conf.skin][a] != null) {
 | ||
| 			css_p = this.buttonCss[this.conf.skin][a];
 | ||
| 			css += css_p;
 | ||
| 		}
 | ||
| 		this.buttons[a]._css = this.buttons[a].className = css;
 | ||
| 		this.buttons[a]._css_p = css_p;
 | ||
| 	}
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setSizes = function() {
 | ||
| 	
 | ||
| 	var w1 = this.base.offsetWidth-(this.base.clientWidth||this.base.scrollWidth);
 | ||
| 	var h1 = this.base.offsetHeight-this.base.clientHeight;
 | ||
| 	
 | ||
| 	this.base.style.width = Math.max(0, this.base.parentNode.clientWidth-w1)+"px";
 | ||
| 	this.base.style.height = Math.max(0, this.base.parentNode.clientHeight-h1)+"px";
 | ||
| 	
 | ||
| 	var ofs = this.conf.ofs[this.conf.skin];
 | ||
| 	this.p_files.style.top = this.p_controls.offsetHeight+"px";
 | ||
| 	this.p_files.style.left = ofs+"px";
 | ||
| 	if (!this.conf.ofs_f) {
 | ||
| 		this.p_files.style.width = "100px";
 | ||
| 		this.p_files.style.height = "100px";
 | ||
| 		this.conf.ofs_f = {
 | ||
| 			w: this.p_files.offsetWidth-this.p_files.clientWidth,
 | ||
| 			h: this.p_files.offsetHeight-this.p_files.clientHeight
 | ||
| 		};
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.p_files.style.width = Math.max(this.base.clientWidth-ofs*2-this.conf.ofs_f.w,0)+"px";
 | ||
| 	this.p_files.style.height = Math.max(this.base.clientHeight-this.p_controls.offsetHeight-ofs-this.conf.ofs_f.h,0)+"px";
 | ||
| 	
 | ||
| 	if (typeof(this.callEvent) == "function") {
 | ||
| 		// dataload progress
 | ||
| 		this.callEvent("_onSetSizes", []);
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.getFileExtension = function(name) {
 | ||
| 	var ext = "";
 | ||
| 	var k = String(name).match(/\.([^\.\s]*)$/i); // "filename.jpg" -> [".jpg","jpg"]
 | ||
| 	if (k != null) ext = k[1];
 | ||
| 	return ext;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.strings = {
 | ||
| 	// labels
 | ||
| 	done: "Done",
 | ||
| 	error: "Error",
 | ||
| 	size_exceeded: "Filesize exceeded (max #size#)", // #size# - readable size
 | ||
| 	// buttons
 | ||
| 	btnAdd: "Add files",
 | ||
| 	btnUpload: "Upload",
 | ||
| 	btnClean: "Clear all",
 | ||
| 	btnCancel: "Cancel"
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setStrings = function(data) {
 | ||
| 	for (var a in data) this.strings[a] = data[a];
 | ||
| 	// update files in list
 | ||
| 	for (var a in this.file_data) {
 | ||
| 		var state = this.file_data[a].state;
 | ||
| 		if (state == "uploaded" || state == "fail" || state == "size_exceeded") {
 | ||
| 			this.list.updateFileState(a, {
 | ||
| 				state: state,
 | ||
| 				str_error: this.strings.error,
 | ||
| 				str_done: this.strings.done,
 | ||
| 				str_size_exceeded: window.dhx4.template(this.strings.size_exceeded,{size:this.readableSize(this.conf.max_file_size)})
 | ||
| 			});
 | ||
| 		}
 | ||
| 		if (state == "uploaded") {
 | ||
| 			this.list.updateFileNameSize(a, {download: (this.conf.download_url.length>0)});
 | ||
| 		}
 | ||
| 	}
 | ||
| 	// update buttons
 | ||
| 	var t = {browse: "btnAdd", upload: "btnUpload", clear: "btnClean", cancel: "btnCancel"};
 | ||
| 	for (var a in t) this.buttons[a].childNodes[1].innerHTML = this.strings[t[a]];
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setMaxFileSize = function(t) { // added in 2.4
 | ||
| 	this.conf.max_file_size = (parseInt(t)||0);
 | ||
| };
 | ||
| dhtmlXVaultObject.prototype.getMaxFileSize = function() {
 | ||
| 	return this.conf.max_file_size;
 | ||
| };
 | ||
| 
 | ||
| /****************************************************************************************************************************************************************************************************************/
 | ||
| //	HTML 5
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.html5 = function(){};
 | ||
| dhtmlXVaultObject.prototype.html5.prototype = {
 | ||
| 	
 | ||
| 	_initEngine: function() {
 | ||
| 		
 | ||
| 		var that = this;
 | ||
| 		this.buttons["browse"].onclick = function(){
 | ||
| 			if (that.conf.enabled) that.f.click();
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.conf.progress_type = "percentage";
 | ||
| 		this.conf.dnd_enabled = true;
 | ||
| 		
 | ||
| 		// Safari on Windows sometimes have problem with multiple file selections
 | ||
| 		// file length set to zero, do not allow multiple file selecting
 | ||
| 		// d-n-d seems works fine
 | ||
| 		
 | ||
| 		var k = window.navigator.userAgent;
 | ||
| 		var mp = true;
 | ||
| 		if (k.match(/Windows/gi) != null && k.match(/AppleWebKit/gi) != null && k.match(/Safari/gi) != null) {
 | ||
| 			if (k.match(/Version\/5\.1\.5/gi)) this.conf.multiple_files = false;
 | ||
| 			if (k.match(/Version\/5\.1[^\.\d{1,}]/gi)) this.conf.dnd_enabled = false;
 | ||
| 			if (k.match(/Version\/5\.1\.1/gi)) {
 | ||
| 				this.conf.multiple_files = false;
 | ||
| 				this.conf.dnd_enabled = false;
 | ||
| 			}
 | ||
| 			if (k.match(/Version\/5\.1\.2/gi)) this.conf.dnd_enabled = false;
 | ||
| 			if (k.match(/Version\/5\.1\.7/gi)) this.conf.multiple_files = false;
 | ||
| 		}
 | ||
| 		
 | ||
| 		// "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-EN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"	// ok, no dnd
 | ||
| 		// "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-EN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"	// ok, no dnd
 | ||
| 		// "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-EN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"	// ok, no dnd
 | ||
| 		// "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-EN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"	// ok, no dnd
 | ||
| 		// "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-EN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"	// ok, no dnd
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"				// ok, dnd partialy fail, disabled
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22"			// multiple files add - fail, dnd partialy fail, disabled
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.2 Safari/534.52.7"			// ok, dnd partialy fail, disabled
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.54.16 (KHTML, like Gecko) Version/5.1.4 Safari/534.54.16"			// ok
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3"			// multiple files add - fail
 | ||
| 		// "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"			// dnd - ok, multiselect - fail (Windows 8)
 | ||
| 		
 | ||
| 		// input
 | ||
| 		this._addFileInput();
 | ||
| 		
 | ||
| 		// FF, Opera, Chrome, IE10, IE11
 | ||
| 		if (this.conf.dnd_enabled && this._initDND != null) this._initDND();
 | ||
| 		
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addFileInput: function() {
 | ||
| 		
 | ||
| 		// complete input reload, opera needs
 | ||
| 		if (this.f != null) {
 | ||
| 			this.f.onchange = null;
 | ||
| 			this.f.parentNode.removeChild(this.f);
 | ||
| 			this.f = null;
 | ||
| 		}
 | ||
| 		
 | ||
| 		var that = this;
 | ||
| 		
 | ||
| 		this.f = document.createElement("INPUT");
 | ||
| 		this.f.type = "file";
 | ||
| 		
 | ||
| 		if (this.conf.multiple_files) this.f.multiple = "1";
 | ||
| 		this.f.className = "dhx_vault_input";
 | ||
| 		this.p_controls.appendChild(this.f);
 | ||
| 		
 | ||
| 		this.f.onchange = function() {
 | ||
| 			that._parseFilesInInput(this.files);
 | ||
| 			if (window.dhx4.isOpera) that._addFileInput(); else this.value = "";
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_doUploadFile: function(id) {
 | ||
| 		
 | ||
| 		if (this.file_data[id].custom == true) {
 | ||
| 			this._cfUploadStart(id);
 | ||
| 			return;
 | ||
| 		}
 | ||
| 		
 | ||
| 		var that = this;
 | ||
| 		
 | ||
| 		if (!this.loader) {
 | ||
| 			
 | ||
| 			this.loader = new XMLHttpRequest();
 | ||
| 			this.loader.upload.onprogress = function(e) {
 | ||
| 				if (that.file_data[this._idd].state == "uploading") that._updateFileInList(this._idd, "uploading", Math.round(e.loaded*100/e.total));
 | ||
| 			}
 | ||
| 			this.loader.onload = function(e) {
 | ||
| 				var r = window.dhx4.s2j(this.responseText);
 | ||
| 				if (r != null && typeof(r) == "object" && typeof(r.state) != "undefined" && r.state == true) {
 | ||
| 					that._onUploadSuccess(this.upload._idd, r.name, null, r.extra);
 | ||
| 				} else {
 | ||
| 					that._onUploadFail(this.upload._idd, (r!=null&&r.extra!=null?r.extra:null));
 | ||
| 				}
 | ||
| 				r = null;
 | ||
| 			}
 | ||
| 			this.loader.onerror = function(e) {
 | ||
| 				that._onUploadFail(this.upload._idd);
 | ||
| 			}
 | ||
| 			this.loader.onabort = function(e) {
 | ||
| 				that._onUploadAbort(this.upload._idd);
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.loader.upload._idd = id;
 | ||
| 		
 | ||
| 		var form = new FormData();
 | ||
| 		form.append("mode", "html5");
 | ||
| 		
 | ||
| 		if (this.file_data[id].size == 0 && (navigator.userAgent.indexOf("MSIE") > 0 || navigator.userAgent.indexOf("Trident") > 0)) { // IE10, IE11 - zero_size file issue, upload filename only
 | ||
| 			form.append("file_name", String(this.file_data[id].name));
 | ||
| 			form.append("zero_size", "1");
 | ||
| 		} else {
 | ||
| 			form.append(this.conf.param_name, this.file_data[id].file);
 | ||
| 		}
 | ||
| 		
 | ||
| 		if (window.dhx4.ajax.cache != true) form.append("dhxr"+new Date().getTime(), "");
 | ||
| 		
 | ||
| 		this.loader.open("POST", this.conf.url, true);
 | ||
| 		this.loader.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 | ||
| 		this.loader.send(form);
 | ||
| 		
 | ||
| 	},
 | ||
| 	
 | ||
| 	_uploadStop: function() {
 | ||
| 		if (!this.conf.uploading) return;
 | ||
| 		if (this.cf_loader_id != null) {
 | ||
| 			this._cfUploadStop();
 | ||
| 		} else if (this.loader != null) {
 | ||
| 			this.loader.abort();
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_parseFilesInInput: function(f) {
 | ||
| 		for (var q=0; q<f.length; q++) this._addFileToQueue(f[q]);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addFileToQueue: function(f) {
 | ||
| 		if (!this._beforeAddFileToList(f.name, f.size, f.lastModifiedDate)) return; // html5 mode, f.lastModifiedDate works in Chrome/Opera/Safari/FF/IE11
 | ||
| 		var id = (f._idd||window.dhx4.newId());
 | ||
| 		this.file_data[id] = {file: f, name: f.name, size: f.size, state: "added"};
 | ||
| 		this._addFileToList(id, f.name, f.size, "added", 0);
 | ||
| 		if (this.conf.auto_start && !this.conf.uploading) this._uploadStart(true);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_removeFileFromQueue: function(id) {
 | ||
| 		
 | ||
| 		if (!this.file_data[id]) return;
 | ||
| 		
 | ||
| 		var name = this.file_data[id].name;
 | ||
| 		var serverName = (this.conf.uploaded_files!=null&&this.conf.uploaded_files[id]!=null?this.conf.uploaded_files[id].serverName:null);
 | ||
| 		
 | ||
| 		var fileData = {
 | ||
| 			id: Number(id),
 | ||
| 			name: name,
 | ||
| 			size: this.file_data[id].size,
 | ||
| 			serverName: serverName,
 | ||
| 			uploaded: (this.file_data[id].state == "uploaded"),
 | ||
| 			error: (this.file_data[id].state == "fail")
 | ||
| 		};
 | ||
| 		if (this.callEvent("onBeforeFileRemove",[fileData]) !== true) return;
 | ||
| 		
 | ||
| 		var k = false;
 | ||
| 		if (this.cf_loader_id != null || (this.conf.uploading && this.loader != null && id == this.loader.upload._idd && this.file_data[id].state == "uploading")) {
 | ||
| 			this._uploadStop();
 | ||
| 			k = true;
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.file_data[id].file = null;
 | ||
| 		this.file_data[id].name = null;
 | ||
| 		this.file_data[id].size = null;
 | ||
| 		this.file_data[id].state = null;
 | ||
| 		this.file_data[id] = null;
 | ||
| 		delete this.file_data[id];
 | ||
| 		
 | ||
| 		this._removeFileFromList(id);
 | ||
| 		
 | ||
| 		this.callEvent("onFileRemove",[fileData]);
 | ||
| 		
 | ||
| 		if (k) this._uploadStart();
 | ||
| 
 | ||
| 	},
 | ||
| 	
 | ||
| 	_unloadEngine: function() {
 | ||
| 		
 | ||
| 		this.buttons["browse"].onclick = null;
 | ||
| 		
 | ||
| 		if (this.conf.dnd_enabled && this._unloadDND != null) this._unloadDND();
 | ||
| 		
 | ||
| 		this.f.onchange = null;
 | ||
| 		this.f.parentNode.removeChild(this.f);
 | ||
| 		this.f = null;
 | ||
| 		
 | ||
| 		if (this.loader) {
 | ||
| 			this.loader.upload.onprogress = null;
 | ||
| 			this.loader.onload = null;
 | ||
| 			this.loader.onerror = null;
 | ||
| 			this.loader.onabort = null;
 | ||
| 			this.loader.upload._idd = null;
 | ||
| 			this.loader = null;
 | ||
| 		}
 | ||
| 		
 | ||
| 		this._initEngine = null;
 | ||
| 		this._doUploadFile = null;
 | ||
| 		this._uploadStop = null;
 | ||
| 		this._parseFilesInInput = null;
 | ||
| 		this._addFileToQueue = null;
 | ||
| 		this._removeFileFromQueue = null;
 | ||
| 		this._unloadEngine = null;
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| /****************************************************************************************************************************************************************************************************************/
 | ||
| //	HTML 4
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.html4 = function(){};
 | ||
| dhtmlXVaultObject.prototype.html4.prototype = {
 | ||
| 	
 | ||
| 	_initEngine: function() {
 | ||
| 		
 | ||
| 		this._addForm();
 | ||
| 		this.conf.progress_type = "loader";
 | ||
| 		if (window.dhx4.isIE6||window.dhx4.isIE7) this.buttons.browse.style.filter = "";
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addForm: function() {
 | ||
| 		
 | ||
| 		var that = this;
 | ||
| 		
 | ||
| 		if (!this.k) {
 | ||
| 			
 | ||
| 			this.k = document.createElement("DIV");
 | ||
| 			this.k.className = "dhx_vault_file_form_cont";
 | ||
| 			this.buttons["browse"].appendChild(this.k);
 | ||
| 			
 | ||
| 			this.conf.fr_name = "dhx_vault_file_"+window.dhx4.newId();
 | ||
| 			this.k.innerHTML = '<iframe name="'+this.conf.fr_name+'" style="height:0px;width:0px;" frameBorder="0"></iframe>';
 | ||
| 			
 | ||
| 			this.fr = this.k.firstChild;
 | ||
| 			
 | ||
| 			if (window.navigator.userAgent.indexOf("MSIE") >= 0) {
 | ||
| 				this.fr.onreadystatechange = function() {
 | ||
| 					if (this.readyState == "complete") that._onLoad();
 | ||
| 				}
 | ||
| 			} else {
 | ||
| 				this.fr.onload = function() {
 | ||
| 					that._onLoad();
 | ||
| 				}
 | ||
| 			}
 | ||
| 			
 | ||
| 		}
 | ||
| 		
 | ||
| 		var f = document.createElement("DIV");
 | ||
| 		f.innerHTML = "<form method='POST' enctype='multipart/form-data' target='"+this.conf.fr_name+"' class='dhx_vault_file_form' name='dhx_vault_file_form_"+window.dhx4.newId()+"'>"+
 | ||
| 				"<input type='hidden' name='mode' value='html4'>"+
 | ||
| 				"<input type='hidden' name='uid' value=''>"+
 | ||
| 				"<input type='file' name='"+this.conf.param_name+"' class='dhx_vault_file_input'>"+
 | ||
| 				"</form>";
 | ||
| 		this.k.appendChild(f);
 | ||
| 		
 | ||
| 		f.firstChild.lastChild.onchange = function() {
 | ||
| 			
 | ||
| 			var name = this.value.match(/[^\/\\]*$/)[0];
 | ||
| 			
 | ||
| 			this.previousSibling.value = this._idd = window.dhx4.newId();
 | ||
| 			//
 | ||
| 			var lastModifiedDate = null; // html4 mode, works in IE10/IE11/FF/Chrome/Opera/Safari
 | ||
| 			var size = null;
 | ||
| 			if (this.files != null && this.files[0] != null) {
 | ||
| 				lastModifiedDate = this.files[0].lastModifiedDate||null;
 | ||
| 				size = this.files[0].size||null;
 | ||
| 			}
 | ||
| 			//
 | ||
| 			if (!that._beforeAddFileToList(name, size, lastModifiedDate)) return;
 | ||
| 			that._addFileToQueue(this);
 | ||
| 			this.onchange = null;
 | ||
| 			this.parentNode.parentNode.style.display = "none";
 | ||
| 			that._addForm();
 | ||
| 		}
 | ||
| 		
 | ||
| 		f = null;
 | ||
| 	},
 | ||
| 	
 | ||
| 	_onLoad: function() {
 | ||
| 		
 | ||
| 		if (this.conf.uploading && this.fr._idd != null) {
 | ||
| 			var r = window.dhx4.s2j(this.fr.contentWindow.document.body.innerHTML);
 | ||
| 			if (r != null) {
 | ||
| 				if (typeof(r.state) != "undefined") {
 | ||
| 					if (r.state == "cancelled") {
 | ||
| 						this._onUploadAbort(this.fr._idd);
 | ||
| 						this.fr.contentWindow.document.body.innerHTML = "";
 | ||
| 						r = null;
 | ||
| 						return;
 | ||
| 					} else if (r.state == true) {
 | ||
| 						if (typeof(r.size) != "undefined" && !isNaN(r.size)) this.file_data[this.fr._idd].size = r.size;
 | ||
| 						this._onUploadSuccess(this.fr._idd, r.name, null, r.extra);
 | ||
| 						r = null;
 | ||
| 						return;
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			this._onUploadFail(this.fr._idd, (r!=null && r.extra != null ? r.extra:null));
 | ||
| 		}
 | ||
| 		
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addFileToQueue: function(t) {
 | ||
| 		var v = t.value.match(/[^\\\/]*$/);
 | ||
| 		if (v[0] != null) v = v[0]; else v = t.value;
 | ||
| 		//
 | ||
| 		var lastModifiedDate = null;
 | ||
| 		var size = null;
 | ||
| 		if (t.files != null && t.files[0] != null) {
 | ||
| 			lastModifiedDate = t.files[0].lastModifiedDate||null;
 | ||
| 			size = t.files[0].size||null;
 | ||
| 		}
 | ||
| 		//
 | ||
| 		this.file_data[t._idd] = { file: {lastModifiedDate:lastModifiedDate}, name: v, size: size, form: t.parentNode, node: t.parentNode.parentNode, input: t, state: "added"};
 | ||
| 		
 | ||
| 		this._addFileToList(t._idd, v, (size||false), "added", 0);
 | ||
| 		if (this.conf.auto_start && !this.conf.uploading) this._uploadStart(true);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_removeFileFromQueue: function(id) {
 | ||
| 		
 | ||
| 		var name = this.file_data[id].name;
 | ||
| 		var serverName = (this.conf.uploaded_files!=null&&this.conf.uploaded_files[id]!=null?this.conf.uploaded_files[id].serverName:null);
 | ||
| 		
 | ||
| 		var fileData = {
 | ||
| 			id: Number(id),
 | ||
| 			name: name,
 | ||
| 			size: this.file_data[id].size||null,
 | ||
| 			serverName: serverName,
 | ||
| 			uploaded: (this.file_data[id].state == "uploaded"),
 | ||
| 			error: (this.file_data[id].state == "fail")
 | ||
| 		};
 | ||
| 		
 | ||
| 		if (this.callEvent("onBeforeFileRemove",[fileData]) !== true) return;
 | ||
| 		
 | ||
| 		var k = false;
 | ||
| 		if (this.file_data[id].custom == true) {
 | ||
| 			if (this.cf_loader_id != null) {
 | ||
| 				this._uploadStop();
 | ||
| 				k = true;
 | ||
| 			}
 | ||
| 		} else {
 | ||
| 			this.file_data[id].input.onchange = null;
 | ||
| 			this.file_data[id].form.removeChild(this.file_data[id].input);
 | ||
| 			this.file_data[id].node.removeChild(this.file_data[id].form);
 | ||
| 			this.file_data[id].node.parentNode.removeChild(this.file_data[id].node);
 | ||
| 			this.file_data[id].input = null;
 | ||
| 			this.file_data[id].form = null;
 | ||
| 			this.file_data[id].node = null;
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.file_data[id].name = null;
 | ||
| 		this.file_data[id].size = null;
 | ||
| 		this.file_data[id].state = null;
 | ||
| 		this.file_data[id] = null;
 | ||
| 		delete this.file_data[id];
 | ||
| 		
 | ||
| 		this._removeFileFromList(id);
 | ||
| 		
 | ||
| 		this.callEvent("onFileRemove",[fileData]);
 | ||
| 		
 | ||
| 		if (k) this._uploadStart();
 | ||
| 	},
 | ||
| 	
 | ||
| 	_doUploadFile: function(id) {
 | ||
| 		if (this.file_data[id].custom == true) {
 | ||
| 			this._cfUploadStart(id);
 | ||
| 		} else {
 | ||
| 			this.fr._idd = id;
 | ||
| 			this.file_data[id].form.action = this.conf.url;
 | ||
| 			this.file_data[id].form.submit();
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_uploadStop: function() {
 | ||
| 		if (!this.conf.uploading) return;
 | ||
| 		if (this.cf_loader_id == null) {
 | ||
| 			this._onUploadAbort(this.fr._idd);
 | ||
| 			this.fr.contentWindow.location.href = (this.conf.url)+(this.conf.url.indexOf("?")<0?"?":"&")+"mode=html4&action=cancel&dhxr"+new Date().getTime();
 | ||
| 		} else {
 | ||
| 			this._cfUploadStop();
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_unloadEngine: function() {
 | ||
| 		
 | ||
| 		if (this.k) {
 | ||
| 			
 | ||
| 			this.conf.fr_name = null;
 | ||
| 			this.fr.onreadystatechange = null;
 | ||
| 			this.fr.onload = null;
 | ||
| 			this.fr.parentNode.removeChild(this.fr);
 | ||
| 			this.fr = null;
 | ||
| 			
 | ||
| 			// remove empty form
 | ||
| 			this.k.firstChild.firstChild.lastChild.onchange = null;
 | ||
| 			
 | ||
| 			this.k.parentNode.removeChild(this.k);
 | ||
| 			this.k = null;
 | ||
| 			
 | ||
| 		}
 | ||
| 		
 | ||
| 		this._initEngine = null;
 | ||
| 		this._addForm = null;
 | ||
| 		this._onLoad = null;
 | ||
| 		this._addFileToQueue = null;
 | ||
| 		this._removeFileFromQueue = null;
 | ||
| 		this._doUploadFile = null;
 | ||
| 		this._uploadStop = null;
 | ||
| 		this._unloadEngine = null;
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| /****************************************************************************************************************************************************************************************************************/
 | ||
| //	FLASH
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.flash = function(){};
 | ||
| dhtmlXVaultObject.prototype.flash.prototype = {
 | ||
| 	
 | ||
| 	_initEngine: function() {
 | ||
| 		
 | ||
| 		if (!window.dhtmlXVaultSWFObjects) {
 | ||
| 			window.dhtmlXVaultSWFObjects = {
 | ||
| 				items: {},
 | ||
| 				callEvent: function(id, name, params) {
 | ||
| 					return window.dhtmlXVaultSWFObjects.items[id].uploader[name].apply(window.dhtmlXVaultSWFObjects.items[id].uploader,params);
 | ||
| 				}
 | ||
| 			};
 | ||
| 		}
 | ||
| 		
 | ||
| 		var wmode = (window.dhx4.isIE6||window.dhx4.isIE7||navigator.userAgent.indexOf("MSIE 7.0")>=0?"opaque":"transparent");
 | ||
| 		wnome = "transparent";
 | ||
| 		
 | ||
| 		this.conf.swf_obj_id = "dhxVaultSWFObject_"+window.dhx4.newId();
 | ||
| 		this.conf.swf_file = this.conf.swf_file+(this.conf.swf_file.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime();
 | ||
| 		if (window.dhx4.isIE) {
 | ||
| 			// special for IE
 | ||
| 			this.buttons.browse.innerHTML += "<div style='position:absolute;width:100%;height:100%;background-color:white;opacity:0;filter:alpha(opacity=0);left:0px;top:0px;'></div>";
 | ||
| 			// IE6/IE7 gradient fix
 | ||
| 			if (window.dhx4.isIE6 || window.dhx4.isIE7) this.buttons.browse.style.filter = "";
 | ||
| 		}
 | ||
| 		this.buttons.browse.innerHTML += "<div class='dhx_vault_flash_obj'><div id='"+this.conf.swf_obj_id+"'></div></div>";
 | ||
| 		swfobject.embedSWF(this.conf.swf_file, this.conf.swf_obj_id, "100%", "100%", "9", null, {ID:this.conf.swf_obj_id,enableLogs:this.conf.swf_logs,GVar:"dhtmlXVaultSWFObjects",paramName:this.conf.param_name,multiple:(this.conf.multiple_files?"Y":"")}, {wmode:wmode});
 | ||
| 		
 | ||
| 		// IE6/IE7 gradient fix in a window
 | ||
| 		if ((window.dhx4.isIE6 || window.dhx4.isIE7) && this.conf.skin == "dhx_skyblue") {
 | ||
| 			if (this.base.parentNode != null && this.base.parentNode.parentNode != null && this.base.parentNode.parentNode.className != null && this.base.parentNode.parentNode.className == "dhx_cell_wins") {
 | ||
| 				this.base.parentNode.parentNode.style.filter = "none";
 | ||
| 			}
 | ||
| 		}
 | ||
| 		
 | ||
| 		var v = swfobject.getFlashPlayerVersion();
 | ||
| 		
 | ||
| 		this.conf.progress_type = "percentage";
 | ||
| 		
 | ||
| 		window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id] = {id: this.conf.swf_obj_id, uploader: this};
 | ||
| 	},
 | ||
| 	
 | ||
| 	_beforeAddFileToQueue: function(name, size, lastModifiedDate) {
 | ||
| 		return (this.callEvent("onBeforeFileAdd", [{
 | ||
| 			id: null,
 | ||
| 			name: name,
 | ||
| 			size: size,
 | ||
| 			lastModifiedDate: lastModifiedDate,
 | ||
| 			serverName: null,
 | ||
| 			uploaded: false,
 | ||
| 			error: false
 | ||
| 		}])===true?1:0);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addFileToQueue: function(id, name, size, lastModifiedDate) {
 | ||
| 		if (window.dhx4.isIE) {
 | ||
| 			// focus+hide fix for IE
 | ||
| 			var k = document.createElement("INPUT");
 | ||
| 			k.type = "TEXT";
 | ||
| 			k.style.position = "absolute";
 | ||
| 			k.style.left = "0px";
 | ||
| 			k.style.top = window.dhx4.absTop(this.buttons["browse"])+"px";
 | ||
| 			k.style.width = "10px";
 | ||
| 			document.body.appendChild(k);
 | ||
| 			k.focus();
 | ||
| 			document.body.removeChild(k);
 | ||
| 			k = null;
 | ||
| 		}
 | ||
| 		this.file_data[id] = {file: {lastModifiedDate:lastModifiedDate}, name: name, size: size, state: "added"};
 | ||
| 		this._addFileToList(id, name, size, "added", 0);
 | ||
| 		if (this.conf.auto_start && !this.conf.uploading) this._uploadStart(true);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_removeFileFromQueue: function(id) {
 | ||
| 		
 | ||
| 		if (!this.file_data[id]) return;
 | ||
| 		
 | ||
| 		var name = this.file_data[id].name;
 | ||
| 		var serverName = (this.conf.uploaded_files!=null&&this.conf.uploaded_files[id]!=null?this.conf.uploaded_files[id].serverName:null);
 | ||
| 		
 | ||
| 		var fileData = {
 | ||
| 			id: Number(id),
 | ||
| 			name: name,
 | ||
| 			size: this.file_data[id].size,
 | ||
| 			serverName: serverName,
 | ||
| 			uploaded: (this.file_data[id].state == "uploaded"),
 | ||
| 			error: (this.file_data[id].state == "fail")
 | ||
| 		};
 | ||
| 		if (this.callEvent("onBeforeFileRemove",[fileData]) !== true) return;
 | ||
| 		
 | ||
| 		var k = false;
 | ||
| 		if (this.conf.uploading && this.file_data[id].state == "uploading") {
 | ||
| 			this._uploadStop();
 | ||
| 			k = true;
 | ||
| 		}
 | ||
| 		
 | ||
| 		swfobject.getObjectById(this.conf.swf_obj_id).removeFileById(id);
 | ||
| 		
 | ||
| 		this.file_data[id].name = null;
 | ||
| 		this.file_data[id].size = null;
 | ||
| 		this.file_data[id].state = null;
 | ||
| 		this.file_data[id] = null;
 | ||
| 		delete this.file_data[id];
 | ||
| 		
 | ||
| 		this._removeFileFromList(id);
 | ||
| 		
 | ||
| 		this.callEvent("onFileRemove",[fileData]);
 | ||
| 		
 | ||
| 		if (k) this._uploadStart();
 | ||
| 		
 | ||
| 	},
 | ||
| 	
 | ||
| 	_doUploadFile: function(id) {
 | ||
| 		if (this.file_data[id].custom == true) {
 | ||
| 			this._cfUploadStart(id);
 | ||
| 		} else {
 | ||
| 			swfobject.getObjectById(this.conf.swf_obj_id).upload(id, this.conf.swf_url);
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_uploadStop: function(id) {
 | ||
| 		if (this.cf_loader_id != null) {
 | ||
| 			this._cfUploadStop();
 | ||
| 		} else {
 | ||
| 			for (var a in this.file_data) if (this.file_data[a].state == "uploading") swfobject.getObjectById(this.conf.swf_obj_id).uploadStop(a);
 | ||
| 		}
 | ||
| 	},
 | ||
| 	
 | ||
| 	_getId: function() {
 | ||
| 		return window.dhx4.newId();
 | ||
| 	},
 | ||
| 	
 | ||
| 	_unloadEngine: function() {
 | ||
| 		
 | ||
| 		// remove instance from global storage
 | ||
| 		
 | ||
| 		if (window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id]) {
 | ||
| 			window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id].id = null;
 | ||
| 			window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id].uploader = null;
 | ||
| 			window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id] = null
 | ||
| 			delete window.dhtmlXVaultSWFObjects.items[this.conf.swf_obj_id];
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.conf.swf_obj_id = null;
 | ||
| 		
 | ||
| 		this._initEngine = null;
 | ||
| 		this._addFileToQueue = null;
 | ||
| 		this._removeFileFromQueue = null;
 | ||
| 		this._doUploadFile = null;
 | ||
| 		this._uploadStop = null;
 | ||
| 		this._unloadEngine = null;
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setSWFURL = function(swf_url) {
 | ||
| 	this.conf.swf_url = swf_url;
 | ||
| };
 | ||
| 
 | ||
| /****************************************************************************************************************************************************************************************************************/
 | ||
| //	SILVERLIGHT
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.sl = function(){};
 | ||
| dhtmlXVaultObject.prototype.sl.prototype = {
 | ||
| 	
 | ||
| 	_initEngine: function() {
 | ||
| 		
 | ||
| 		if (typeof(this.conf.sl_v) == "undefined") this.conf.sl_v = this.getSLVersion();
 | ||
| 		
 | ||
| 		if (!window.dhtmlXVaultSLObjects) {
 | ||
| 			window.dhtmlXVaultSLObjects = {
 | ||
| 				items: {},
 | ||
| 				callEvent: function(id, name, params) {
 | ||
| 					window.dhtmlXVaultSLObjects.items[id].uploader[name].apply(window.dhtmlXVaultSLObjects.items[id].uploader,params);
 | ||
| 				}
 | ||
| 			};
 | ||
| 		}
 | ||
| 		
 | ||
| 		//var that = this;
 | ||
| 		
 | ||
| 		this.conf.sl_obj_id = "dhtmlXFileUploaderSLObject_"+window.dhx4.newId();
 | ||
| 		
 | ||
| 		if (this.conf.sl_v != false) {
 | ||
| 			this.buttons["browse"].innerHTML += '<div style="width:100%;height:100%;left:0px;top:0px;position:absolute;">'+
 | ||
| 									'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%" id="'+this.conf.sl_obj_id+'">'+
 | ||
| 										'<param name="source" value="'+this.conf.sl_xap+'"/>'+
 | ||
| 										'<param name="background" value="Transparent"/>'+
 | ||
| 										'<param name="windowless" value="true"/>'+
 | ||
| 										'<param name="initParams" value="SLID='+this.conf.sl_obj_id+',LOGS='+this.conf.sl_logs+',GVAR=dhtmlXVaultSLObjects"/>'+
 | ||
| 										'<param name="minRuntimeVersion" value="5.0"/>'+
 | ||
| 									'</object>'+
 | ||
| 								'</div>';
 | ||
| 		} else {
 | ||
| 			this.buttons["browse"].style.cursor = "wait";
 | ||
| 			this.buttons["browse"].title = "";
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.conf.progress_type = "percentage";
 | ||
| 		
 | ||
| 		window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id] = {id: this.conf.sl_obj_id, uploader: this};
 | ||
| 	},
 | ||
| 	
 | ||
| 	_addFileToQueue: function(id, name, size) {
 | ||
| 		this.file_data[id] = {name: name, size: size, state: "added", file: {lastModifiedDate: null}};
 | ||
| 		this._addFileToList(id, name, size, "added", 0);
 | ||
| 		if (this.conf.auto_start && !this.conf.uploading) this._uploadStart(true);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_removeFileFromQueue: function(id) {
 | ||
| 		if (!this.file_data[id]) return;
 | ||
| 		
 | ||
| 		var k = false;
 | ||
| 		if (this.conf.uploading && this.file_data[id].state == "uploading") {
 | ||
| 			this._uploadStop();
 | ||
| 			k = true;
 | ||
| 		}
 | ||
| 		
 | ||
| 		document.getElementById([this.conf.sl_obj_id]).Content.a.removeFileById(id);
 | ||
| 		
 | ||
| 		this.file_data[id].name = null;
 | ||
| 		this.file_data[id].size = null;
 | ||
| 		this.file_data[id].state = null;
 | ||
| 		this.file_data[id].file = null;
 | ||
| 		this.file_data[id] = null;
 | ||
| 		delete this.file_data[id];
 | ||
| 		
 | ||
| 		this._removeFileFromList(id);
 | ||
| 		
 | ||
| 		if (k) this._uploadStart();
 | ||
| 		
 | ||
| 	},
 | ||
| 	
 | ||
| 	_doUploadFile: function(id) {
 | ||
| 		// sl have inner url parser and params will cut,
 | ||
| 		// sho should be passed via 3rd param
 | ||
| 		var p = this.conf.sl_url.split("?");
 | ||
| 		p = (p[1]!=null?"&"+p[1]:"");
 | ||
| 		//
 | ||
| 		document.getElementById(this.conf.sl_obj_id).Content.a.upload(id, this.conf.sl_url, p+"&mode=sl&dhxr"+new Date().getTime()); // leading "&" required!
 | ||
| 	},
 | ||
| 	
 | ||
| 	_uploadStop: function(id) {
 | ||
| 		this.conf.uploading = false;
 | ||
| 		for (var a in this.file_data) if (this.file_data[a].state == "uploading") document.getElementById(this.conf.sl_obj_id).Content.a.uploadStop(a);
 | ||
| 	},
 | ||
| 	
 | ||
| 	_unloadEngine: function() {
 | ||
| 		
 | ||
| 		// remove instance from global storage
 | ||
| 		
 | ||
| 		if (window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id]) {
 | ||
| 			window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id].id = null;
 | ||
| 			window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id].uploader = null;
 | ||
| 			window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id] = null
 | ||
| 			delete window.dhtmlXVaultSLObjects.items[this.conf.sl_obj_id];
 | ||
| 		}
 | ||
| 		
 | ||
| 		this.conf.sl_obj_id = null;
 | ||
| 		
 | ||
| 		this._initEngine = null;
 | ||
| 		this._addFileToQueue = null;
 | ||
| 		this._removeFileFromQueue = null;
 | ||
| 		this._doUploadFile = null;
 | ||
| 		this._uploadStop = null;
 | ||
| 		this._unloadEngine = null;
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.setSLURL = function(url) {
 | ||
| 	this.conf.sl_url = url;
 | ||
| };
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.getSLVersion = function() {
 | ||
| 	var v = false;
 | ||
| 	if (window.dhx4.isIE) {
 | ||
| 		try {
 | ||
| 			var t = new ActiveXObject('AgControl.AgControl');
 | ||
| 			if (t != null) {
 | ||
| 				// loop through [4-x, 0-9] until supported
 | ||
| 				var k1 = 4, k2 = 0;
 | ||
| 				while (t.isVersionSupported([k1,k2].join("."))) {
 | ||
| 					v = [k1,k2];
 | ||
| 					if (++k2 > 9) { k1++; k2=0; }
 | ||
| 				}
 | ||
| 			}
 | ||
| 			t = null;
 | ||
| 		} catch(e) {};
 | ||
| 	} else {
 | ||
| 		if (navigator.plugins["Silverlight Plug-In"] != null) {
 | ||
| 			v = navigator.plugins["Silverlight Plug-In"].description.split(".");
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return v;
 | ||
| };
 | ||
| 
 | ||
| /****************************************************************************************************************************************************************************************************************/
 | ||
| // DEFAULT FILES VIEW
 | ||
| 
 | ||
| dhtmlXVaultObject.prototype.list_default = function() {
 | ||
| 	
 | ||
| 	this.t = {}; // items
 | ||
| 	this.n = {}; // names
 | ||
| 	
 | ||
| 	this.addFileItem = function(id, fileList) {
 | ||
| 		
 | ||
| 		var item = document.createElement("DIV");
 | ||
| 		item._idd = id;
 | ||
| 		fileList.appendChild(item);
 | ||
| 		
 | ||
| 		this.t[id] = item;
 | ||
| 		
 | ||
| 		item = fileList = null;
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.isFileItemExist = function(id) {
 | ||
| 		return (this.t[id] != null);
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.renderFileRecord = function(id, data) {
 | ||
| 		
 | ||
| 		var item = this.t[id];
 | ||
| 		if (!item == null) return;
 | ||
| 		
 | ||
| 		item.className = "dhx_vault_file dhx_vault_file_"+data.state;
 | ||
| 		item.innerHTML = "<div class='dhx_vault_file_param dhx_vault_file_name'> </div>"+
 | ||
| 				"<div class='dhx_vault_file_param dhx_vault_file_progress'> </div>"+
 | ||
| 				"<div class='dhx_vault_file_param dhx_vault_file_delete'> </div>"+
 | ||
| 				"<div class='dhx_vault_file_icon dhx_vault_"+data.icon+"'><div class='dhx_vault_all_icons'></div></div>";
 | ||
| 		
 | ||
| 		item.childNodes[2]._action = {id: id, data: "delete_file"};
 | ||
| 		
 | ||
| 		this.updateFileNameSize(id, data);
 | ||
| 		
 | ||
| 		item = null;
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.removeFileRecord = function(id) {
 | ||
| 		
 | ||
| 		var item = this.t[id];
 | ||
| 		if (item == null) return;
 | ||
| 		
 | ||
| 		item._idd = null;
 | ||
| 		item.childNodes[2]._action = null;
 | ||
| 		item.parentNode.removeChild(item);
 | ||
| 		item = null;
 | ||
| 		
 | ||
| 		this.n[id] = this.t[id] = null;
 | ||
| 		delete this.t[id];
 | ||
| 		delete this.n[id];
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.updateFileNameSize = function(id, data) {
 | ||
| 		
 | ||
| 		var item = this.t[id];
 | ||
| 		if (item == null) return;
 | ||
| 		
 | ||
| 		// name/size cache for quick update
 | ||
| 		if (this.n[id] == null) this.n[id] = {};
 | ||
| 		for (var a in {name: true, size: true, readableSize: true}) {
 | ||
| 			if (data[a] != null) this.n[id][a] = data[a]; else data[a] = this.n[id][a];
 | ||
| 		}
 | ||
| 		
 | ||
| 		var fileName = data.name+(!isNaN(data.size) && data.size !== false ? " ("+data.readableSize+")":" ");
 | ||
| 		if (data.download == true) fileName = "<a href='javascript:void(0);'>"+fileName+"</a>";
 | ||
| 		
 | ||
| 		item.childNodes[0].innerHTML = "<div class='dhx_vault_file_name_text'>"+fileName+"</div>";
 | ||
| 		item.childNodes[0].title = data.name+(!isNaN(data.size) && data.size !== false ? " ("+data.readableSize+")" : "");
 | ||
| 		
 | ||
| 		if (data.download == true) item.childNodes[0].childNodes[0].childNodes[0]._action = {id: id, data: "download_file"};
 | ||
| 		
 | ||
| 		item = null;
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.updateFileState = function(id, data) {
 | ||
| 		
 | ||
| 		var item = this.t[id];
 | ||
| 		if (item == null) return;
 | ||
| 		
 | ||
| 		var k = false;
 | ||
| 		if (this.updateFileStateExtra != null) k = this.updateFileStateExtra(id, data);
 | ||
| 		
 | ||
| 		if (!k) {
 | ||
| 			if (data.state == "added") {
 | ||
| 				item.className = "dhx_vault_file dhx_vault_file_added";
 | ||
| 				item.childNodes[1].className = "dhx_vault_file_param dhx_vault_file_progress";
 | ||
| 				item.childNodes[1].innerHTML = " ";
 | ||
| 			}
 | ||
| 			
 | ||
| 			if (data.state == "fail") {
 | ||
| 				item.className = "dhx_vault_file dhx_vault_file_fail";
 | ||
| 				item.childNodes[1].className = "dhx_vault_file_param dhx_vault_file_progress";
 | ||
| 				item.childNodes[1].innerHTML = data.str_error;
 | ||
| 			}
 | ||
| 			
 | ||
| 			if (data.state == "size_exceeded") {
 | ||
| 				item.className = "dhx_vault_file dhx_vault_file_size_exceeded";
 | ||
| 				item.childNodes[1].className = "dhx_vault_file_param dhx_vault_file_progress";
 | ||
| 				item.childNodes[1].innerHTML = data.str_size_exceeded;
 | ||
| 			}
 | ||
| 			
 | ||
| 			if (data.state == "uploaded") {
 | ||
| 				item.className = "dhx_vault_file dhx_vault_file_uploaded";
 | ||
| 				item.childNodes[1].className = "dhx_vault_file_param dhx_vault_file_progress";
 | ||
| 				item.childNodes[1].innerHTML = data.str_done;
 | ||
| 			}
 | ||
| 			
 | ||
| 			if (data.state == "uploading_html4" || data.state == "uploading") {
 | ||
| 				// gif
 | ||
| 				item.className = "dhx_vault_file dhx_vault_file_uploading";
 | ||
| 				item.childNodes[1].className = "dhx_vault_file_param dhx_vault_file_uploading";
 | ||
| 				item.childNodes[1].innerHTML = "<div class='dhx_vault_progress'><div class='dhx_vault_progress_loader'> </div></div>";
 | ||
| 			}
 | ||
| 			
 | ||
| 		}
 | ||
| 		
 | ||
| 		item = null;
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.updateStrings = function() {
 | ||
| 		
 | ||
| 	}
 | ||
| 	
 | ||
| 	this.unload = function() {
 | ||
| 		this.t = null;
 | ||
| 	}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| // attach to container
 | ||
| if (typeof(window.dhtmlXCellObject) != "undefined" && typeof(dhtmlXCellObject.prototype.attachVault) == "undefined") {
 | ||
| 
 | ||
| 	dhtmlXCellObject.prototype.attachVault = function(conf) {
 | ||
| 		
 | ||
| 		var obj = document.createElement("DIV");
 | ||
| 		obj.style.position = "relative";
 | ||
| 		obj.style.width = "100%";
 | ||
| 		obj.style.height = "100%";
 | ||
| 		obj.style.overflow = "hidden";
 | ||
| 		this._attachObject(obj);
 | ||
| 		
 | ||
| 		obj._attach_mode = true;
 | ||
| 		obj._no_border = true;
 | ||
| 		
 | ||
| 		// keep borders for windows
 | ||
| 		if (typeof(window.dhtmlXWindowsCell) != "undefined" && this instanceof dhtmlXWindowsCell) {
 | ||
| 			obj._no_border = false;
 | ||
| 		}
 | ||
| 		
 | ||
| 		if (typeof(conf) != "object" || conf == null) conf = {};
 | ||
| 		conf.parent = obj;
 | ||
| 		if (typeof(conf.skin) == "undefined") conf.skin = this.conf.skin;
 | ||
| 		
 | ||
| 		this.dataType = "vault";
 | ||
| 		this.dataObj = new dhtmlXVaultObject(conf);
 | ||
| 		
 | ||
| 		// sometimes layout broke vault's dimension
 | ||
| 		if (typeof(window.dhtmlXLayoutCell) != "undefined" && this instanceof dhtmlXLayoutCell) {
 | ||
| 			this.layout._getMainInst().attachEvent("onExpand", function(ids){
 | ||
| 				for (var q=0; q<ids.length; q++) {
 | ||
| 					var cell = this.cells(ids[q]);
 | ||
| 					if (cell.dataType == "vault" && cell.dataObj != null) cell.dataObj.setSizes();
 | ||
| 					cell = null;
 | ||
| 				}
 | ||
| 			});
 | ||
| 		}
 | ||
| 		
 | ||
| 		conf.parent = null;
 | ||
| 		conf = obj = null;
 | ||
| 		
 | ||
| 		return this.dataObj;
 | ||
| 	};
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| // bootstrap skin buttons
 | ||
| dhtmlXVaultObject.prototype.buttonCss = {
 | ||
| 	bootstrap: {
 | ||
| 		browse: "_browse",
 | ||
| 		upload: "_upload",
 | ||
| 		cancel: "_cancel",
 | ||
| 		clear: "_clear"
 | ||
| 	}
 | ||
| };
 | ||
| 
 | ||
| // attach to popup
 | ||
| if (typeof(window.dhtmlXPopup) != "undefined" && typeof(dhtmlXPopup.prototype.attachVault) == "undefined") {
 | ||
| 	dhtmlXPopup.prototype.attachVault = function(width, height, conf) {
 | ||
| 		return this._attachNode("vault", {width: width||350, height: height||200, conf:conf||{}});
 | ||
| 	};
 | ||
| 	dhtmlXPopup.prototype._attach_init_vault = function(data) {
 | ||
| 		data.conf.parent = this._nodeId;
 | ||
| 		document.getElementById(this._nodeId)._no_border = true;
 | ||
| 		if (typeof(data.conf.skin) == "undefined") data.conf.skin = this.conf.skin;
 | ||
| 		this._nodeObj = new dhtmlXVaultObject(data.conf);
 | ||
| 	};
 | ||
| };
 | ||
| 
 |