var qxLib = qxLib ? qxLib : function () {
	var private = {
		includes: Array()
	}
	var public = {
		windowLoaded: false,
		getChildrenByName: function (el, name) {
			var i, found=Array(), children;
			for(i=0, children = el.childNodes; i<children.length; i++)
				if (children[i].name == name) found.push(children[i]);
			return found;
		},
		getChildrenByTagName: function (el, tagName) {
			var i, found=Array(), children;
			for(i=0, children = el.childNodes; i<children.length; i++)
				if (children[i].tagName == tagName) found.push(children[i]);
			return found;
		},
		collectionToArray: function (c) {
			var i; arr=new Array();
			for (i=0; i<c.length; arr.push(c.item(i++)));
			return arr;
		},
		fixIEPngBug: function () {
			//var images = document.getElementsByTagName("img");
		},
		findPos: function (obj) {
			var l=0, t=0;
			do {
				l += obj.offsetLeft;
				t += obj.offsetTop;
			}
			while (obj = obj.offsetParent);
			return {left:l,top:t};
		},
		include: function (src) {
			var js = document.createElement('script');
			js.setAttribute('type', 'text/javascript');
			js.setAttribute('src', src);
			document.getElementsByTagName('head')[0].appendChild(js);

			if (!private.includes[src])
				private.includes[src] = 1;
			else private.includes[src]++;
			return private.includes[src];
		},
		include_once: function (src) {
			if (!private.includes[src])
				if(public.include(src)) return true;
			else return true;
			return false;
		},
		event: function (ev, handler, el) {
			var i;
			if (!el) el = window;
			if(el.addEventListener) {
				el.addEventListener(ev, handler, false);
			}
			else if(el.attachEvent) {
				if (!el.qxPageHandlers) el.qxPageHandlers = new Array();
				if (!el.qxPageHandlers[ev]) {
					el.qxPageHandlers[ev] = new Array();
					el.attachEvent("on" + ev, function(e) {e.target=window.event.srcElement;e.currentTarget=el;e.preventDefault=function(){window.event.returnValue = false};for(var i in el.qxPageHandlers[ev]) el.qxPageHandlers[ev][i](e);});
				}
				el.qxPageHandlers[ev].push(handler);
			}
		},
		eventRemove: function (ev, handler, el) {
			var i;
			if (!el) el = window;
			if(el.removeEventListener) el.removeEventListener(ev, handler, false);
			else if(el.attachEvent) {
				for (i in el.qxPageHandlers[ev])
					if (el.qxPageHandlers[ev][i]===handler) {
						el.qxPageHandlers[ev].splice(i, 1);
						break;
					}
			}
		},
		fireEvent: function (el, type) {
			if (document.createEventObject && el.fireEvent){ //IE
				var evt = document.createEventObject();
				return el.fireEvent('on'+type, evt)
			}
			else if (document.createEvent) { //Mozilla
				var evt = document.createEvent('HTMLEvents');
				evt.initEvent(type, true, true);
				el.dispatchEvent(evt);
			}		
		},
		domLoad: function (handler) {
			var init = function () {
				if (arguments.callee.done) return;
				arguments.callee.done = true;
				if (_timer) clearInterval(_timer);
				handler();
			}
			if (document.addEventListener && !/Opera/i.test(navigator.userAgent)) { //Mozilla/Opera9
			  document.addEventListener("DOMContentLoaded", init, false);
			}
			/* Internet Explorer */
			/*@cc_on @*/
			/*@if (@_win32)
				document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
				var script = document.getElementById("__ie_onload");
				public.event("readystatechange", function(e) {if (e.target.readyState == "complete") init();}, script);
			/*@end @*/
			if (/WebKit/i.test(navigator.userAgent)) { // Safari, sniff
				var _timer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) {
						init();
					}
				}, 10);
			}
			/* for other browsers */
			window.onload = init;
		}
	}
	public.event("load", function(){qxLib.windowLoaded=true;});
	return public;
}();
