var bodyloadfunctions = new Array();

function bodyloadfunction(fn)
{
	bodyloadfunctions.push(fn);
}

function dobodyloadfunctions()
{
	if (window.bodyload_done) {
		return;
	}
	window.bodyload_done = true;
	for (var i = 0; i < bodyloadfunctions.length; i++) {
		var fn = bodyloadfunctions[i];
		fn();
	}
}

function bodyload_timer()
{
	if (window.bodyload_done) {
		return;
	}

	if(/KHTML|WebKit/i.test(navigator.userAgent)) {
		if(/loaded|complete/.test(document.readyState)) {
			dobodyloadfunctions();
		} else {
			window.setTimeout("bodyload_timer()", 250);
		}
	}
}
setTimeout("bodyload_timer()", 250);

// event listener for compliant browsers
if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", dobodyloadfunctions, false);
} else if (isIE) {
	// ah, well...
	document.write('<script id="__ie_onload" defer src="//:"><\/script>');
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if (this.readyState == "complete") {
			dobodyloadfunctions();
		}
	};
	script = null;
}

/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 * Script featured on Dynamic Drive (http://www.dynamicdrive.com) 12.08.2005
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************/

var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
	{
		o.onmousedown	= Drag.start;

		o.hmode			= bSwapHorzRef ? false : true ;
		o.vmode			= bSwapVertRef ? false : true ;

		o.root = oRoot && oRoot != null ? oRoot : o ;

		if (o.hmode  && isNaN(parseInt(o.root.style.marginLeft  ))) o.root.style.marginLeft   = "0px";
		if (o.vmode  && isNaN(parseInt(o.root.style.marginTop   ))) o.root.style.marginTop    = "0px";
		if (!o.hmode && isNaN(parseInt(o.root.style.marginRight ))) o.root.style.marginRight  = "0px";
		if (!o.vmode && isNaN(parseInt(o.root.style.marginBottom))) o.root.style.marginBottom = "0px";

		o.minX	= typeof minX != 'undefined' ? minX : null;
		o.minY	= typeof minY != 'undefined' ? minY : null;
		o.maxX	= typeof maxX != 'undefined' ? maxX : null;
		o.maxY	= typeof maxY != 'undefined' ? maxY : null;

		o.xMapper = fXMapper ? fXMapper : null;
		o.yMapper = fYMapper ? fYMapper : null;

		o.root.onDragStart	= new Function();
		o.root.onDragEnd	= new Function();
		o.root.onDrag		= new Function();
	},

	start : function(e)
	{
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		var y = parseInt(o.vmode ? o.root.style.marginTop  : o.root.style.marginBottom);
		var x = parseInt(o.hmode ? o.root.style.marginLeft : o.root.style.marginRight );
		o.root.onDragStart(x, y);

		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY;

		if (o.hmode) {
			if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
			if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		} else {
			if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
			if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
		}

		if (o.vmode) {
			if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
			if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
		} else {
			if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
			if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
		}

		document.onmousemove	= Drag.drag;
		document.onmouseup		= Drag.end;

		return false;
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var o = Drag.obj;

		var ey	= e.clientY;
		var ex	= e.clientX;
		var y = parseInt(o.vmode ? o.root.style.marginTop  : o.root.style.marginBottom);
		var x = parseInt(o.hmode ? o.root.style.marginLeft : o.root.style.marginRight );
		var nx, ny;

		if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
		if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
		if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
		if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);

		nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
		ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));

		if (o.xMapper)		nx = o.xMapper(y)
		else if (o.yMapper)	ny = o.yMapper(x)

		Drag.obj.root.style[o.hmode ? "marginLeft" : "marginRight"] = nx + "px";
		Drag.obj.root.style[o.vmode ? "marginTop" : "marginBottom"] = ny + "px";
		Drag.obj.lastMouseX	= ex;
		Drag.obj.lastMouseY	= ey;

		Drag.obj.root.onDrag(nx, ny);
		return false;
	},

	end : function()
	{
		document.onmousemove = null;
		document.onmouseup   = null;
		Drag.obj.root.onDragEnd(	parseInt(Drag.obj.root.style[Drag.obj.hmode ? "marginLeft" : "marginRight"]), 
									parseInt(Drag.obj.root.style[Drag.obj.vmode ? "marginTop" : "marginBottom"]));
		Drag.obj = null;
	},

	fixE : function(e)
	{
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};

