/*
 * ! Zefext base javascript
 * 
 * uses: - ExtJS {@link http://extjs.com/ } - BASE64
 * {@link http://www.webtoolkit.info/} - MD5 (Message-Digest Algorithm)
 * {@link http://www.webtoolkit.info/} - SHA1 (Secure Hash Algorithm)
 * {@link http://www.webtoolkit.info/}
 * 
 * @author Zefext Development Team @copyright Copyright (c) 2006 Zefext
 * developer team
 * 
 * @version $Id:$
 */

/**
 * @class Zefext
 * 
 * This is the base zefext class.
 * 
 * @author Zefext Development Team
 * @copyright Copyright (c) 2006 Zefext Development Team
 */
var Zefext = {
	/**
	 * Array for loading-mask names.
	 * 
	 * @private
	 * @property
	 * @type {array}
	 */
	masks : new Array(),
	/**
	 * Array form numbered windows opened by Zefext.createNewWindow().
	 * 
	 * @private
	 * @property
	 * @type {array}
	 */
	nWins : new Array(),
	/**
	 * Array for content panels in numbered windows.
	 * 
	 * @private
	 * @property
	 * @type {array}
	 */
	nPans : new Array(),
	/**
	 * Counter for numbered windows.
	 * 
	 * @private
	 * @property
	 * @type {integer}
	 */
	_nw : 0,
	editMenu : 0,
	pF : new Array(),
	dinamicGridButtonId : new Object(),
	doYes : null,
	doNo : null,
	/**
	 * Serialize disabled elements on form?
	 * 
	 * @property
	 * @type {boolean}
	 */
	serializeDisabled : true,
	responseStack : '',
	responseStackXML : '',
	responseStackJSON : '',
	gkec : false,
	bodyMask : false,
	userId : 0,
	tooltipHelpStatus : false,

	/**
	 * Add x-btn-over class to element.
	 * 
	 * @method
	 * @param {string}
	 *            button_id id of button element
	 */
	btnOver : function(button_id) {
		O = document.getElementById(button_id);
		if (O) {
			this.addClass(O, 'x-btn-over');
		}
	},

	/**
	 * Remove x-btn-over class from element.
	 * 
	 * @method
	 * @param {string}
	 *            button_id id of button element
	 */
	btnOut : function(button_id) {
		O = document.getElementById(button_id);
		if (O) {
			this.removeClass(O, 'x-btn-over');
		}
	},

	/**
	 * Add x-gridbtn-over class to element.
	 * 
	 * @method
	 * @param {string}
	 *            button_id if of button element
	 */
	gridbtnOver : function(button_id) {
		O = document.getElementById(button_id);
		if (O) {
			this.addClass(O, 'x-gridbtn-over');
		}
	},

	/**
	 * Remove x-gridbtn-over class from element.
	 * 
	 * @method
	 * @param {string}
	 *            button_id if of button element
	 */
	gridbtnOut : function(button_id) {
		O = document.getElementById(button_id);
		if (O) {
			this.removeClass(O, 'x-gridbtn-over');
		}
	},

	/**
	 * Add x-form-focus class to element.
	 * 
	 * @method
	 * @param object
	 *            O object of element
	 */
	focus : function(O) {
		this.addClass(O, 'x-form-focus');
	},

	/**
	 * Remove x-form-focus class from element
	 * 
	 * @param object
	 *            O object element
	 */
	blur : function(O) {
		this.removeClass(O, 'x-form-focus');
	},

	/**
	 * Add x-item-disabled class to element.
	 * 
	 * @param object
	 *            O object element
	 */
	disable : function(O) {
		this.addClass(O, 'x-item-disabled');
	},

	/**
	 * Remove x-item-disabled class from element.
	 * 
	 * @method
	 * @param object
	 *            O object element
	 */
	enable : function(O) {
		this.removeClass(O, 'x-item-disabled');
	},

	/**
	 * Add css class to element.
	 * 
	 * @method
	 * @param object
	 *            O object element
	 * @param {string}
	 *            className name of class
	 */
	addClass : function(O, className) {
		if (className instanceof Array) {
			for (var i = 0, len = className.length; i < len; i++) {
				this.addClass(O, className[i]);
			}
		} else {
			if (className && !this.hasClass(O, className)) {
				O.className = O.className + " " + className;
			}
		}
	},

	/**
	 * Remove css class from element.
	 * 
	 * @method
	 * @param object
	 *            O object element
	 * @param {string}
	 *            className name of class
	 */
	removeClass : function(O, className) {
		if (!className || !O.className) {
			return;
		}
		if (className instanceof Array) {
			for (var i = 0, len = className.length; i < len; i++) {
				this.removeClass(O, className[i]);
			}
		} else {
			if (this.hasClass(O, className)) {
				if (O.clsrc) {
					var re = O.clsrc[className];
				} else {
					this.pr(O);
				}
				if (!re) {
					re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)',
							"g");
					O.clsrc[className] = re;
				}
				O.className = O.className.replace(re, " ");
			}
		}
	},

	/**
	 * Has element css class?
	 * 
	 * @method
	 * @param object
	 *            O object element
	 * @param {string}
	 *            className name of class
	 */
	hasClass : function(O, className) {
		return className
				&& (' ' + O.className + ' ').indexOf(' ' + className + ' ') != -1;
	},

	/**
	 * Clear clsrc parameter
	 * 
	 * @private
	 * @method
	 * @param object
	 *            O
	 */
	pr : function(O) {
		O.clsrc = {};
	},

	/**
	 * Set "changed" image to innerHTML property of div element.
	 * 
	 * <br>
	 * The image is asterisk_orange.png form incon's folder.
	 * 
	 * @method
	 * @param {string}
	 *            D div element
	 */
	inputChanged : function(D) {
		var ix = document.getElementById(D);
		if (ix) {
			ix.innerHTML = '<img src="' + ZefextCfg.imageDirHTTP
					+ 'icons/silk/asterisk_orange.png" align="top" title="'
					+ lang.data_modified + '"/>';
		}
	},

	/**
	 * Set "clicked" image to innerHTML property of div element.
	 * 
	 * <br>
	 * The image is bullet_star.png form incon's folder.
	 * 
	 * @method
	 * @param {string}
	 *            D div element
	 */
	rowClicked : function(D) {
		var ix = document.getElementById(D);
		if (ix) {
			ix.innerHTML = '<img src="' + ZefextCfg.imageDirHTTP
					+ 'icons/silk/bullet_star.png" align="top" title="'
					+ lang.row_clicked + '"/>';
		}
	},

	/**
	 * Serialize form.
	 * 
	 * @method
	 * @param mixed
	 *            F form object, ID or name
	 * @return {string} serialized form
	 */
	serializeForm : function(F) {
		if (typeof F == "string") {
			F = (document.getElementById(F) || document.forms[F]);
		}
		if (F.action) {
			F.action = this.ccp(F.action);
		}
		var G, E, H, J, K = "", M = false;
		for (var L = 0; L < F.elements.length; L++) {
			G = F.elements[L];
			J = F.elements[L].disabled;
			E = F.elements[L].name;
			H = F.elements[L].value;
			if ((!J || this.serializeDisabled) && E) {
				switch (G.type) {
					case "select-one" :
					case "select-multiple" :
						for (var I = 0; I < G.options.length; I++) {
							if (G.options[I].selected) {
								if (Ext.isIE) {
									K += encodeURIComponent(E)
											+ "="
											+ encodeURIComponent(G.options[I].attributes["value"].specified
													? G.options[I].value
													: G.options[I].text) + "&";
								} else {
									K += encodeURIComponent(E)
											+ "="
											+ encodeURIComponent(G.options[I]
													.hasAttribute("value")
													? G.options[I].value
													: G.options[I].text) + "&";
								}
							}
						}
						break;
					case "radio" :
					case "checkbox" :
						if (G.checked) {
							K += encodeURIComponent(E) + "="
									+ encodeURIComponent(H) + "&";
						}
						break;
					case "file" :
					case undefined :
					case "reset" :
					case "button" :
						break;
					case "submit" :
						if (M == false) {
							K += encodeURIComponent(E) + "="
									+ encodeURIComponent(H) + "&";
							M = true;
						}
						break;
					default :
						K += encodeURIComponent(E) + "="
								+ encodeURIComponent(H) + "&";
						break;
				}
			}
		}
		K = K.substr(0, K.length - 1);
		return K;
	},

	/**
	 * Serialize form data to object.
	 * 
	 * @method
	 * @param mixed
	 *            F form object, ID or name
	 * @return object serialized form
	 */
	serializeFormToObject : function(F) {
		if (typeof F == "string") {
			F = (document.getElementById(F) || document.forms[F]);
		}
		var G, E, H, J, K = "", M = false;
		var oBj = new Object();
		for (var L = 0; L < F.elements.length; L++) {
			G = F.elements[L];
			J = F.elements[L].disabled;
			E = F.elements[L].name;
			H = F.elements[L].value;
			if (!J && E) {
				switch (G.type) {
					case "select-one" :
					case "select-multiple" :
						for (var I = 0; I < G.options.length; I++) {
							if (G.options[I].selected) {
								if (Ext.isIE) {
									var xxx = encodeURIComponent(G.options[I].attributes["value"].specified
											? G.options[I].value
											: G.options[I].text);
									eval("oBj." + encodeURIComponent(E)
											+ "=xxx;");

								} else {
									var xxx = encodeURIComponent(G.options[I]
											.hasAttribute("value")
											? G.options[I].value
											: G.options[I].text);
									eval("oBj." + encodeURIComponent(E)
											+ "=xxx;");
								}
							}
						}
						break;
					case "radio" :
					case "checkbox" :
						if (G.checked) {
							var xxx = encodeURIComponent(H);
							eval("oBj." + encodeURIComponent(E) + "=xxx;");
						}
						break;
					case "file" :
					case undefined :
					case "reset" :
					case "button" :
						break;
					case "submit" :
						if (M == false) {
							var xxx = encodeURIComponent(H);
							eval("oBj." + encodeURIComponent(E) + "=xxx;");
							M = true;
						}
						break;
					default :
						var xxx = encodeURIComponent(H);
						eval("oBj." + encodeURIComponent(E) + "=xxx;");
						break;
				}
			}
		}
		return oBj;
	},

	/**
	 * Submit form.
	 * 
	 * @method
	 * @param {string}
	 *            formName
	 */
	submit : function(formName) {
		var HA = ZefextCfg.handleAjax;
		var rL;
		var formNameO = formName;
		if (formName.substr(0, 1) == '%' || formName.substr(0, 1) == '$') {
			ZefextCfg.handleAjax = false;
			formName = formName.substr(1, formName.length - 1);
		}
		if (formName.substr(0, 1) == '~') {
			rL = true;
			formName = formName.substr(1, formName.length - 1);
		}
		if (formName.substr(0, 1) == '@') {
			formName = formName.substr(1, formName.length - 1);
		}
		if (ZefextCfg.handleAjax == false) {
			this.cpw(formNameO);
			str = this.serializeForm(formName) + ZefextCfg.AjReSt + '&reqform='
					+ formName;
			var F = document.getElementById(formName);
			F.action = this.ccp(F.action);
			F.submit();
			ZefextCfg.handleAjax = HA;
			return true;
		} else {
			this.cpw(formNameO);
			str = this.serializeForm(formName) + ZefextCfg.AjReSt + '&reqform='
					+ formName;
			if (rL) {
				str = str + '&__reload=1';
			}
			var met = 'POST';
			if (typeof formName == "string") {
				F = (document.getElementById(formName) || document.forms[formName]);
			}
			F.action = this.ccp(F.action);
			if (F.method && F.method.toUpperCase() == 'GET') {
				met = 'GET';
			}
			this.ajaxRequest(met, F.action, str);
		}
		return false;
	},

	/**
	 * Send AJAX GET request.
	 * 
	 * @method
	 * @param {string}
	 *            url url
	 */
	makeRequest : function(url) {
		this.ajaxRequest('GET', url, '');
	},

	/**
	 * Send AJAX request.
	 * 
	 * @method
	 * @param {string}
	 *            met method (GET, POST)
	 * @param {string}
	 *            url url
	 * @param {string}
	 *            str data
	 */
	ajaxRequest : function(met, url, str) {
		var sc = '';
		if (met.toLowerCase() == 'get') {
			met = 'GET';
			tomb = url.split('?');
			if (tomb.length > 1) {
				var vc = '&';
			} else {
				var vc = '?';
			}
			sc = vc + str;
			str = null;
			this.makeExtGetRequest(url + sc);
		} else {
			met = 'POST';
			this.makeExtPostRequest(url, str);
		}
	},

	/**
	 * Send Ext.ajax.request with GET method.
	 * 
	 * @method
	 * @param {string}
	 *            url url
	 */
	makeExtGetRequest : function(url) {
		Ext.Ajax.defaultHeaders = {
			'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
		};
		this.startLoader();
		Ext.Ajax.request({
					method : 'GET',
					url : url,
					success : this.handleSuccess,
					failure : this.handleFailure
				});
	},

	/**
	 * Send Ext.ajax.request with POST method.
	 * 
	 * @method
	 * @param {string}
	 *            url url
	 * @param {string}
	 *            data data
	 */
	makeExtPostRequest : function(url, data) {
		Ext.Ajax.defaultHeaders = {
			'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
		};
		Zefext.startLoader();
		Ext.Ajax.request({
					method : 'POST',
					url : url,
					success : this.handleSuccess,
					failure : this.handleFailure,
					params : data
				});
	},

	/**
	 * Show loading message.
	 * 
	 * @method
	 */
	startLoader : function() {
		if (document.getElementById('mid_wait')) {
			var sw = document.getElementById('mid_wait').innerHTML;
		} else {
			sw = '...';
		}
		if (document.getElementById('ajax_loader')) {
			document.getElementById('ajax_loader').innerHTML = sw;
		}
		return;
	},

	/**
	 * Hide loadin message.
	 * 
	 * @method
	 */
	stopLoader : function() {
		if (document.getElementById('ajax_loader')) {
			document.getElementById('ajax_loader').innerHTML = '';
		}
	},

	/**
	 * Sucess AJAX event handler.
	 * 
	 * @method
	 * @param object
	 *            O response
	 */
	handleSuccess : function(o) {
		if (o.responseText !== undefined) {
			var coodeb = document.getElementById("cookie_debug");
			if (coodeb) {
				coodeb.innerHTML = '';
			}
			var debdiv = document.getElementById("ajax_comm_debug");
			if (debdiv) {
				debdiv.innerHTML = "<li>" + lang.transaction_id + " " + o.tId
						+ "</li>";
				debdiv.innerHTML += "<li>" + lang.http_status + " " + o.status
						+ "</li>";
				debdiv.innerHTML += "<li>" + lang.status_code_message + " "
						+ o.statusText + "</li>";
				if (ZefextCfg.infoAccess) {
					debdiv.innerHTML += "<li>" + lang.http_headers + " </li>"
							+ o.getAllResponseHeaders + '<hr />'
							+ zxp_c2s(o.responseText);
				}
			}
			if (o.status == 200) {
				if (this.gkec) {
					this.gkec = false;
					if (debdiv) {
						debdiv.innerHTML += mxp_c2s(o.responseText);
					}
					eval(o.responseText);
				} else {
					var xml = o.responseXML;
					if (xml) {
						ZefextUxml.parseContent(xml);
					}
					if (o.responseText.substr(1, 1) != '?' && debdiv) {
						debdiv.innerHTML += o.responseText;
					}
				}
			}
		}
		Zefext.stopLoader();
	},

	/**
	 * Failed AJAX event handler.
	 * 
	 * @method
	 * @param object
	 *            O response
	 */
	handleFailure : function(o) {
		if (o.responseText !== undefined) {
			var debdiv = document.getElementById("ajax_comm_debug");
			if (debdiv) {
				debdiv.innerHTML = "<li>" + lang.transaction_id + " " + o.tId
						+ "</li>";
				debdiv.innerHTML += "<li>" + lang.http_status + " " + o.status
						+ "</li>";
				debdiv.innerHTML += "<li>" + lang.status_code_message + ": "
						+ o.statusText + "</li>";
			}
		}
		Zefext.stopLoader();
	},

	/**
	 * Show confirm window.
	 * 
	 * @method
	 * @param {string}
	 *            title
	 * @param {string}
	 *            caption
	 * @param {string}
	 *            doYes run javascript on yes
	 * @param {string}
	 *            doNo run javasctipt on no
	 */
	confirm : function(title, caption, doYes, doNo) {
		if (ZefextCfg.msgboxPanel) {
			Ext.Msg.confirm(title, caption, function(btn) {
						if (btn == 'yes') {
							eval(doYes);
						} else {
							eval(doNo);
						}
					});
		} else {
			if (confirm(caption)) {
				eval(doYes);
			} else {
				eval(doNo);
			}
		}
	},

	/**
	 * Show alert.
	 * 
	 * @method
	 * @param {string}
	 *            title
	 * @param {string}
	 *            caption
	 */
	alert : function(title, caption) {
		this.hideLoadMasks();
		if (ZefextCfg.msgboxPanel) {
			Ext.Msg.alert(title, caption);
		} else {
			alert(caption);
		}
		var y = 1;
	},

	/**
	 * Show prompt window.
	 * 
	 * @method
	 * @param {string}
	 *            title
	 * @param {string}
	 *            caption
	 * @param {string}
	 *            doYes run javascript on yes
	 * @param {string}
	 *            doNo run javasctipt on no
	 * @param {string}
	 *            multiline
	 * @param {string}
	 *            value default value
	 */
	prompt : function(title, caption, doYes, doNo, multiline, value) {
		if (ZefextCfg.msgboxPanel) {
			Ext.Msg.prompt(title, caption, function(button, inputText) {
						if (button == 'ok') {
							eval(doYes);
						} else {
							eval(doNo);
						}
					}, false, multiline, value);
		} else {
			var inputText = prompt(caption, value);
			if (inputText) {
				eval(doYes);
			} else {
				eval(doNo);
			}
		}
	},

	/**
	 * Show date-prompt window.
	 * 
	 * @method
	 * @param {string}
	 *            title
	 * @param {string}
	 *            caption
	 * @param {string}
	 *            doYes run javascript on yes
	 * @param {string}
	 *            doNo run javasctipt on no
	 * @param {string}
	 *            multiline not use
	 * @param {string}
	 *            value default value
	 */
	datePrompt : function(title, caption, doYes, doNo, multiline, value) {
		if (ZefextCfg.msgboxPanel) {
			caption = caption
					+ '<div id="_z_dateprompt" style="height:50px;"></div>';

			Ext.Msg.show({
						title : title,
						msg : caption,
						buttons : Ext.Msg.OKCANCEL,
						fn : function(button) {
							if (button == 'ok') {
								var date = new Date(Zefext.datePromptField
										.getValue());
								var inputText = date.format('Y-m-d');
								eval(doYes);
							} else {
								eval(doNo);
								Ext.Msg.hide();
							}
						}
					});
			Zefext.datePromptField = new Ext.form.DateField({
						name : 'datePromptField',
						value : value,
						hideLabel : true
					});
			Zefext.datePromptForm = new Ext.FormPanel({
						items : [{
									html : '<br/>',
									baseCls : 'x-panel-transparent'
								}, Zefext.datePromptField],
						baseCls : 'x-panel-transparent',
						border : false,
						renderTo : '_z_dateprompt'
					});
		} else {
		}
	},

	/**
	 * Go to url
	 * 
	 * <p>
	 * The behavior of this method dependent on special query string parameters.<br>
	 * Parameters: <br>
	 * __dl: if 1 then directly load on page (don't send AJAX request)<br>
	 * __nc: if 1 then not change the content (don't call Zefext.wait())<br>
	 * __target: the target div for Zefext.wait()
	 * </p>
	 * <p>
	 * In this version only works width GET request.
	 * </p>
	 * 
	 * @method
	 * @param {string}
	 *            url url
	 * @param {string}
	 *            post POST data (not yet!!!)
	 */
	goTo : function(url, post) {
		var urla = url.split('__dl=');
		var ajxr = true;
		if (urla[1]) {
			if (urla[1].substr(0, 1) == '1') {
				ajxr = false;
			}
		}
		var urla = url.split('__nc=');
		var nc = false;
		if (urla[1]) {
			if (urla[1].substr(0, 1) == '1') {
				nc = true;
			}
		}
		var urla = url.split('__target=');
		if (urla[1]) {
			var urlb = urla[1].split('&');
			if (urlb[0]) {
				this.wait(urlb[0]);
			}
		}
		if (ajxr) {
			if (!nc) {
				this.wait('zefext_content');
			}
			this.makeRequest(url);
		} else {
			document.location = url;
		}
	},

	cancelEvent : function(event) {
		e = event;
		if (typeof e.preventDefault == 'function')
			e.preventDefault();
		if (typeof e.stopPropagation == 'function')
			e.stopPropagation();
		if (window.event) {
			window.event.cancelBubble = true; // for IE
			window.event.returnValue = false; // for IE
		}
	},

	/**
	 * Create new window.
	 * 
	 * <p>
	 * This is an old method. Don't use it. <br>
	 * Use the createIdWindow() method.
	 * </p>
	 * 
	 * @private
	 * @method
	 * @param {integer}
	 *            w width
	 * @param {integer}
	 *            h height
	 * @param {string}
	 *            title title
	 */
	createNewWindow : function(w, h, title) {
		this._nw++;
		var nwc = this._nw;
		var n_pan = new Ext.Panel({
					viewConfig : {
						forceFit : true
					},
					cls : 'x-panel-autoscroll',
					id : 'genwin' + nwc + '_zgen_panel'
				});
		var n_win = new Ext.Window({
					id : 'genwin' + nwc,
					title : title,
					manager : Zefext.winGroup,
					closable : true,
					width : w,
					height : h,
					border : false,
					maximizable : true,
					shadow : true,
					plain : true,
					layout : 'fit',
					autoScroll : true,
					items : [n_pan]
				});
		n_win.on('close', function() {
					this.destroy();
				});
		this.nPans[nwc] = n_pan;
		this.nWins[nwc] = n_win;
		this.nWins[nwc].show();
		if (document.getElementById('genwin' + nwc + '_zgen_panel')) {
			if (document.getElementById('wait')) {
				document.getElementById('genwin' + nwc + '_zgen_panel').innerHTML = document
						.getElementById('wait').innerHTML;
			}
		}
		return nwc;
	},

	/**
	 * Create new ID window and show it.
	 * 
	 * <p>
	 * Create new Ext.window (if not exists) with id. The window will be a child
	 * of Zefext.windows object.
	 * </p>
	 * <p>
	 * The window contains Ext.Panel with id: id + '_zgen_panel'. <br>
	 * Exapmle:
	 * </p>
	 * <code> 
	 * Zefext.createIdWindow('testId', 480, 320, 'Test window');<br>
	 * Zefext.windows.testId.hide(); <br>
	 * var panel = Ext.get('testId_zgen_panel');
	 * </code>
	 * 
	 * 
	 * @method
	 * @param {string}
	 *            id id
	 * @param {integer}
	 *            w width
	 * @param {integer}
	 *            h height
	 * @param {string}
	 *            title title
	 */
	createIdWindow : function(id, w, h, title) {
		var temp;
		eval("temp = Zefext.windows." + id + ";");
		if (temp) {
			if (temp.id) {
				temp.show();
				return true;
			}
		}
		var idPan = new Ext.Panel({
					viewConfig : {
						forceFit : true
					},
					cls : 'x-panel-autoscroll',
					id : id + '_zgen_panel'
				});
		var idWin = new Ext.Window({
					id : id,
					title : title,
					manager : Zefext.winGroup,
					closable : true,
					width : w,
					height : h,
					border : false,
					maximizable : true,
					shadow : true,
					plain : true,
					layout : 'fit',
					autoScroll : true,
					items : [idPan]
				});
		idWin.on('close', function() {
					this.destroy();
					eval("Zefext.windows." + id + " = Zefext._wMaker;");
					eval("Zefext.windows." + id + ".idf = id;");
					eval("Zefext.windows." + id + ".w = w;");
					eval("Zefext.windows." + id + ".h = h;");
					eval("Zefext.windows." + id + ".title = title;");
				});
		eval("Zefext.windows." + id + " = idWin;");
		eval("Zefext.windows." + id + "_panel = idPan;");
		eval("Zefext.windows." + id + ".show();");
		return true;
	},

	/**
	 * Get window PHPSelf.
	 * 
	 * <p>
	 * Only on special elements (grid).
	 * </p>
	 * 
	 * @private
	 * @method
	 * @param {string}
	 *            wphps identifier
	 */
	getWPhpSelf : function(wphps) {
		var vo = Ext.getCmp('wphp_' + wphps);
		if (vo) {
			return vo.getValue();
		}
	},

	/**
	 * Show logo.
	 * 
	 * @method
	 */
	ready : function() {
		var page = document.getElementById('container');
		if (page) {
			page.style.display = 'block';
		}
		var base_loader = document.getElementById('base_loader');
		if (base_loader) {
			base_loader.style.display = 'none';
		}
		var logo = document.getElementById('logo');
		if (logo) {
			logo.style.display = 'block';
		}
	},

	/**
	 * Show menu window
	 * 
	 * @method
	 */
	menuShow : function() {
		ZefextUmenu.show();
	},

	/**
	 * Show wait icon in div element.
	 * 
	 * @method
	 * @param {string}
	 *            tardiv target div element
	 */
	wait : function(tardiv) {
		if (document.getElementById(tardiv) && document.getElementById('wait')) {
			document.getElementById(tardiv).innerHTML = document
					.getElementById('wait').innerHTML;
		}
	},

	/**
	 * Remove wait icon from div element.
	 * 
	 * @method
	 * @param {string}
	 *            tardiv target div element
	 */
	clearWait : function(tardiv) {
		if (document.getElementById(tardiv)) {
			document.getElementById(tardiv).innerHTML = '';
		}
	},

	/**
	 * Set cookie to root path.
	 * 
	 * @method
	 * @param {string}
	 *            name cookie name
	 * @param {string}
	 *            v_value cookie value
	 */
	setCookie : function(name, v_value) {
		document.cookie = name + "=" + (v_value) + ";path=/;";
	},

	/**
	 * XML content parser runner.
	 * 
	 * @method
	 * @param {string}
	 *            content
	 */
	execContentParser : function(content) {
		ZefextUxml.parseContent(content);
		return;
	},

	/**
	 * Enter key checking.
	 * 
	 * @method
	 * @param object
	 *            e event
	 * @return {boolean}
	 */
	checkEnter : function(e) {
		if (!e)
			var e = window.event;
		if (e.keyCode) {
			code = e.keyCode;
		} else if (e.which) {
			code = e.which;
		}
		if (code == 13) {
			return true;
		}
		return false;
	},

	/**
	 * Hide load all masks.
	 * 
	 * @method
	 */
	hideLoadMasks : function() {
		for (var i = 0; i < this.masks.length; i++) {
			eval('Zefext.' + this.masks[i] + '.hide();');
		}
	},

	/**
	 * Hide load mask.
	 * 
	 * @method
	 * @param {string}
	 *            targetDiv target div element for mask
	 */
	hideLoadMask : function(targetDiv) {
		eval('if(Zefext.mask' + targetDiv + ') {Zefext.mask' + targetDiv
				+ '.hide();}');
	},

	/**
	 * Show load mask.
	 * 
	 * @method
	 * @param {string}
	 *            targetDiv target div element for mask
	 */
	loadMask : function(targetDiv) {
		var temp;
		eval("temp = Zefext.mask" + targetDiv + ";");
		if (!temp) {
			temp = new Ext.LoadMask(targetDiv, {
						msg : lang.waiting
					});
			this.masks[this.masks.length] = 'mask' + targetDiv;
			eval("Zefext.mask" + targetDiv + " = temp;");
			eval("Zefext.mask" + targetDiv + ".show();");
		} else {
			eval("Zefext.mask" + targetDiv + ".show();");
		}
	},

	/**
	 * Show loadDao mask.
	 * 
	 * @method
	 */
	loadMaskDao : function() {
		if (!this.maskDao) {
			this.maskDao = new Ext.LoadMask('div_dao', {
						msg : lang.waiting
					});
			this.masks[this.masks.length] = 'maskDao';
			this.maskDao.show();
		} else {
			this.maskDao.show();
		}
	},

	/**
	 * Show loadHelp mask.
	 * 
	 * @method
	 */
	loadMaskHelp : function() {
		if (!this.maskHelp) {
			this.maskHelp = new Ext.LoadMask('div_help', {
						msg : lang.waiting
					});
			this.masks[this.masks.length] = 'maskHelp';
			this.maskHelp.show();
		} else {
			this.maskHelp.show();
		}
	},

	/**
	 * Show loadTree mask.
	 * 
	 * @method
	 */
	loadMaskTree : function() {
		if (!this.maskTree) {
			this.maskTree = new Ext.LoadMask('tree_body', {
						msg : lang.waiting
					});
			this.masks[this.masks.length] = 'maskTree';
			this.maskTree.show();
		} else {
			this.maskTree.show();
		}
	},

	/**
	 * Encode password fields in form.
	 * 
	 * @private
	 * @method
	 * @param {string}
	 *            formName name of form
	 */
	cpw : function(formName) {
		if (formName == 'form_reg' || formName.substr(0, 1) == '@'
				|| formName.substr(0, 1) == '$') {
			return;
		}
		if (formName.substr(0, 1) == '%') {
			formName = formName.substr(1, formName.length - 1);
		}
		if (formName.substr(0, 1) == '~') {
			formName = formName.substr(1, formName.length - 1);
		}
		g = 'AxF43&ggu7Kx5%';
		var F = (document.getElementById(formName) || document.forms[formName]);
		var L = F.elements.length;
		for (z = 0; z < L; z++) {
			var Tb = F.elements[z];
			if (Tb) {
				if (Tb.type) {
					T = Tb.type;
					if (T.toLowerCase() == 'password') {
						var H = this.sHash(F.elements[z].value);
						eval(ZefextCfg.pkV + ZefextCfg.pCK + this.ck);
						var ED = '';
						var D = this.sHash(F.elements[z].value + g);
						var dcount = D.length;
						if (dcount > 0) {
							for (i = 0; i < dcount; i++) {
								var Y = ZefextCfg.scc.substr(i, 1);
								var a = D.substr(i, 1);
								var b = a.charCodeAt(0) ^ Y.charCodeAt(0);
								ED += String.fromCharCode(b);
							}
						}
						F.elements[z].value = Base64.encode(ED);
					}
				}
			}
		}
	},

	/**
	 * Decode form action.
	 * 
	 * @private
	 * @method
	 * @param {string}
	 *            formAction
	 */
	ccp : function(formAction) {
		var Ct = formAction.split('@');
		if (Ct.length == 1) {
			return formAction;
		}
		if (Ct.length == 0) {
			this.alert('error', 'no form action');
		}
		formAction = Ct[1];
		formAction = Base64.decode(formAction);
		var dcount = formAction.length;
		var ED = '';
		var j = 0;
		if (dcount > 0) {
			for (i = 0; i < dcount; i++) {
				if (j > 31) {
					j = 0;
				}
				var Y = ZefextCfg.ccs.substr(j, 1);
				var a = formAction.substr(i, 1);
				var b = a.charCodeAt(0) ^ Y.charCodeAt(0);
				ED += String.fromCharCode(b);
				j++;
			}
		}
		return (ED);
	},

	/**
	 * Trim.
	 * 
	 * @method
	 * @param {string}
	 *            str
	 * @param {string}
	 *            chars
	 * @return {string}
	 */
	trim : function(str, chars) {
		return this.ltrim(this.rtrim(str, chars), chars);
	},

	/**
	 * Left trim.
	 * 
	 * @method
	 * @param {string}
	 *            str
	 * @param {string}
	 *            chars
	 * @return {string}
	 */
	ltrim : function(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
	},

	/**
	 * Right trim.
	 * 
	 * @method
	 * @param {string}
	 *            str
	 * @param {string}
	 *            chars
	 * @return {string}
	 */
	rtrim : function(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
	},

	/**
	 * Hash function.
	 * 
	 * @method
	 * @param {string}
	 *            c
	 */
	sHash : function(c) {
		return SHA1(c);
	},

	/**
	 * @private
	 */
	_wMaker : {
		show : function() {
			this.createIdWindow(this.idf, this.w, this.h, this.title);
		},
		id : null,
		idf : null,
		w : null,
		h : null,
		title : null
	},

	/**
	 * Show "about" info.
	 * 
	 * @method
	 */
	about : function() {
		Ext.Msg.show({
					title : lang.about,
					msg : '<div id="about"></div>',
					buttons : Ext.Msg.OK,
					width : 450
				});
		this.wait('about');
		this.makeRequest('/system/about');
	},

	/**
	 * Set selected text into combo.
	 * 
	 * @method
	 * @param {string}
	 *            id id of element
	 * @param {string}
	 *            value value of element
	 */
	setComboTextByValue : function(id, value) {
		var tmpSel = Ext.getCmp(id);
		if (tmpSel) {
			if (tmpSel.store) {
				var tSt = tmpSel.store;
				var sIdx = false;
				sIdx = tSt.find('value', value);
				if (sIdx === false) {
					for (i = 0; i < tSt.getCount(); i++) {
						if (tSt.getAt(i).data.value == value) {
							var sIdx = i;
							break;
						}
					}
				}
				if (sIdx !== false) {
					var Txt = tSt.getAt(sIdx);
					if (Txt) {
						Txt = Txt.data.text;
						tmpSel.setValue(Txt);
					}
				}
			}
		}
	},

	/**
	 * Check script url
	 * 
	 * @method
	 * @param {string}
	 *            url
	 * @return {string}
	 */
	checkScriptUrl : function(url) {
		return url;
	},

	/**
	 * Load javascript and append to document
	 * 
	 * @method
	 * @param {string}
	 *            url
	 */
	loadScript : function(url) {
		url = Zefext.checkScriptUrl(url);
		var script = document.createElement('script');
		script.type = 'text/javascript';
		script.src = url;
		document.body.appendChild(script);
	},

	/**
	 * Get size of viewport
	 * 
	 * @method
	 * @return object
	 */
	getViewportSize : function() {
		var width;
		var height;
		if (typeof window.innerWidth != 'undefined') {
			width = window.innerWidth;
			height = window.innerHeight;
		} else if (typeof document.documentElement != 'undefined'
				&& typeof document.documentElement.clientWidth != 'undefined'
				&& document.documentElement.clientWidth != 0) {
			width = document.documentElement.clientWidth;
			height = document.documentElement.clientHeight;
		} else {
			width = document.getElementsByTagName('body')[0].clientWidth;
			height = document.getElementsByTagName('body')[0].clientHeight;
		}
		var size = {
			width : width,
			height : height
		};
		return size;
	},

	/**
	 * PHP like print_r() funcion
	 * 
	 * @method
	 * @param {mixed}
	 *            dataElement
	 */
	printR : function(dataElement) {
		if (Zefext.winJson) {
			if (Zefext.winJson.printR) {
				Zefext.winJson.printR(dataElement);
			}
		}
	},

	tooltipHelps : {},

	createTooltipHelp : function(id, target, url, anchor) {
		var idWin = new Ext.ToolTip({
					id : id,
					target : target,
					anchor : anchor,
					width : 200,
					shadow : false,
					autoLoad : {
						url : url
					},
					dismissDelay : 15000
				});
		idWin.on('beforeshow', function(obj) {
					if (Zefext.tooltipHelpStatus) {
						obj.removeClass('non-visible');
						return true;
					} else {
						obj.addClass('non-visible');
					}
				});
		eval("Zefext.tooltipHelps." + id + " = idWin;");
		return true;
	}

};

