var d = document;
var Util = {
	Browser: {
		explorer: /*@cc_on!@*/false,
		opera: window.opera ? true : false,
		webkit: /Apple|KDE/i.test(navigator.vendor)
	},
	Debug: {
		log: function(t, m) {	if (window.console) { console[t](m); } else { alert(t + ': ' + m); } },
		dir: function(o) { if (window.console) { console.dir(o) } else { /* todo */ } },
		xml: function(o) { if (window.console) { console.dirxml(o) } else { alert(o.outerHTML); } }
	},
	Event : {
		common: function(e) {
			if (window.event && !window.opera) {
				e = window.event;
				e.target = e.srcElement;
			}
			return e;
		},
		addHandler: function(el, type, fn) {
			if (el == document && type == "ready") {
				var passedCallback = fn;
				if (Util.Event._readyCallbacks.length === 0) {
					var readyCall = Util.Event._readyCall;
					if (document.addEventListener) {
						document.addEventListener("DOMContentLoaded", readyCall, false);
					}
					if (Util.Browser.explorer) {
						document.write("<script id=__ie_onload defer src=//:><\/script>");
						document.getElementById("__ie_onload").onreadystatechange = function() {
							if (this.readyState == "complete") {
								readyCall();
							}
						};
					} else if (Util.Browser.webkit) {
						this._timer = setInterval(function() {
							if (/loaded|complete/.test(document.readyState)) {
								readyCall();
							}
						}, 10);
					}
					// force calling handler on window load; hack?
					el = window;
					type = "load";
					fn = readyCall;
				}
				Util.Event._readyCallbacks.push(passedCallback);
			} else {
				if (el.attachEvent) {
					el['e' + type + fn] = fn;
					el[type + fn] = function(){ el['e' + type + fn](window.event); }
					el.attachEvent('on' + type, el[type + fn]);
				} else {
					el.addEventListener(type, fn, false);
				}
			}
		},
		findElement: function(e, tagName, className) {
			var element = Util.Event.common(e).target;
			while (((element.tagName.toLowerCase() != tagName) || (element.tagName.toLowerCase() == tagName && (className && !Util.DOM.hasClass(element, className)))) && element.parentNode) {
				element = element.parentNode;
			}
			return element;
		},
		_readyCallbacks: [],
		_readyCall: function() {
			// make sure it's been called only once
			if (arguments.callee.done) {
				return;
			}
			arguments.callee.done = true;
			if (Util.Event._timer) {
				clearInterval(Util.Event._timer);
			}
			for (var i = 0; i < Util.Event._readyCallbacks.length; i++) {
				Util.Event._readyCallbacks[i]();
			}
			Util.Event._readyCallbacks = [];
		}
	},
	/**
	 * DOM access and manipulation.
	 */
	DOM: {
		getElementsByClassName : function(parentEl, className, tagName) {
			tagName = tagName || '*';
			var kids = parentEl.getElementsByTagName(tagName);
			var selectedKids = [];
			var len = kids.length;
			for (var i = 0; i < len; i++) {
				if (this.hasClass(kids[i], className)) {
					selectedKids.push(kids[i]);
				}
			}
			return selectedKids;
		},
		getFirstElementByClassName: function(parentEl, className, tagName) {
			tagName = tagName || '*';
			var kids = parentEl.getElementsByTagName(tagName);
			var len = kids.length;
			for (var i = 0; i < len; i++) {
				if (this.hasClass(kids[i], className)) {
					return kids[i];
				}
			}
			return false;
		},

		hasClass: function(el, className) {
			var c = " " + el.className + " ";
			if (c.indexOf(" " + className + " ") != -1) {
				return true;
			}
			return false;
		},

		addClass: function(el, className) {
			if (this.hasClass(el, className)) {
				return;
			}
			if (el.className == '') {
				el.className = className;
			} else {
				el.className = el.className + ' ' + className;
			}
		},

		removeClass: function(el, className) {
			el.className = el.className.replace(new RegExp('(^|\s)?' + className + '(\s|$)?'), '$1$2').replace(/\s{2,}/, " ");
		},

		replaceClass : function(el, oldClass, newClass) {
			removeClass(el, oldClass);
			addClass(el, newClass);
		},
		getStyle: function(el, property) {
			if (el && el.currentStyle) {
				// IE needs camelCase here
				var matches = property.match(/\-[a-z]/g);
				if (matches) {
					for (var i = 0; i < matches.length; i++) {
						property = property.replace(new RegExp(matches[i]), matches[i].substr(1, 1).toUpperCase());
					}
				}
				return eval('el.currentStyle.' + property);
			} else if (el) {
				return document.defaultView.getComputedStyle(el, "").getPropertyValue(property);
			}
		},
		prev: function(node) {
			var pS = node.previousSibling;
			while (pS && pS.nodeType != 1) { pS = pS.previousSibling; } return pS;
		},
		next: function(node) {
			var nS = node.nextSibling;
			while (nS && nS.nodeType != 1) { nS = nS.nextSibling; } return nS;
		},
		before: function(node, current) {
			current.parentNode.insertBefore(node, current);
		},
		prepend: function(node, current) {
			current.insertBefore(node, current.firstChild);
		}
	},
	// }}}
	// {{{ Basic Ajax functions
	Ajax: {
		get : function(url, readyCallback) {
			var request = new this._getRequest();
			request.onreadystatechange = function() {
				if (Util.Ajax._isReady(request)) {
					readyCallback(request);
				}
			}
			request.open("GET", url, true);
			request.send(null);
		},
		post: function(url, parameters, readyCallback) {
			var request = new this._getRequest();
			request.onreadystatechange = function() {
				if (Util.Ajax._isReady(request)) {
					readyCallback(request);
				}
			}
			request.open("POST", url, true);
			request.send(parameters);
		},
		_getRequest: function() {
			var request;
			if (window.XMLHttpRequest) {
				request = new XMLHttpRequest();
			} else {
				try {
					request = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						request = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {
						request = false;
					}
				}
			}
			return request;
		},
		_isReady: function(request) {
			if (request.readyState == 4 && request.status == 200) {
				return true;
			}
			return false;
		}
	},
	Cookie: {
		set: function(name, value, days) {
			var expire = '';
			if (days) {
				var date = new Date();
				date.setTime(date.getTime() + days*24*60*60*1000);
				expire = 'expires=' + date.toGMTString() + '; ';
			}
			document.cookie = name + '=' + escape(value) + '; ' + expire + 'path=/';
		},
		get: function(name) {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var c = cookies[i].replace(/^\s*(.*)\s*$/, '$1');
				var pair = c.split('=');
				if (pair[0] == name) {
					return unescape(pair[1] == undefined ? '' : pair[1]);
				}
			}
			return '';
		}
	}
}