var drags = new Object();

function init_scrollbars()
{
	var divs = document.getElementsByTagName('DIV');
	for (var i = 0; i < divs.length; i++) {
		if (divs[i].className && divs[i].className.indexOf('scrollbar ') != -1) {
			init_scrollbar(divs[i]);
		}
	}
}

function init_scrollbar(el)
{
	var sc = null;
	for (var i = 0; i < el.childNodes.length; i++) {
		var c = el.childNodes[i];
		if (c.tagName && c.className && c.className.indexOf('scrollbar-container') != -1) {
			sc = c;
			break;
		}
	}
	if (!sc) {
		return false;
	}
	var horizontal = el.className.indexOf('scrollbar-horizontal') != -1;
	el.className += ' scrollbar-pimped';
	// find first child which is an HTML node
	var fc = null;
	for (var i = 0; i < sc.childNodes.length; i++) {
		var tmp = sc.childNodes[i];
		if (tmp.tagName && tmp.style) {
			fc = tmp;
			break;
		}
	}
	/*
	if (!fc || (!horizontal && fc.offsetHeight < el.offsetHeight) || (horizontal && fc.offsetWidth < el.offsetWidth)) {
		// no need here... just remove ugly HTML-scrollbars
		return false;
	}
	*/
	sc.style.width = (horizontal ? Math.max(sc.offsetHeight - (sc.className.match(/( box|box )/) ? 30 : 0), fc.offsetWidth) : fc.offsetWidth) - (horizontal ? 0 : (isIE6 ? 21 : 18)) + 'px';
	sc.style.height = (horizontal ? fc.offsetHeight : Math.max(sc.offsetHeight - (sc.className.match(/( box|box )/) ? 30 : 0), fc.offsetHeight)) + 'px';

	var sbs = document.createElement('DIV');
	sbs.className = 'scrollbarscroll';
	if (el.className.match(/thumbs/)) {
		sbs.style.width = el.offsetWidth - (isIE6 ? 12 : 8) + 'px'; // ignore padding
		if (isIE6) { // some correction, prolly because of the negative margins or summink
			el.style.width = el.offsetWidth - 8 + 'px';
		}
	}
	var sbc = document.createElement('DIV');
	sbc.className = 'scrollbarcanvas';
	if (!horizontal) {
		sbs.style.height = el.offsetHeight + 'px';
		sbc.style.height = (el.offsetHeight - 8) + 'px';
	}
	sbs.appendChild(sbc);
	if (el.className.indexOf('scrollbar-bottom') == -1) {
		el.insertBefore(sbs, el.firstChild);
	} else {
		el.appendChild(sbs);
	}
	var sbsc = document.createElement('SPAN'); // the scroller
	sbsc.className = 'scrollbarscroller';
	var maxx = 0;
	var maxy = 0;
	sbc.appendChild(sbsc);
	// generate random id
	sbsc.id = md5(fc.innerHTML) + Math.random(0,9999);
	if (horizontal) {
		var wm = (el.offsetWidth - 4) / sc.offsetWidth;
		sbsc.style.width = Math.max(16, parseInt(sbc.offsetWidth * wm)) + 'px';
		maxx = sbc.offsetWidth - sbsc.offsetWidth;
	} else {
		var wm = el.offsetHeight / sc.offsetHeight;
		sbsc.style.height = Math.max(16, parseInt(sbc.offsetHeight * Math.min(wm, 1))) + 'px';
		maxy = sbc.offsetHeight - sbsc.offsetHeight;
	}

	Drag.init(sbsc, null, 0, maxx, 0, maxy);
	drags[sbsc.id] = {'c': fc, 'wm': wm};
	sbsc.onDrag = function(x, y) {
		if (horizontal) {
			fc.style.marginLeft = Math.ceil(-(x / drags[this.id].wm)) + 'px';
		} else {
			fc.style.marginTop = Math.ceil(-(y / drags[this.id].wm)) + 'px';
		}
	};
}