/**
 * Ext z-index override
 * 
 * @private
 */
Ext.override(Ext.Layer, {
			getZIndex : function() {
				if (this.dom.className.substr(0, 8) == 'x-window') {
					var mrv = 6000;
				} else if (this.dom.className.substr(0, 11) == 'x-panel-dbm') {
					var mrv = 5000;
				} else if (this.dom.className.substr(0, 7) == 'x-panel') {
					var mrv = 6000;
				} else {
					var mrv = 11000;
				}
				Ext.log(this.dom.className + ' ' + mrv);
				return this.zindex || parseInt(this.getStyle("z-index"), 10)
						|| mrv;
			}
		});

/**
 * Ext log
 * 
 * If not defined, create the fake log object.
 * 
 * @private
 */
if (!Ext.log) {
	Ext.apply(Ext, {
				log : function() {
				},
				logf : function(format, arg1, arg2, etc) {
				},
				dump : function(o) {
				},
				_timers : {},
				time : function(name) {
				},
				timeEnd : function(name, printResults) {
				}
			});
}

/**
 * Ext on ready
 * 
 * @private
 */
Ext.onReady(function() {
	Ext.QuickTips.init();
	Ext
			.log("Ext logger console is on. To take it off set \"Zefext.extjs_debug_panel\" to false in app.ini file.");

	/**
	 * @class Zefext.contextMenu
	 * 
	 * Contextmenu. Entity of Ext.menu.Menu
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.contextMenu = new Ext.menu.Menu({
				items : [{
							text : lang.about,
							handler : Zefext.about
						}]
			});

	Zefext.ck = '';
	for (i = 0; i < BBB.length; i++) {
		Zefext.ck = Zefext.ck + String.fromCharCode(BBB[i]);
	}
	/**
	 * @class Zefext.winGroup
	 * 
	 * Window group for windows. Entity of Ext.WindowGroup
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.winGroup = new Ext.WindowGroup();
	Zefext.winGroup.zseed = 7000;
	/**
	 * @class Zefext.panelMenu
	 * 
	 * Panel for menu. Entity of Ext.Panel
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.panelMenu = new Ext.Panel({
				cls : 'x-panel-autoscroll',
				id : 'sm_menu_div'
			});
	/**
	 * @class Zefext.winMenu
	 * 
	 * Window for menu. Contains Zefext.panelMenu. Entity of Ext.Window
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.winMenu = new Ext.Window({
				closeAction : 'hide',
				id : 'mWsm',
				manager : Zefext.winGroup,
				title : lang.menu,
				closable : true,
				width : 425,
				height : 315,
				border : false,
				maximizable : true,
				shadow : true,
				plain : true,
				layout : 'fit',
				items : [Zefext.panelMenu]
			});
	Zefext.windows.winMenu = Zefext.winMenu;
	if (ZefextCfg.debvar > 0) {
		/**
		 * @class Zefext.panelDebug
		 * 
		 * Panel for debug. Build if ZefextCfg.debvar > 0. Entity of Ext.Panel
		 * 
		 * @author Zefext Development Team
		 * @copyright Copyright (c) 2006 Zefext Development Team
		 */
		Zefext.panelDebug = new Ext.Panel({
					cls : 'x-panel-autoscroll',
					id : 'ajax_comm_debug'
				});
		/**
		 * @class Zefext.winDebud
		 * 
		 * Window for debug. Contains Zefext.panelDebug. Build if
		 * ZefextCfg.debvar > 0. Entity of Ext.Window
		 * 
		 * @author Zefext Development Team
		 * @copyright Copyright (c) 2006 Zefext Development Team
		 */
		Zefext.winDebug = new Ext.Window({
					id : 'mWd',
					manager : Zefext.winGroup,
					title : 'INFO',
					closable : true,
					width : 405,
					height : 200,
					border : false,
					maximizable : true,
					shadow : true,
					plain : true,
					layout : 'fit',
					items : [Zefext.panelDebug]
				});
		Zefext.winDebug.on('beforeclose', function() {
					Zefext.winDebug.hide();
					return false;
				});
		Zefext.windows.winDebug = Zefext.winDebug;
	}
	/**
	 * @class Zefext.panelHelp
	 * 
	 * Panel for help. Entity of Ext.Panel
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.panelHelp = new Ext.Panel({
				cls : 'x-panel-autoscroll',
				id : 'div_help'
			});
	/**
	 * @class Zefext.winHelp
	 * 
	 * Window for help. Contains Zefext.panelHelp. Entity of Ext.Window
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.winHelp = new Ext.Window({
				closeAction : 'hide',
				id : 'mWh',
				manager : Zefext.winGroup,
				title : lang.help,
				closable : true,
				width : 480,
				height : 520,
				border : false,
				maximizable : true,
				shadow : true,
				plain : true,
				layout : 'fit',
				items : [Zefext.panelHelp]
			});
	Zefext.windows.winHelp = Zefext.winHelp;
	/**
	 * @class Zefext.panelTree
	 * 
	 * Panel for base tree. Entity of Ext.Panel
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.panelTree = new Ext.Panel({
				border : false,
				bodyBorder : false,
				id : 'tree_body',
				autoHeight : true,
				autoWidth : true,
				cls : 'x-panel-transparent',
				viewConfig : {
					forceFit : true
				}
			});
	/**
	 * @class Zefext.winTree
	 * 
	 * Window for base tree. Contains Zefext.panelTree. Entity of Ext.Window
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.winTree = new Ext.Window({
		closeAction : 'hide',
		id : 'mWt',
		manager : Zefext.winGroup,
		title : lang.searchselect,
		closable : true,
		width : 350,
		height : 360,
		border : false,
		maximizable : true,
		shadow : true,
		plain : true,
		layout : 'fit',
		items : [Zefext.panelTree]
			/* width and height: see values in initTree.php */
		});
	Zefext.winTree.on('resize', function(w, width, height) {
				var ptbi = Ext.get('tbi');
				if (ptbi) {
					ptbi.setHeight(height - 76);
				}
			});
	Zefext.windows.winTree = Zefext.winTree;
	/**
	 * @class Zefext.panelDao
	 * 
	 * Panel for base data objects (DAO). Entity of Ext.Panel
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.panelDao = new Ext.Panel({
				cls : 'x-panel-autoscroll',
				id : 'div_dao'
			});
	/**
	 * @class Zefext.winDao
	 * 
	 * Window for base data objects (DAO). Contains Zefext.panelDao. Entity of
	 * Ext.Window
	 * 
	 * @author Zefext Development Team
	 * @copyright Copyright (c) 2006 Zefext Development Team
	 */
	Zefext.winDao = new Ext.Window({
				closeAction : 'hide',
				id : 'mWdao',
				manager : Zefext.winGroup,
				title : '',
				closable : true,
				width : 720,
				height : 550,
				border : false,
				maximizable : true,
				shadow : true,
				plain : true,
				layout : 'fit',
				items : [Zefext.panelDao]
			});
	Zefext.windows.winDao = Zefext.winDao;
	Zefext.ready();
	if (ZefextCfg.freeMemory) {
	}
	if (document.getElementById('main_toolbar')) {
		/**
		 * @class Zefext.toolbar
		 * 
		 * Base toolbar for zefext. Entity of Ext.Toolbar
		 * 
		 * @author Zefext Development Team
		 * @copyright Copyright (c) 2006 Zefext Development Team
		 */
		Zefext.toolbar = new Ext.Toolbar();
		Zefext.toolbar.render('main_toolbar');
		if (ZefextCfg.debvar > 0) {
			Zefext.debMenu = new Ext.menu.Menu({
						id : 'debMenu',
						xtype : 'menu',
						items : [{
									text : 'response JSON',
									handler : ZefextJSONShow
								}, {
									text : 'response XML',
									handler : ZefextXMLShow
								}]
					});
			Zefext.toolbar.add({
						text : 'DEBUG',
						menu : Zefext.debMenu
					});
		}
		Zefext.toolbar.add({
					text : lang.menu,
					handler : Zefext.menuShow
				});
		/**
		 * @class Zefext.dMenu
		 * 
		 * Dinamic menu on Zefext.Toolbar. Entity of Ext.menu.Menu
		 * 
		 * @author Zefext Development Team
		 * @copyright Copyright (c) 2006 Zefext Development Team
		 */
		/*
		 * Zefext.dMenu = new Ext.menu.Menu({ id : 'dMenu', items : [{ text :
		 * lang.not_loaded, disabled : true }] });
		 * 
		 * Zefext.toolbar.add({ text : lang.actual_menu, menu : Zefext.dMenu });
		 */
		Zefext.toolbar.render();
		Zefext.toolbar.doLayout();
		Zefext.makeRequest('/js/menu/login.toolbar');
	}
	if (document.getElementById('history_toolbar')) {
		/**
		 * @class Zefext.historybar
		 * 
		 * Toolbar of history for Zefext. Entity of Ext.Toolbar
		 * 
		 * @author Zefext Development Team
		 * @copyright Copyright (c) 2006 Zefext Development Team
		 */
		Zefext.historybar = new Ext.Toolbar();
	}
});

