var userAgent = navigator.userAgent.toLowerCase();
var js = { 
	isInit:false,
	pack: {},
	init: function() {
		if (js.isInit) {
			return;
		}
		js.browser = {
			version:	(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
			safari:		/webkit/.test(userAgent),
			opera:		/opera/.test(userAgent),
			msie:		/msie/.test(userAgent) && !/opera/.test(userAgent),
			mozilla:	/mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
		}
		
		js.$d = document;
		js.$ = function(o) { return typeof o == "object" ? o : document.getElementById(o) };
		js.$$ = function(name, o) { o = o||js.$d; return o.getElementsByTagName(name) };
		js.first = function(name, o) { return js.$$(name, o).item(0) };
		js.last = function(name, o) { var nl = js.$$(name, o); return nl.item(nl.length - 1) };
		js.html = document.documentElement;
		js.body = document.body;
		js.standardMode = (document.compatMode.toLowerCase() == "backcompat" ? false : true);
		js.property = function(o, p) { 
			o = js.$(o);
			return o && o[p] ? o[p] : false;  
		}
		js.addEvent = function(eType, callback, o, useCapture) { 
			useCapture = useCapture||false;
			if (o.addEventListener) o.addEventListener(eType.substring(2), callback, useCapture);
			else if (o.attachEvent) o.attachEvent(eType, function() { callback.apply(o) });
		}
		js.style = function(o, style) { return o.currentStyle ? o.currentStyle[style] : document.defaultView.getComputedStyle(o, "")[style] }
		js.appendObj = function(obj, appendedObj) {
			js.$(obj).appendChild(js.$(appendedObj));
		}
		js.appendText = function(obj, appendedText) {
			appendedText = js.$d.createTextNode(appendedText);
			js.appendObj(obj, appendedText);
		}
		js.replaceObj = function(obj, replacedObj, newObj) {
			js.$(obj).replaceChild(js.$(newObj), js.$(replacedObj));
		}
		js.replaceText = function(obj, replacedText) {
			for (var i = 0; i < obj.childNodes.length; i++) {
				obj.removeChild(obj.childNodes[i]);
			}
			js.appendText(obj, replacedText);
		}
		js.getClasses = function(obj) {
			return js.$(obj).className.split(/\s+/);
		}
		js.addClass = function(obj, className) {
			obj = js.$(obj);
			var classes = js.getClasses(obj);
			for (var i = 0; i < classes.length; i++) {
				if (classes[i] == className) {
					return;
				}
			}
			classes.push(className);
			obj.className = classes.join(" ");
		}
		js.replaceClass = function(obj, oldClass, newClass) {
			obj = js.$(obj);
			var classes = js.getClasses(obj);
			for (var i = 0; i < classes.length; i++) {
				if (classes[i] == oldClass) {
					classes[i] = newClass;
					break;
				}
			}	
			obj.className = classes.join(" ");		
		}
		js.toggleClass = function(obj, class1, class2) {
			var thisClasses = js.getClasses(obj);
			for (var i = 0; i < thisClasses.length; i++) {
				if (thisClasses[i] == class1) {
					js.replaceClass(obj, class1, class2);
					return;
				} else if (thisClasses[i] == class2) {
					js.replaceClass(obj, class2, class1);
					return;				
				}
			}
		}
		js.createElement = function(objName, attrs, text) {
			var obj = js.$d.createElement(objName);			
			if (typeof attrs == "object") {
				for (var i in attrs) { 
					if (i == "_class") {
						obj.className = attrs[i];
					} else {
						obj.setAttribute(i, attrs[i]); 
					}
				}
			}
			if (text) {
				js.appendText(obj, text);
			}
			return obj;
		}
		js.isDescendant = function(parentObj, obj) {
			for (var i = 0; i < parentObj.childNodes.length; i++) {
				if (parentObj.childNodes[i].nodeType == 1) {
					if (parentObj.childNodes[i] == obj || js.isDescendant(parentObj.childNodes[i], obj)) {
						return true;
					}
				}
			}
			return false;
		}
		js.setCookie = function(name, value, expInSec) {
			var c = name + "=" + escape(value) + ";path=/";
			if (expInSec) {
				c += " ;expires=" + new Date(expInSec * 1000).toGMTString();
			}
			js.$d.cookie = c;
		}
		for (var i in js.pack) { if (js.pack[i].init) js.pack[i].init(); js[i] = js.pack[i] }
		js.isInit = true;
	},
	register: function(name, obj) { 
		js.pack[name] = obj;
	}
};
