/**
 *
 */
(function() {
	function preventDefault() { this.returnValue = false; }
	function stopPropagation() { this.cancelBubble = true; }

	var obscurelighty = {
		currentHRef : '',
		timer : null,
		ajaxEvents : {},
		options : { 
			dynHref: true,
			scrollAnimation: true
		},
		anim : null,

		init : function() {
			var t = this;
			t.initLinks();
			t.timer = setInterval( function(){ t.periodical(); }, 500 );
		},
		hasClass : function(o,n) {
			if(o.className == '' ) return false;
			var reg = new RegExp("(^|\\s+)"+n+"(\\s+|$)");
			return reg.test(o.className);
		},
		addClass : function(o,n) {
			if( !obscurelight.hasClass(o,n) ) {
				if( o.className == '' ) {
					o.className = n;
				} else {
					o.className += ' '+n;
				}
			}
		},
		trim : function(s) {
			return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');
		},
		removeClass : function(e, c) {
			var t = this;
			if( t.hasClass(e,c) ) {
				var cn = ' ' + e.className + ' ';
				e.className = t.trim(cn.replace(' '+c+' ',' '));
			}
		},
		addEvent : function(d,e,f) {
			if( d.attachEvent )
				d.attachEvent('on' + e, f);
			else if (d.addEventListener)
				d.addEventListener(e, f, false);
			else
				d['on' + e] = f;
			return f;
		},
		removeEvent : function(d,e,f) {
			try {
				if( d.detachEvent )
					d.detachEvent('on' + e, f);
				else if( d.removeEventListener)
					d.removeEventListener(e, f, false);
				else
					d['on' + e] = null;
			} catch(e) {}
		},
		cancelEvent : function(e) {
			if( !e )
				return false;
			if(e.stopPropagation)
				e.stopPropagation();
			else
				 e.cancelBubble = true;
			if( e.preventDefault )
				e.preventDefault();
			else
				e.returnValue = false;
			return false;
		},
		fireAjax : function(name,params) {
			var t = this;
			if( t.ajaxEvents[name] !== undefined ) {
				var ev;
				for(var e in t.ajaxEvents[name]) {
					if( e != '_id' ) {
						ev = t.ajaxEvents[name][e];
						ev(params);
					}
				}
			}
		},
		registerAjax : function(name, fct) {
			var t = this;
			if( t.ajaxEvents[name] === undefined ) {
				t.ajaxEvents[name] = {'_id':0};
			}
			var id = t.ajaxEvents[name]['_id'];
			t.ajaxEvents[name]['_id'] += 1;
			t.ajaxEvents[name][id] = fct;
			return id;
		},
		unregisterAjax : function(name, id) {
			if( t.ajaxEvents[name] === undefined )
				return false;
			if( t.ajaxEvents[name][id] === undefined )
				return false;
			t.ajaxEvents[name][id] = null;
			return true;
		},
		evalJSON : function(text, secure) {
			if( typeof(text) != "string" || !text.length) return null;
			if( secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(text.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
			return eval('(' + text + ')');
		},
		getXHR : function() {
			var xhr = null, w = window;
			if (w.XMLHttpRequest || w.ActiveXObject) {
				if (w.ActiveXObject) {
					try {
						xhr = new ActiveXObject("Microsoft.XMLHTTP");
					} catch(e) {}
				} else
					xhr = new w.XMLHttpRequest();
			}
			return xhr;
		},
		xRequest: function(url, options, cb, cbError) {
			var t = this, xhr = t.getXHR();
			if(!options) options = {};
			options.mode = options.mode || 'GET';

			xhr.onreadystatechange = function() {
				if( xhr.readyState == 4 ) {
					if( xhr.status == 200 || !cbError ) {
						cb(xhr,options.params);
					} else {
						cbError(xhr,options.params);
					}
				}
			}
			xhr.open(options.mode, url, true);
			if( options.mode == 'POST' ) {
				xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			}
			xhr.send( options.data );
		},
		getFormData : function(target) {
			var t = this, d = document, ret = '', e = null;
			if( typeof(target) == 'string' )
				target = document.getElementById(target);
			if( target === undefined )
				target = document;
			var typelist = ['input','select','textarea'];
			for(var t in typelist ) {
				t = typelist[t];
				var inputs = target.getElementsByTagName(t);
				for(var i = inputs.length - 1; i >= 0; i--) {
					if( inputs[i].name && !inputs[i].disabled ) {
						var evalue = inputs[i].value, etype = '';
						if( t == 'input' )
							etype = inputs[i].type.toLowerCase();
						if( etype == 'radio' && !inputs[i].checked )
							evalue = null;
						if( (etype != 'file' && etype != 'submit') && evalue != null ) {
							if( ret != '' ) ret += '&';
							ret += encodeURI(inputs[i].name) + '=' + encodeURIComponent(evalue);
						}
					}
				}
			}
			return ret;
		},
		periodical : function() {
			var t = this;
			if( t.options.dynHref )
				t.updateHRef();
		},
		updateHRef : function() {
			var href = window.location.hash.substring(1);
			if( href != this.currentHRef ) {
				this.currentHRef = href;
				this.update(this.currentHRef, 'content', ['content','title']);
			}
		},
		initLinks : function(target) {
			var t = this;
			if( typeof(target) == 'string' )
				target = document.getElementById(target);
			if( target === undefined || target == null )
				target = document;
			var elements = target.getElementsByTagName("a");
			for( var i = elements.length - 1; i >= 0; i-- ) {
				if( t.hasClass(elements[i], "dal") ) {
					t.removeClass(elements[i],'dal');
					var rel = elements[i].rel;
					if( !t.options.dynHref && rel == "" )
						rel = "content";
					if( rel == "" || !document.getElementById(rel) ) {
						var hr = elements[i].getAttribute('href');
						if( hr.indexOf("http://") == 0 || hr.indexOf("https://") == 0 ) {
							hr = elements[i].getAttribute('href',2);
						}
						elements[i].href = "/#" + hr.replace(/^\//,'').replace(/\.html/,"");
					} else {
						elements[i].onclick = function(){ t.update(this.href,this.rel); return false; };
					}
				} else {
					var aref = elements[i].getAttribute('href');
					if( t.options.dynHref && aref && aref.indexOf("#") == 0 && elements[i].rel == "" ) {
						var aref = aref.substring( 1 );
						if( aref.length > 0 ) {
							elements[i].href = "#";
							elements[i].dest = aref;
							elements[i].onclick = function(){ t.scrollTo(this.dest,t.options.scrollAnimation); return false; };
						}
					}
				}
			}
			elements = target.getElementsByTagName("form");
			for(var i = elements.length - 1; i >= 0; i-- ) {
				if( this.hasClass(elements[i], "dfl") ) {
					this.removeClass(elements[i], 'dfl');
					elements[i].onsubmit = function(){ t.update(this.getAttribute('action'), 'content', ['_form','_href','content','title']); return false; };
				}
			}
		},
		update : function(page, target, options, data) {
			var d = document, w = window, t = this;
			var params = 'ajax', xhrMode = 'GET', xhrData = '', setCurHRef = false;
			var xhr = this.getXHR();
			t.fireAjax("loading");

			if( data !== undefined ) {
				xhrData += data;
			}
			if( typeof(target) == "string" ) {
				target = d.getElementById(target);
			}

			if( page.indexOf('?') === -1 ) {
				params = '?ajax';
			} else {
				params = '&ajax';
			}
			if( options !== undefined ) {
				var p = '=';
				for(var e in options) {
					switch(options[e]) {
						case 'content':
							p += 'CONTENT,';
							break;
						case 'title':
							p += 'PAGE:TITLE,';
							break;
						case '_form':
							xhrData += this.getFormData(target);
						case '_post':
							xhrMode = 'POST';
							break;
						case '_href':
							setCurHRef = true;
							break;
					}
				}
				if( p != '=' ) {
					params += p.substr(0, p.length - 1);
				}
			}
			if( xhrData == '' ) xhrData = null;

			xhr.onreadystatechange = function() {
				if( xhr.readyState == 4 ) {
					if( xhr.status == 200 || (xhr.status == 0 && xhr.responseText.length > 0)) {
						if( options !== undefined ) {
							data = t.evalJSON(xhr.responseText);
							t.updateElem(target, data.CONTENT);
							if( data.TITLE !== undefined )
								document.title = data.TITLE;
							if( setCurHRef ) {
								t.currentHRef = page.substring(1);
								window.location.hash = t.currentHRef;
							}
						} else {
							t.updateElem(target, xhr.responseText);
						}
						t.initLinks(target);
					} else {
						t.updateElem(target, 'Error while fetching content...');
					}
					t.fireAjax("loaded");
				}
			}
			xhr.open(xhrMode, page+params, true);
			if( xhrMode == 'POST' ) {
				xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			}
			xhr.send(xhrData);
		},
		updateElem : function(elem, data) {
			var d = document, w = window;
			if( typeof(elem) == 'string' )
				elem = d.getElementById(elem);

			var scripts = '';
			var text = data.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
				scripts += code + '\n';
				return '';
			});
			elem.innerHTML = text;

			if( scripts != '' ) {
				var script = d.createElement('script');
				script.setAttribute('type', 'text/javascript');
				script.text = scripts;
				d.head.appendChild(script);
				d.head.removeChild(script);
			}
		},
		headerLoad : function(name) {
			var t = this, d = document, elem = null, li = name.lastIndexOf(".");
			if( li <= 0 ) return;
			var ext = name.substring(li);
			switch( ext ) {
				case ".js":
					elem = d.createElement("script");
					elem.setAttribute("type", "text/javascript");
					elem.setAttribute("src", name);
					break;
				case ".css":
					elem = d.createElement("link");
					elem.setAttribute("rel", "stylesheet");
					elem.setAttribute("type", "text/css");
					elem.setAttribute("href", name);
					break;
			}
			if( elem ) {
				d.getElementsByTagName("head")[0].appendChild(elem);
			}
		},
		headerUnload: function(name) {
			var strict = false, sname = name, li = name.indexOf("?");
			if( li > 0 ) {
				strict = true;
				sname = name.substring(0,li);
			}
			li = sname.lastIndexOf(".");
			if( li <= 0 ) return;
			
			var tag = null, attr = null, tmp = sname.substring(li);
			switch( tmp ) {
				case ".js":
					tag = "script";
					attr = "src";
					break;
				case ".css":
					tag = "link";
					attr = "href";
					break;
			}
			if( tag ) {
				var elems = document.getElementsByTagName(tag);
				for( var i = elems.length - 1; i>= 0; i-- ) {
					if( elems[i].getAttribute(attr) != null ) {
						tmp = elems[i].getAttribute(attr);
						if( !strict ) {
							li = tmp.indexOf("?");
							if( li > 0 )
								tmp = tmp.substring(0,li);
						}
						if( tmp == name )
							elems[i].parentNode.removeChild( elems[i] );
					}
				}
			}
		},
		ease : function(v) {
			return 1+Math.pow(v-1,3);
		},
		easeInOut : function(t,s,dt,du) {
			return dt/2 * (1 - Math.cos(Math.PI*t/du)) + s;
		},
		scrollTo : function(name,anim) {
			var t = this, d = document, w = window;
			var elem = d.getElementById(name);
			if( !elem )
				return;
			if(!anim) {
				window.scrollTo(0, elem.offsetTop);
			} else {
				if( t.anim && t.anim.timer ) {
					clearInterval( t.anim.timer );
				}
				t.anim = { timer: null, s: null, dt: 0, du: 500, t: 0, inc: 10 }
				if( w.scrollY )
					t.anim.s = w.scrollY;
				else if( d.documentElement.scrollTop )
					t.anim.s = d.documentElement.scrollTop;
				else
					t.anim.s = d.body.scrollTop;
				t.anim.dt = elem.offsetTop - t.anim.s;
				t.anim.timer = setInterval( function() {
					var o = window.obscurelighty, a = o.anim;
					if( a && a.timer ) {
						a.t += a.inc;
						if( a.t < a.du ) {
							window.scrollTo(0, o.easeInOut(a.t,a.s,a.dt,a.du) );
						} else {
							window.scrollTo(0, a.s+a.dt);
							clearInterval(a.timer);
							a.timer = null;
						}
					}
				}, t.anim.inc );
			}
		}
	};

	window.obscurelighty = obscurelighty;
	obscurelighty.addEvent(window, 'load', function(){ window.obscurelighty.init(); } );
})();

