// I only committed to main browsers, it is too damaging to my brain
// for hacking around browsers' oddities, especially fucking IE
// For those masochists who want to know the devils in details, visit:
// www.quirksmode.org
// www.positioniseverything.com
// www.alistapart.com

// If you want to support Netscape 4, please use <LAYER> in your HTML 
// and remove Netscape 4 check in isShit()

// Nested layers are NOT supported in all functions,
// I hate to use <LAYER> (Fuck with Ns4)

// Tested in Win: IE 6, Ns 6.2, Opera 7.11
// Thanks to www.quirksmode.org (Paul Koch) for many codes
// license: http://creativecommons.org/licenses/by/1.0/
// but i steal from many

nsLayers = document.layers;
ieAll = document.all;
dom = document.getElementById;
xdw = document.write; // shortcut
zdw = document.writeln; // shortcut

function isShit(){
	if(nsLayers) return true; // Ns 4 unstandard layering is shit
} 

function getObj(name) // from Paul Koch
{
	if (document.getElementById){
		this.obj = document.getElementById(name);
		this.style = document.getElementById(name).style;
	}else if (document.all){
		this.obj = document.all[name];
		this.style = document.all[name].style;
	}else if (document.layers){
		this.obj = getObjNN4(document,name);
		this.style = this.obj;
	}
}

function getObjNN4(obj,name) // from Paul Koch
{
	var x = obj.layers;
	var foundLayer;
	for (var i=0;i<x.length;i++)
	{
		if (x[i].id == name)
		 	foundLayer = x[i];
		else if (x[i].layers.length)
			var tmp = getObjNN4(x[i],name);
		if (tmp) foundLayer = tmp;
	}
	return foundLayer;
}

function getById(id){	return document.getElementById(id); }

function getStyle(id){
	if(dom)
		return document.getElementById(id).style;
	if(ieAll)
		return ieAll.style;
	return null;
}

function setStyle(id, prop, val){
	var vStyle = getStyle(id);
	if( vStyle ){
		vStyle[prop] = val; 
	}
}

function getStyleProp(el,styleProp)
{
	var x = document.getElementById(el);
	if (x.currentStyle)
		var y = eval('x.currentStyle.' + styleProp);
	else if(document.defaultView)
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
		
	return y;
}

// hide and show
// -------------
function zHide(id){
	
	var vStyle = getStyle(id);
	if( vStyle )
		setStyle(id, "visibility", "hidden");
	else if( nsLayers )
		nsLayers[id].visibility='hide';
}

function zShow(id){
	
	var vStyle = getStyle(id);
	if( vStyle )
		setStyle(id, "visibility", "visible");
	else if( nsLayers )
		nsLayers[id].visibility='show';
}

