function Class() { }; 
Class.prototype.construct = function() {}; Class.extend = function(_d) { var _a = function() { if (arguments[0] !== Class) { this.construct.apply(this, arguments); }; }; var _b = new this(Class); var _c = this.prototype; for (var n in _d) { var _e = _d[n]; if (_e instanceof Function) _e.$ = _c; _b[n] = _e; }; _a.prototype = _b; _a.extend = this.extend; return _a; };
var j = Class.extend({
	browser : '', libsLoaded : '', shiftPressed : false, ctrlPressed : false,
	mouse : function() {  },
	construct : function() { if (document.getElementById&&!document.all) this.browser = "ff"; else if (document.layers) this.browser = "ns"; else if (document.all) this.browser = "ie"; },
	getPageSize : function() { var _a, _b; if (window.innerHeight && window.scrollMaxY) { _a = document.body.scrollWidth; _b = window.innerHeight + window.scrollMaxY; } else if (document.body.scrollHeight > document.body.offsetHeight){ _a = document.body.scrollWidth; _b = document.body.scrollHeight; } else { _a = document.body.offsetWidth; _b = document.body.offsetHeight; }; var _c, _d; if (self.innerHeight) { _c = self.innerWidth; _d = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { _c = document.documentElement.clientWidth; _d = document.documentElement.clientHeight; } else if (document.body) { _c = document.body.clientWidth; _d = document.body.clientHeight; }; if (_b < _d){ _f = _d; } else { _f = _b; }; if(_a < _c){ _e = _c; } else { _e = _a; }; arrayPageSize = new Array(_e,_f,_c,_d); return arrayPageSize; },
	findObjectPosition : function(obj) { _a = obj.offsetLeft; _b = obj.offsetTop; _c = obj.offsetParent; while (_c.tagName.toUpperCase() != "BODY" ) { _a  += _c.offsetLeft; _b   += _c.offsetTop; _c = _c.offsetParent; };_d = obj.offsetHeight; _f = obj.offsetWidth; var _e = new Array(); _e[0] = _a; _e[1] = _b; _e[2] = _f; _e[3] = _d; return _e; },
	gID : function(id) { return document.getElementById(id); },
	attEvt : function(obj, name, fnc) { if (window.addEventListener) { obj.addEventListener(name, fnc, false); } else if (window.attachEvent) { obj.attachEvent('on' + name, fnc); }; },
	rmvEvt : function(obj, name, fnc) { if (window.addEventListener) { obj.removeEventListener(name, fnc, false); } else if (window.attachEvent) { obj.removeEvent('on' + name, fnc); }; },
	init : function() {
		// search inputs
		// TODO 
		// 1 . Add Validation for time mask inputs
		// 2. Add min & max validations for integerMask, dateMask, timeMask, moneyMask
		var inp = document.getElementsByTagName("INPUT");
		for (var i=0; i<inp.length; i++) {
			if (inp[i].getAttribute("rel") == "moneyMask") {
				try { inp[i].onkeydown = mask.moneyMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				try { inp[i].onkeyup = mask.formatFloat; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "dateMask") {
				try { inp[i].onkeydown = mask.dateMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				if (inp[i].getAttribute("validate") == "true") { 
					try { this.attEvt(inp[i], "blur", valid.date); } catch (e) { alert("Library Not Found\n\nInclude validation.js"); }; 
				};
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "timeMask") {
				try { inp[i].onkeydown = mask.timeMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "integerMask") {
				try { inp[i].onkeydown = mask.integerMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "gMoneyMask") {
				try { inp[i].onkeydown = gMask.moneyMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				try { inp[i].onkeyup = gMask.formatFloat; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "gDateMask") {
				try { inp[i].onkeydown = gMask.dateMask; } catch (e) { alert(e.description); alert("Library Not Found\n\nInclude mask.js"); };
				if (inp[i].getAttribute("validate") == "true") { 
					try { this.attEvt(inp[i], "blur", valid.date); } catch (e) { alert("Library Not Found\n\nInclude validation.js"); }; 
				};
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "gTimeMask") {
				try { inp[i].onkeydown = gMask.timeMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "gTextMask") {
				try { inp[i].onkeydown = gMask.textMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			} else if (inp[i].getAttribute("rel") == "gIntegerMask") {
				try { inp[i].onkeydown = gMask.integerMask; } catch (e) { alert("Library Not Found\n\nInclude mask.js"); };
				inp[i].setAttribute("rel", "");
			};
		};
		// search divs
		// TODO 
		// 1 . Group Button Component Listener, Configuration
		// 2. Styleish button Component Listener, Configuration
		// 3. Image Loader maybe, waits for the page load, and disables the page until the images loaded ?? // could be useful
		// 4. Tree Component, Configuration
		// 5. Data Grid Component
		// 6 . Image Displayer Component
		var div = document.getElementsByTagName("DIV");
		for (var i=0; i<div.length; i++) {
			if (div[i].getAttribute("rel")=="tree") {
				try { tree.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude tree.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="groupButton") {
				try { gButton.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude groupButton.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="dataGrid") {
				dataGrid.create(div[i]);
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="selectBox") {
				try { gSelect.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude selectBox.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="gridSelect") {
				try { gridSelect.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude gridSelect.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="dataset") {
				div[i].style.display = "none";
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="contextMenu") {
				try { contextMenu.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude contextMenu.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="slideMenu") {
				try { slideMenu.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude menu.js"); };
				div[i].setAttribute("rel", "");
			} else if (div[i].getAttribute("rel")=="button") {
				try { button.create(div[i]); } catch (e) { alert("Library Not Found\n\nInclude button.js"); };
				div[i].setAttribute("rel", "");
			}
		}
		if (window.addEventListener) { window.addEventListener("keydown", core.myKeyDown, false); } else if (window.attachEvent) { window.attachEvent('onkeydown', core.myKeyDown); }
		if (window.addEventListener) { window.addEventListener("keyup", core.myKeyUp, false); } else if (window.attachEvent) { window.attachEvent('onkeyup', core.myKeyUp); }
	},
	
	myKeyDown : function(e) {
		var kc = (core.browser=="ie") ? window.event.keyCode : e.which; 
		if (kc == 8) core.shiftPressed = true;
	},
	
	myKeyUp : function(e) {
		var kc = (core.browser=="ie") ? window.event.keyCode : e.which; 
		if (kc == 8) core.shiftPressed = false;
		
	}
});

var core = new j();
function st() { core.init(); }
function onerr(e) { return false; }
if (window.addEventListener) { window.addEventListener("load", st, false); } else if (window.attachEvent) { window.attachEvent('onload', st); }
//if (window.addEventListener) { window.addEventListener("error", onerr, false); } else if (window.attachEvent) { window.attachEvent('onerror', onerr); }