/* dom.js - by Thomas Kjoernes <thomas@ipv.no> */

if (!window.XMLHttpRequest) {
	window.XMLHttpRequest = function() {
		var msxmls = ["Msxml2.XMLHTTP",	"Microsoft.XMLHTTP"];
		for (var i=0; i<msxmls.length; i++) {
			try {
				return new ActiveXObject(msxmls[i]);
			} catch (e) { }
		}
		return null;
	};
}

function openDialog(url, args, settings, name, modal) {
	var winref = null;
	if (!settings) settings = {};
	if (!settings.width) settings.width = 400;
	if (!settings.height) settings.height = 300;
	if (name) settings.name = name;
	if (modal) settings.modal = modal;
	if (settings.center == null) settings.center = true;
	if (settings.modal && window.showModalDialog) {
		var features =
			(settings.top ? ("dialogTop:" + settings.top + ";") : "") +
			(settings.left ? ("dialogLeft:" + settings.left + ";") : "") +
			"dialogWidth:" + settings.width + "px;" +
			"dialogHeight:" + settings.height + "px;" +
			"center:" + (settings.center ? "yes" : "no") + ";" +
			"status:" + (settings.statusbar ? "yes" : "no") + ";" +
			"resizable:" + (settings.resizable ? "yes" : "no") + ";" +
			"scroll:" + (settings.scrollbars ? "yes" : "no");
		winref = window.showModalDialog(url, args, features);
	} else {
		if (settings.center) {
			if (settings.top == null) settings.top = Math.floor((screen.availHeight-settings.height)/2);
			if (settings.left == null) settings.left = Math.floor((screen.availWidth-settings.width)/2);
		}
		features =
			(settings.top ? ("top=" + settings.top + ",") : "") +
			(settings.left ? ("left=" + settings.left + ",") : "") +
			"width=" + settings.width + "," +
			"height=" + settings.height + "," +
			"menubar=no,toolbar=no,location=no," +
			"status=" + (settings.statusbar ? "yes" : "no") + "," +
			"resizable=" + (settings.resizable ? "yes" : "no") + "," +
			"scrollbars=" + (settings.scrollbars ? "yes" : "no") +
			(settings.modal ? ",modal=yes" : "");
		winref = window.open(url, name, features);
		if (winref) {
			winref.dialogArguments = args;
			winref.returnValue = null;
		}
	}
	return winref;
}

function loadScript(src, type, id, legacy) {
	if (!type) type = "text/javascript";
	if (!id) id = src.replace("/", "_");
	if (!legacy) {
		var head = document.getElementsByTagName("head")[0];
		var script = document.getElementById(id);
		if (!script) {
			script = document.createElement("script");
			script.id = id;
			script.src = src;
			script.type = type;
			head.appendChild(script);
		} else {
		}
	} else {
		document.write("<script id=\"" + id + "\" type=\"" + type + "\" src=\"" + src + "\"></script>");
	}
	return id;
}

function unloadScript(id) {
	var script = document.getElementById(id);
	if (script && script.nodeName.toLowerCase() === "script") {
		script.parentNode.removeChild(script);
	}
}

function loadStyleSheet(href, type, rel, id, legacy) {
	if (!type) type = "text/css";
	if (!rel) rel = "stylesheet";
	if (!id) id = href.replace("/", "_");
	if (!legacy) {
		var link = null;
		if (id) link = document.getElementById(id);
		if (!link) {
			var head = document.getElementsByTagName("head")[0];
			var link = document.createElement("link");
		}
		link.href = href;
		link.type = type;
		link.rel = rel;
		link.id = id;
		head.appendChild(link);
	} else {
		document.write("<link id=\"" + id + "\" rel=\"" + rel + "\" type=\"" + type + "\" href=\"" + href + "\"></link>");
	}
	return id;
}

function unloadStyleSheet(id) {
	var link = document.getElementById(id);
	if (link && link.nodeName.toLowerCase() === "link") {
		link.parentNode.removeChild(link);
	}
}

function preventDefault(e) {
	if (!e) e = window.event;
	if (e.preventDefault) e.preventDefault();
	e.returnValue = false;
}

function stopPropagation(e) {
	if (!e) e = window.event;
	if (e.stopPropagation) e.stopPropagation();
	e.cancelBubble = true;
}

function appendChild(element, parentNode) {
	if (element) {
		var parentNode = parentNode || document.getElementsByTagName("body")[0];
		parentNode.appendChild(element);
	}
}

function insertChild(element, parentNode) {
	if (element && parentNode) {
		if (parentNode.firstChild) {
			parentNode.insertBefore(element, parentNode.firstChild);
		} else {
			parentNode.appendChild(element);
		}
	}
}

function insertBefore(element, siblingNode) {
	if (element && siblingNode) {
		siblingNode.parentNode.insertBefore(element, siblingNode);
	}
}