// positioning
// -----------
// the gLeft and gTop is NS 4 compatible
// get absolute left and top position
function gLeft(id)
{	
	var obj = document.getElementById(id);
	if( !obj ) return;
	
	var curleft = 0;
	if (obj.offsetParent)
	{	while (obj.offsetParent)
		{	curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function gTop(id)
{	if( isShit() ) return 0;

	var obj = document.getElementById(id);
	if( !obj ) return;

	var curtop = 0;
	if (obj.offsetParent)
	{	while (obj.offsetParent)
		{	curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function zMove(id,left,top){
	
	var vStyle = getStyle(id);
	if( dom ){
		vStyle.left = left+"px";
		vStyle.top = top+"px";
	}else if( ieAll ){ // IE but no DOM
		vStyle.pixelLeft=left;
		vStyle.pixelTop=top;		
	}else if( nsLayers ){
		nsLayers[id].moveTo(left,top);
	}		
}

// sizing
// ------
function gWidth(id)
{	if( isShit() || !dom ) return 0;

	var x = document.getElementById(id);
	if( x )	return x.offsetWidth;
	if( ieAll ) return ieAll.style.pixelWidth;
	return 0;
}

function gHeight(id)
{	if( isShit() || !dom ) return 0;

	var x = document.getElementById(id);
	if( x )	return x.offsetHeight;
	if( ieAll ) return ieAll.style.pixelHeight;
	return 0;
}

function zSize(id,width,height){
	var vStyle = getStyle(id);
	
	if( dom ){
		vStyle.width = width+"px";
		vStyle.height = height+"px";	
	}else if( ieAll ){
		ieAll.style.pixelWidth=width;
		ieAll.style.pixelHeight=height;
	}else if(nsLayers)	
		nsLayers[id].resizeTo(width,height);
}

// writing to DIV
// --------------

function gText(id){	
	var x;
	
  if (dom){
		x = document.getElementById(id);
		return x.innerHTML;
	}else if (ieAll)	{
		x = ieAll[id];
		return x.innerHTML;
	}
	return "";
}

function zWrite(id,txt){	
	var x;
	
  if (dom){
		x = document.getElementById(id);
		x.innerHTML = '';
		x.innerHTML = txt;
	}else if (ieAll)	{
		x = ieAll[id];
		x.innerHTML = txt;
	}else if (nsLayers){
		x = nsLayers[id];
		x.document.open();
		x.document.write(txt);
		x.document.close();
	}
}

// tracking mouse movement
// -----------------------
var zMouseX = 0;
var zMouseY = 0;

function mouseTrack( e )
{	
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		zMouseX = e.pageX;
		zMouseY = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		zMouseX = e.clientX + gPageXOffset();
		zMouseY = e.clientY + gPageYOffset();
	}
	// window.status = zMouseX+" "+zMouseY; 
	if( mouseMoveDefault )
		mouseMoveDefault();
}

function captureMouseMove()
{	if(document.captureEvents)
		document.captureEvents(Event.MOUSEMOVE);
	document.onmousemove = mouseTrack;
}

// window and viewport
// -------------------
// Thanks to Paul Koch, again

screen_Width = 0;
screen_Height = 0;

function initScreen(){
	screen_Width = self.screen.width;
	screen_Height = self.screen.height;
}

// Inner width
// The inner dimensions of the window or frame.

function gWinWidth(){
	if (self.innerHeight){ // all except Explorer
		return self.innerWidth;
	}else if (document.documentElement && document.documentElement.clientHeight){
		// Explorer 6 Strict Mode
		return document.documentElement.clientWidth;
	}else if (document.body){ // other Explorers
		return document.body.clientWidth;
	}
	return 0;
}

function gWinHeight(){
	var x,y;
	if (self.innerHeight){ // all except Explorer
		return self.innerHeight;
	}else if (document.documentElement && document.documentElement.clientHeight){
		// Explorer 6 Strict Mode
		return document.documentElement.clientHeight;
	}else if (document.body){ // other Explorers
		return document.body.clientHeight;
	}
	return 0;
}

// Scrolling offset
// How much the page has scrolled.

function gPageXOffset(){
	if (self.pageXOffset){ // all except Explorer
		return self.pageXOffset;
	}else if (document.documentElement && document.documentElement.scrollTop){
	// Explorer 6 Strict
		return document.documentElement.scrollLeft;
	}else if (document.body){ // all other Explorers
		return document.body.scrollLeft;
	}
	return 0;
}

function gPageYOffset(){
	if (self.pageYOffset){ // all except Explorer
		return self.pageYOffset;
	}else if (document.documentElement && document.documentElement.scrollTop){
		// Explorer 6 Strict
		
		return document.documentElement.scrollTop;
	}else if (document.body){ // all other Explorers
		return document.body.scrollTop;
	}
	return 0;
}

// Page height
// The height of the total page (usually the body element).

function gPageWidth(){
	var v1 = document.body.scrollWidth;
	var v2 = document.body.offsetWidth;
	return (v1 > v2)?v1:v2;
	// second case for Explorer Mac
	// would also work in Explorer 6 Strict, Mozilla and Safari
}

function gPageHeight(){
	var v1 = document.body.scrollHeight;
	var v2 = document.body.offsetHeight;
	return (v1 > v2)?v1:v2;
}