function flash_run(id, width, height, url, params, extrastyle)
{
	document.write('<object id="' + id + '" type="application/x-shockwave-flash" ' + 'data ="' + url + '" ');
	if (width || height || checkIE) { // ie seems to require width and height, even if they're empty. wtf?
		document.write('style="');
		if (width) {
			document.write('width: ' + width + 'px;');
		}
		if (height) {
			document.write('height: ' + height + 'px;');
		}
		if (extrastyle) {
			document.write(' ' + extrastyle);
		}
		document.write('">');
	}
	document.write('<param name="movie" value="' + url + '">' + flash_build_params(params) + '</object>');
}

function flash_build_params(params)
{
	var html = new Array();
	for (name in params) {
		html.push('<param name="' + name + '" value="' + params[name] + '">');
	}
	return html.join('');
}

var WinNum=0;
function WindowOpen(Url,x,y)
{
var String;
String = "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=auto,resizable=1,copyhistory=0,";
String += ",width=";
String += x;
String += ",height=";
String += y;

WinPic=window.open(Url,WinNum++,String);
}

/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

var md5 =  function(string)
{

	function RotateLeft(lValue, iShiftBits)
	{
		return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
	}
	
	function AddUnsigned(lX,lY)
	{
		var lX4,lY4,lX8,lY8,lResult;
		lX8 = (lX & 0x80000000);
		lY8 = (lY & 0x80000000);
		lX4 = (lX & 0x40000000);
		lY4 = (lY & 0x40000000);
		lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
		if (lX4 & lY4) {
			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
		}
		if (lX4 | lY4) {
			if (lResult & 0x40000000) {
				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
			} else {
				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
			}
		} else {
			return (lResult ^ lX8 ^ lY8);
		}
	}
	
	function F(x,y,z) { return (x & y) | ((~x) & z); }
	function G(x,y,z) { return (x & z) | (y & (~z)); }
	function H(x,y,z) { return (x ^ y ^ z); }
	function I(x,y,z) { return (y ^ (x | (~z))); }

	function FF(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	
	function GG(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	
	function HH(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	
	function II(a,b,c,d,x,s,ac)
	{
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};
	
	function ConvertToWordArray(string)
	{
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=Array(lNumberOfWords-1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while ( lByteCount < lMessageLength ) {
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
			lByteCount++;
		}
		lWordCount = (lByteCount-(lByteCount % 4))/4;
		lBytePosition = (lByteCount % 4)*8;
		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
		lWordArray[lNumberOfWords-2] = lMessageLength<<3;
		lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
		return lWordArray;
	};
	
	function WordToHex(lValue)
	{
		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
		for (lCount = 0;lCount<=3;lCount++) {
			lByte = (lValue>>>(lCount*8)) & 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
		}
		return WordToHexValue;
	};
	
	function Utf8Encode(string)
	{
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {
				utftext += String.fromCharCode(c);
			} else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			} else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	};
	
	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;
	
	string = Utf8Encode(string);
	
	x = ConvertToWordArray(string);
	
	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
	
	for (k=0;k<x.length;k+=16) {
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
		a=AddUnsigned(a,AA);
		b=AddUnsigned(b,BB);
		c=AddUnsigned(c,CC);
		d=AddUnsigned(d,DD);
	}
	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
	
	return temp.toLowerCase();
}

bodyloadfunction(init_scrollbars);