/**
 * @private
 */
Ext.override(Ext.Panel, {
/*
 * initEvents : Ext.Panel.prototype.initEvents.createSequence(function() { if
 * (this.body) this.body.on('contextmenu', this.onBodyContextMenu, this); }),
 * onBodyContextMenu : function(e) { e.preventDefault();
 * Zefext.contextMenu.showAt(e.xy); }
 */
		});

/**
 * @private
 */
Ext.USE_NATIVE_JSON = true;

/**
 * @class Zefext.windows
 * 
 * Object to store created Id windows.
 * 
 * @author Zefext Development Team
 * @copyright Copyright (c) 2006 Zefext Development Team
 */
Zefext.windows = {};

/**
 * @class Zefext._wMaker
 * 
 * _wMaker is protected class for creating Id window.
 * 
 * @private
 * @author Zefext Development Team
 * @copyright Copyright (c) 2006 Zefext Development Team
 */
Zefext._wMaker = {
	/**
	 * Show ID window
	 * 
	 * @method
	 */
	show : function() {
		Zefext.createIdWindow(this.idf, this.w, this.h, this.title);
	},
	/**
	 * Id
	 * 
	 * @property
	 * @type {string}
	 */
	id : null,
	/**
	 * Idf
	 * 
	 * @property
	 * @type {string}
	 */
	idf : null,
	/**
	 * Width
	 * 
	 * @property
	 * @type {float}
	 */
	w : null,
	/**
	 * Height
	 * 
	 * @propetry
	 * @type {float}
	 */
	h : null,
	/**
	 * Title
	 * 
	 * @property
	 * @type {string}
	 */
	title : null
};

var _temptree;
var _tempvar;
// var Zefext = new Object;

