if (!this.dom) {
	this.dom = {};
}

(function() {
	this.dom = {
		error : function(arg1, arg2, arg3, arg4, arg5, arg6) {
			if (console) console.warn(arg1, arg2, arg3, arg4, arg5, arg6);
		},
		getAgent : function() {
			// Fetch browser information
			var strAgent = navigator.userAgent, strVersion = navigator.appVersion, intVersion = parseFloat(strVersion);
			// Test for browser types
			if (strAgent.indexOf("Opera") >= 0) {
				dom.isOpera = intVersion;
			}
			if (strAgent.indexOf("AdobeAIR") >= 0) {
				dom.isAIR = 1;
			}
			dom.isKhtml = (strVersion.indexOf("Konqueror") >= 0) ? intVersion
					: 0;
			dom.isWebKit = parseFloat(strAgent.split("WebKit/")[1])
					|| undefined;
			dom.isChrome = parseFloat(strAgent.split("Chrome/")[1])
					|| undefined;
			var intIndex = Math.max(strVersion.indexOf("WebKit"), strVersion
					.indexOf("Safari"), 0);
			if (intIndex && !dom.isChrome) {
				dom.isSafari = parseFloat(strVersion.split("Version/")[1]);
				if (!dom.isSafari
						|| parseFloat(strVersion.substr(intIndex + 7)) <= 419.3) {
					dom.isSafari = 2;
				}
			}
			if (strAgent.indexOf("Gecko") >= 0 && !dom.isKhtml && !dom.isWebKit) {
				dom.isMozilla = dom.isMoz = intVersion;
			}
			if (dom.isMoz) {
				dom.isFF = parseFloat(strAgent.split("Firefox/")[1])
						|| undefined;
			}
			if (document.all && !dom.isOpera) {
				dom.isIE = parseFloat(strVersion.split("MSIE ")[1])
						|| undefined;
			}
		},
		totalOffsetLeft : function(objElement) {
			var left = 0;
			if (objElement && objElement.offsetParent) {
				while (objElement.offsetParent) {
					left += objElement.offsetLeft || 0;
					objElement = objElement.offsetParent;
				}
				left += objElement.offsetLeft;
			}
			return left;
		},
		totalOffsetTop : function(objElement) {
			var top = 0;
			if (objElement && objElement.offsetParent) {
				while (objElement.offsetParent) {
					top += objElement.offsetTop || 0;
					objElement = objElement.offsetParent;
				}
				top += objElement.offsetTop;
			}
			return top;
		},
		actualWidth : function(objElement) {
			var intWidth = 0;
			if (objElement) {
				if (objElement.scrollWidth) {
					intWidth = objElement.scrollWidth;
				} else if (dom.isIE) {
					intWidth = objElement.offsetWidth;
				} else if (objElement.offsetWidth) {
					intWidth = objElement.offsetWidth;
				}
			}
			return parseInt(intWidth, 10);
		},
		actualHeight : function(objElement) {
			var intHeight = 0;
			if (objElement) {
				if (dom.isMoz || dom.isFF) {
					intHeight = objElement.scrollHeight;
				} else if (dom.isIE) {
					intHeight = objElement.offsetHeight;
				} else if (objElement.offsetHeight) {
					intHeight = objElement.offsetHeight;
				}
			}
			return intHeight;
		},
		_scripts : [],
		loadScript : function(src, callback) {
			var i, cb;

			var hd = document.getElementsByTagName('head')[0];
			var sc = document.createElement('script');
			sc.id = "script_" + Math.floor(Math.random() * 11000002000);
			sc.type = 'text/javascript';
			cb = function() {
				dom._scripts.push({
					src : src,
					script : sc
				});
				if (sc && sc.parentNode) {
					sc.parentNode.removeChild(sc);
				}
				callback();
			};
			for (i in dom._scripts) {
				if (dom._scripts[i].src && dom._scripts[i].src == src) {
					cb();
					return;
				}
			}

			dom.attachEvent(sc, "load", function() {
				cb();
			});
			dom.attachEvent(sc, "readystatechange", function(e) {
				dom.error("readystatechange: ", sc.readyState);
				if ((sc.readyState == 'loaded' && dom.isIE) || sc.readyState == 'complete') {
					cb();
				}
			});
			sc.src = src;
			hd.appendChild(sc);
		},
		attachEvent : function attachEvent(element, type, method, preventBubble) {
			var objThis = this, newMethod, bubble = !!preventBubble, eventobj;
			if (bubble) {
				newMethod = function nonBubblingEvent(e) {
					objThis.abortEvent(e);
					return method(e);
				};
			} else {
				newMethod = method;
			}
			eventobj = {
				element : element,
				type : type,
				method : newMethod
			};
			if (element.addEventListener) {
				element.addEventListener(type, newMethod, !bubble);
			} else if (element.attachEvent) {
				element.attachEvent('on' + type, newMethod);
			}
			return eventobj;
		},

		abortEvent : function abortEvent(e) {
			if (!e) {
				e = window.event;
			}
			if (e.stopPropagation) {
				e.stopPropagation();
			}
			if (e.preventDefault) {
				e.preventDefault();
			}
			e.cancelBubble = true;
			e.cancel = true;
			e.returnValue = false;
			return false;
		}, 
		socket : {
			_socket: [],
			create: function create (channel, callback){
				var objThis = this;
				if (!this._socket[channel] ){
					dom.loadScript(dom.data.baseurl.substring(0, dom.data.baseurl.length-1)+":8000"+"/socket.io/socket.io.js", function(){
						objThis._socket[channel] = io.connect(dom.data.baseurl.substring(0, dom.data.baseurl.length-1)+":8000/"+channel);
						objThis._socket[channel].on("connect", function(data){
							if (callback) callback();
						});
						
					});
				}
			},
			send : function send(channel, data, cb){
				var objThis = this;
				if (!this._socket[channel]){ 
					this.create(channel, function(){objThis.send(channel, data)});
					return;
					}
				this._socket[channel].emit("message", data, cb);
			}, 
			subscribe : function subscribe(channel, callback){
				var objThis = this;
				if (!this._socket[channel]){
					this.create(channel, function(){objThis.subscribe(channel, callback)});
					return;
					}
				this._socket[channel].on("message", function(data){
					if (data){
						callback(data);
					}
				});
			}
		},
		/*
		 * dom.cookies
		 */
		cookie : function cookie (days) {
			this._days = days;
			this._expires = "";

			this.get = function get(name){
				var nameEQ = name + "=";
				var ca = document.cookie.split(';');
				for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
				}
				return null;
			}

			this.set = function set(name, value){
				document.cookie = name+"="+value+this._expires+"; path=/";
			}

			this._construct = function _construct(){
				if (this._days){
					var date = new Date();
					date.setTime(date.getTime()+(days*24*60*60*1000));
					this._expires = "; expires="+date.toGMTString();
				}
			}
			this._construct();
		}
	};
}());

