(function(lib) {
	var lib,
		self,
		data = {
			evts : [],
			persisted : {}
		};
	
	lib = {
		el : function(id){ return document.getElementById(id); },
		db : {
			set : function(key, value) {
				data.persisted[key] = value;
				data._persistSynced = false;
				lib.db.save();
			},
			get : function(key) {
				if (!data._persistSynced) {
					lib.db.restore();
				}
				return data.persisted[key];
			},
			save : function() {
				var str = '';
				for (var x in data.persisted) {
					if (data.persisted.hasOwnProperty(x)) {
						str += '&' + encodeURIComponent(x) + '=' + encodeURIComponent(data.persisted[x] + '');
					}
				}
				window.name = str.replace('&','');
				data._persistSynced = true;
			},
			restore : function() {
				var props = ((window.name || '') + '').split('&'),
					i, x, val;
				for (x=0; x<props.length; x++) {
					i = props[x].indexOf('=');
					val = props[x].substring(i+1);
					if (val.match(/^[0-9\-]+$/gim)) {
						val = parseInt(val, 10);
					}
					else if (val.match(/^[0-9\-\.]+$/gim)) {
						val = parseFloat(val);
					}
					else if (val.match(/^(true|false)$/gim)) {
						val = val.toLowerCase()==='true';
					}
					else if (val==='null') {
						val = null;
					}
					else if (val==='undefined') {
						val = undefined;
					}
					data.persisted[props[x].substring(0,i)] = val;
				}
				data._persistSynced = true;
			}
		},
		addEvent : function(el, type, handler) {
			var evt;
			type = (type+'').replace(/^on/g,'').toLowerCase();
			evt = {
				el : el,
				type : type,
				handler : handler,
				realHandler : function(e) {
					e = e || window.event;
					return evt.handler.call(el, e);
				},
				destroy : function() {
					evt = el = type = handler = null;
				}
			};
			if (el.addEventListener) {
				el.addEventListener(type, evt.realHandler, false);
			}
			else if (el.attachEvent) {
				el.attachEvent('on'+type, evt.realHandler);
			}
			data.evts.push(evt);
		},
		removeEvent : function(el, type, handler) {
			var x, evt;
			type = (type+'').replace(/^on/g,'').toLowerCase();
			for (x=data.evts.length; x--; ) {
				if (data.evts[x].el===el && data.evts[x].type===type && data.evts[x].handler===handler) {
					evt = data.evts[x];
					data.evts.splice(x, 1);
					break;
				}
			}
			if (evt) {
				handler = evt.realHandler || evt.handler || handler;
				evt.destroy();
			}
			if (el.removeEventListener) {
				el.removeEventListener(type, handler, false);
			}
			else if (el.removeEvent) {
				el.removeEvent('on'+type, handler);
			}
		},
		destroyEvents : function() {
			for (var x=data.evts.length; x--; ) {
				lib.removeEvent(data.evts[x].el, data.evts[x].type, data.evts[x].handler);
			}
		},
		destroy : function() {
			lib.destroyEvents();
			self = lib = data = null;
		}
	};
	
	
	self = {
		init : function() {
			if (self.initialized===true) {
				return true;
			}
			self.initialized = true;
			
			self.buildUI();
			
			lib.addEvent(window, 'scroll', self.onscroll);
			
			if (lib.db.get('live_chat_open')) {
				self.openChat();
			}
		},
		
		destroy : function() {
			lib.destroy();
		},
		
		onscroll : function() {
			var top = Math.round((window.pageYOffset || window.scrollTop || 0) + ((document.documentElement ? document.documentElement.scrollTop : 0) || 0) + (document.body.scrollTop || 0)) || 0,
				height = window.innerHeight || document.documentElement.offsetHeight || screen.availHeight;
				base = lib.el('chatBoxWrap');
			if (base.style.position!=='fixed') {
				base.style.bottom = 'auto';
				base.style.top = (top + height - base.offsetHeight) + 'px';
			}
		},
		
		buildUI : function() {
			var base = document.createElement('div');
			base.setAttribute('id', 'chatBoxWrap');
			base.className = 'chatBoxWrap';
			base.style.cssText = 'position:fixed; display:block; width:auto; height:auto; padding:0; margin:0; overflow:hidden; right:30px; bottom:0; background:none; border:none; outline:none; cursor:default; z-index:900; *position:absolute;';
			document.body.appendChild(base);
			
			var baseInner = document.createElement('div');
			baseInner.setAttribute('id', 'chatBoxBase');
			baseInner.className = 'chatBoxBase';
			baseInner.style.cssText = 'position:relative; top:5px; width:auto; height:auto; padding:0 5px; margin:0; overflow:hidden; background:none; border:none; cursor:default;';
			base.appendChild(baseInner);
			
			var btnWrap = document.createElement('div');
			btnWrap.setAttribute('id', 'chatBoxToggleWrap');
			btnWrap.className = 'chatBoxToggleWrap';
			btnWrap.style.cssText = 'position:relative; display:block; left:6px; width:130px; padding:5px 10px 0 5px; margin:0 0 0 auto; height:27px; overflow:hidden; background:none; border:none; z-index:930;';
			baseInner.appendChild(btnWrap);
			
			var btn = document.createElement('a');
			btn.setAttribute('id', 'chatBoxToggle');
			btn.setAttribute('href', 'javascript:;');
			btn.className = 'chatBoxToggle';
			btn.style.cssText = 'position:relative; display:block; width:130px; text-align:center; text-decoration:none; font-weight:bold; font-size:14px; padding:4px 0 10px; margin:0 0 0 auto; background:#EEE; color:#555; border:2px solid #F4F4F4; border-top-color:#FFF; outline:none; cursor:pointer; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; box-shadow:0 0 5px rgba(0,0,0,0.7); -webkit-box-shadow:0 0 5px rgba(0,0,0,0.7); -moz-box-shadow:0 0 5px rgba(0,0,0,0.7); -o-box-shadow:0 0 5px rgba(0,0,0,0.7); z-index:930;';
			btn.innerHTML = '<span>Live Chat</span>';
			lib.addEvent(btn, 'click', self.toggleChat);
			lib.addEvent(btn, 'mouseover', function() {
				this.style.backgroundColor = '#FFF';
				this.style.color = '#000';
				/*
				this.style.opacity = 0.9;
				this.style.filter = 'alpha(opacity=90)';
				*/
			});
			lib.addEvent(btn, 'mouseout', function() {
				this.style.backgroundColor = '#EEE';
				this.style.color = '#555';
				/*
				this.style.opacity = 0.5;
				this.style.filter = 'alpha(opacity=50)';
				*/
			});
			btnWrap.appendChild(btn);
			
			var frameWrap = document.createElement('div');
			frameWrap.setAttribute('id', 'chatBoxFrameWrap');
			frameWrap.className = 'chatBoxFrameWrap';
			frameWrap.style.cssText = frameWrap._baseCSS = 'position:relative; display:block; height:0; padding:0 0 6px; margin:0 0 -3px; overflow:hidden; background:#111; border:2px solid #EEE; border-bottom:none; border-radius:3px; border-top-right-radius:0; -moz-border-radius:3px; -moz-border-radius-topright:0; -webkit-border-radius:3px; -webkit-border-top-right-radius:0; box-shadow:0 0 5px rgba(0,0,0,0.7); -webkit-box-shadow:0 0 5px rgba(0,0,0,0.7); -moz-box-shadow:0 0 5px rgba(0,0,0,0.7); -o-box-shadow:0 0 5px rgba(0,0,0,0.7); z-index:910;';
			baseInner.appendChild(frameWrap);
			
			var frame = document.createElement('iframe');
			frame.setAttribute('id', 'chatBoxFrame');
			frame.setAttribute('frameborder', '0');
			frame.style.cssText = 'position:relative; width:'+Math.round(document.body.offsetWidth/2)+'px; height:300px; margin:0; padding:0; background:#111; border:none; z-index:910;';
			frame.className = 'chatBoxFrame';
			frameWrap.appendChild(frame);
			
			base = btn = frame = null;
		},
		
		toggleChat : function(val) {
			self.chatOpen ? self.closeChat(true) : self.openChat(true);
		},
		
		openChat : function(slide) {
			var frame = lib.el('chatBoxFrame'),
				frameWrap = lib.el('chatBoxFrameWrap'),
				toggle = lib.el('chatBoxToggle');
			if (frame.getAttribute('src')!=='http://chat.a-os.org/') {
				frame.setAttribute('src', 'http://chat.a-os.org/');
			}
			self.chatOpen = true;
			lib.db.set('live_chat_open', self.chatOpen);
			frameWrap.style.WebkitTransition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.MozTransition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.transition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.height = frame.offsetHeight + 'px';
		},
		
		closeChat : function(slide) {
			var frame = lib.el('chatBoxFrame'),
				frameWrap = lib.el('chatBoxFrameWrap'),
				toggle = lib.el('chatBoxToggle');
			self.chatOpen = false;
			lib.db.set('live_chat_open', self.chatOpen);
			frameWrap.style.WebkitTransition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.MozTransition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.transition = slide===true ? 'height 0.5s ease' : '';
			frameWrap.style.height = '0';
		},
		
		checkInit : function() {
			if (self.initialized!==true) {
				if (document.getElementById && document.getElementById('header')) {
					self.init();
				}
				else {
					setTimeout(self.checkInit, 10);
				}
			}
		}
	};
	
	
	self.checkInit();
	lib.addEvent(window, 'DOMReady', self.init);
	lib.addEvent(window, 'load', self.init);
	lib.addEvent(window, 'unload', self.destroy);
})();