/*var widget = {

	show: function (el) {
   	if (el) el.style.display = 'block';
	},

	hide: function (el) {
	  if (el) el.style.display = 'none';
	},


	center: function (el) {
    var scrolltop = document.documentElement.scrollTop;
	  var scrollleft = document.documentElement.scrollLeft;
	  var top = (document.documentElement.clientHeight/2) + scrolltop - (el.offsetHeight/2);
	  var left = (document.documentElement.clientWidth/2) + scrollleft - (el.offsetWidth/2);
	  el.style.left = Math.max(0, left) + 'px';
	  el.style.top = Math.max(0, top) + 'px';
	},
	
	getStyle: function(el,styleProp) {
		var x = document.getElementById(el);
		if (x.currentStyle)
			var y = x.currentStyle[styleProp];
		else if (window.getComputedStyle)
			var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
		return y;
	},

	window: {

		current: {
			scroll: null
		},
		
		layer: {},

		init: function () {
			if (widget.window.layer) {
        Util.DOM.addClass (widget.window.layer, 'window');
				var header = widget.window.layer.getElementsByTagName('h1')[0];
				if (header) {
					var cover = document.createElement('div');
					cover.className = 'cover';
					cover.style.height = header.offsetHeight + 'px';
					cover.style.width = (header.offsetWidth - 25) + 'px';
					header.parentNode.appendChild(cover);
					cover.onmousedown = widget.window.scrollwindow;
					cover.onmouseup = widget.window.noscrollwindow;
				}
			}
		},

		scrollwindow: function (evt) {
      var current_el = Util.Event.common(evt).target;
      widget.window.current.scroll = current_el;
			widget.window.layer.posx = (!evt ? event.clientX + document.documentElement.scrollLeft: evt.pageX) - widget.window.layer.offsetLeft;
			document.onmousemove = widget.window.scrolling;
			// nasty bug selecting contents of layer in IE:
			Util.Browser.explorer ? (document.selection = 0) : 0;

		},

		noscrollwindow: function (evt) {
		  var current_el = widget.window.current.scroll;
		  widget.window.current.scroll = null;
		  document.onmousemove = null;
		},

		scrolling: function (evt){
      var current_el = widget.window.current.scroll;//events.object(evt).target;
			//scrolltop = document.documentElement.scrollTop;
			if (!evt) {
				tempX = event.clientX + document.documentElement.scrollLeft;
				tempY = event.clientY + document.documentElement.scrollTop;
				//clientH = document.body.clientHeight;
			} else { // if FF
				tempX = evt.pageX;
				tempY = evt.pageY;
				//clientH = document.documentElement.clientHeight;
			}
    	// new x and y value
			//if(tempX < (document.documentElement.clientWidth-240) && tempX > 200){
    	if ((current_el.nodeName.toLowerCase() == 'div') && (current_el.className == 'cover')) {
				widget.window.layer.style.left = tempX - widget.window.layer.posx + 'px';
				var offset = 0;
				Util.Browser.explorer ? (offset = 24) : (offset = 12);
       	widget.window.layer.style.top = tempY - (current_el.scrollHeight) - offset + 'px';
			}
		}
	}

} */

