function isFunction(a) {
    return typeof a == 'function';
}

function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}

function isArray(a) {
    return isObject(a) && a.constructor == Array;
}

function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window, "unload", EventCache.flush);

function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = "*";
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf(";", len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+"="+escape( value ) +
		( ( expires ) ? ";expires="+expires_date.toGMTString() : "" ) + //expires.toGMTString()
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + "=" +
			( ( path ) ? ";path=" + path : "") +
			( ( domain ) ? ";domain=" + domain : "" ) +
			";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function findPos(obj)
{
	var curleft = curtop = 0;
	if (obj.offsetParent)
	{
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft, curtop];
}

function dropShadow(element)
{
	var ePos = findPos(element);

	var dup = element.cloneNode(1);
	dup.style.zIndex = dup.style.zIndex + 1;
	dup.style.position = "absolute";
	dup.style.background = "transparent";
	dup.style.left = (ePos[0] - 1) + "px";
	dup.style.top = (ePos[1] - 1) + "px";
	dup.style.margin = 0;

	element.style.color = "gray";

	element.parentNode.insertBefore(dup, element);
}

// Beautify H2 support

var defaultH2Colors = new Array("#74acda", "#f8972c", "#87c53b");
var defaultH2Bullets = new Array("template/DS1Res/bullet-blue12.gif",
	"template/DS1Res/bullet-orange.gif",
	"template/DS1Res/bullet-green.gif");
function initPrettyH2(colors, bullets) {
	if (!isArray(colors))
		colors = defaultH2Colors;
	if (!isArray(bullets))
		bullets = defaultH2Bullets;

	var h2s = document.getElementsByTagName("h2");
	var todrop = new Array();

	for (var i = 0; i < h2s.length; i++)
	{
		var h2 = h2s[i];

		h2.style.color = colors[i % colors.length];
		insertBullet(h2, bullets[i % bullets.length]);
	}
}

function updateh2()
{
	var h2s = document.getElementsByTagName("h2");
	for (var i = 0; i < h2s.length; i++)
	{
		var h2 = h2s[i];
		var pos = h2.style.position;
		if (pos != "absolute")
			continue;

		var ref = h2.nextSibling;
		if (ref.nodeName.toLowerCase() == "h2")
		{
			if (ref.style.position == "absolute") // something's gone wrong
				continue;
			i++;
			
			var ePos = findPos(ref);
			h2.style.left = (ePos[0] - 1) + "px";
			h2.style.top = (ePos[1] - 1) + "px";
		}
	}
}

function insertBullet(element, bullet)
{
	element.innerHTML = "&nbsp;" + element.innerHTML;
	var img = document.createElement("img");
	img.setAttribute("src", bullet);
	element.insertBefore(img, element.firstChild);
}

// Back to top support

function initBackToTop()
{
	var elem = document.getElementById("ReturnToTop");
	if (!elem)
		return;

	elem.style.left = "0px";
	elem.style.position = "absolute";
	elem.style.zIndex = 100;

	updateBackToTop();

	addEvent(window, "scroll", updateBackToTop);
	addEvent(window, "resize", updateBackToTop);
}

function updateBackToTop()
{
	var whp = getWHP();
	var elem = document.getElementById("ReturnToTop");

	if (whp[2] < 10)
		elem.style.visibility = "hidden";
	else
	{
		elem.style.visibility = "visible";
		elem.style.left = '2px';
		elem.style.top = (whp[2] + whp[1] - elem.offsetHeight - 2) + "px";
	}
}

// Get Width, Height, Position
function getWHP()
{
	if (document.all)
	{
		h = document.documentElement.clientHeight;
		w = document.documentElement.clientWidth;
		p = document.documentElement.scrollTop;
		if (h == 0)
		{
			p = document.body.scrollTop;
			h = document.body.clientHeight;
			w = document.body.clientWidth;
		}
	}
	else if (document.getElementById)
	{
		h = window.innerHeight;
		w = window.innerWidth;
		p = window.pageYOffset;
	}

	return [w, h, p];
}

function gotoTop()
{
	window.scroll(0,0);
}