function insertAfter(element, siblingNode) {
	if (element && siblingNode) {
		if (siblingNode.nextSibling) {
			siblingNode.parentNode.insertBefore(element, siblingNode.nextSibling);
		} else {
			siblingNode.parentNode.appendChild(element);
		}
	}
}

if (!window.getComputedStyle) {
	window.getComputedStyle = function(element) {
		return element.currentStyle;
	};
}

function getViewportProperties() {
	var viewport = {};
	if (self.innerHeight) {
		viewport.innerWidth = self.innerWidth;
		viewport.innerHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		viewport.innerWidth = document.documentElement.clientWidth;
		viewport.innerHeight = document.documentElement.clientHeight;
	} else if (document.body) {
		viewport.innerWidth = document.body.clientWidth;
		viewport.innerHeight = document.body.clientHeight;
	}
	if (self.pageYOffset) {
		viewport.scrollLeft = self.pageXOffset;
		viewport.scrollTop = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop != null) {
		viewport.scrollLeft = document.documentElement.scrollLeft;
		viewport.scrollTop = document.documentElement.scrollTop;
	} else if (document.body)	{
		viewport.scrollLeft = document.body.scrollLeft;
		viewport.scrollTop = document.body.scrollTop;
	}
	if (document.body.scrollHeight > document.body.offsetHeight) {
		viewport.scrollWidth = document.body.scrollWidth;
		viewport.scrollHeight = document.body.scrollHeight;
	} else {
		viewport.scrollWidth = document.body.offsetWidth;
		viewport.scrollHeight = document.body.offsetHeight;
	}
	return viewport;
}

function getClientPosition(e) {
	if (!e) e = window.event;
	if (typeof e.pageX === "number") {
		var x = e.pageX;
		var y = e.pageY;
	} else if ( typeof e.clientX === "number") {
		var x = e.clientX;
		var y = e.clientY;
		if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
			x += document.body.scrollLeft;
			y += document.body.scrollTop;
		} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
			x += document.documentElement.scrollLeft;
			y += document.documentElement.scrollTop;
		}
	}
	return { x:x, y:y };
}

function getElementPosition(element) {
	var x = 0;
	var y = 0;
	while (element) {
		y += element.offsetTop;
		x += element.offsetLeft;
		element = element.offsetParent;
	}
	return { x:x, y:y };
}

function hasClass(element, className) {
	if (element && className) {
		var classNames = (element.className) ? element.className.split(" ") : [];
		var l = classNames.length;
		for (var i=0; i<l; i++) {
			if (classNames[i] === className) return true;
		}
	}
}

function addClass(element, className) {
	if (element && className) {
		var classNames = (element.className) ? element.className.split(" ") : [];
		if (!hasClass(element, className)) classNames.push(className);
		element.className = classNames.join(" ");
		return element.className;
	}
}

function setClass(element, className) {
	if (element) {
		var oldClass = element.className;
		element.className = (className ? className : "");
		return oldClass;
	}
}

function replaceClass(element, className, newClassName) {
	if (element && className) {
		if (!newClassName) newClassName="";
		var replaced = false;
		var classNames = (element.className) ? element.className.split(" ") : [];
		var l = classNames.length;
		for (var i=0; i<l; i++) {
			if (classNames[i] === className) {
				classNames[i] = newClassName;
				replaced = true;
			}
		}
		if (!replaced) classNames.push(newClassName);
		element.className = classNames.join(" ");
		return element.className;
	}
}

function removeClass(element, className) {
	if (element && className) {
		var classNames = (element.className) ? element.className.split(" ") : [];
		var l = classNames.length;
		for (var i=0; i<l; i++) {
			if (classNames[i] === className) {
				classNames.splice(i,1);
				element.className = classNames.join(" ");
				break;
			}
		}
		return element.className;
	}
}

function getAllCookies(filter) {
	var cookies = {};
	var regexp = new RegExp("^" + (filter||"").replace(/([\\\^\$+[\]{}.=!:(|)])/g, "\\$1").replace(/\*/g, ".*").replace(/\?/g, ".") + "$");
	var temp = document.cookie.split(";");
	for(var i=0; i<temp.length;i++) {
		var cookie = (temp[i]||"").replace(/^[\s]+/g, "");
		var j = cookie.indexOf("=");
		var name = cookie.substring(0,j);
		var value = cookie.substring(j+1);
		if (!filter || regexp.test(name)) {
			cookies[name] = value;
		}
	}
	return cookies;
}

function getCookie(name) {
	var cookies = getAllCookies();;
	for(var i in cookies) {
		if (i === name) return cookies[i];
	}
	return null;
}

function setCookie(name, value, duration, path) {
	var expires = new Date();
	expires.setTime(expires.getTime() + (duration*60*1000));
	document.cookie = name + "=" + value + (duration ? "; expires=" + expires.toGMTString() : "") + "; path=" + (path||"/");
}

function removeCookie(name) {
	setCookie(name, null, -1);
}

function removeAllCookies() {
	var cookies = getAllCookies();;
	for(var i in cookies) {
		removeCookie(i);
	}
}

