// JavaScript Document

function site_url(url)
{
	url = sid(url);
	var prefix = base_url();
	if (url.indexOf(prefix)>-1)
		return url;
	else
		return prefix+url;
}

function redirect(url)
{
	window.location.href = site_url(url);
}

function request()
{
	var s = "";
    var c = document.forms[0].elements;
	for(var i=0; i<c.length; i++) 
	{
		obj = c[i];		
		if (obj.type == 'checkbox' || obj.type == 'radio') 
		{	
			if (obj.checked)
			{
				if (obj.value)
					s += obj.name+"="+obj.value+"&";
				else
					s += obj.name+"=on&";
			}
		} else {
			// urldecode in PHP
			s += obj.name+"="+escape(encodeURI(obj.value))+"&";
		}
	}
	return s;
}

function __dopostback(target, args)
{
	var f = document.forms[0];
	f.__EVENTTARGET.value = target;
	f.__EVENTARGUMENT.value = args;
	f.submit();
}

function __docallback(target, args, url, callback, func)
{
	var f = document.forms[0];
	
	f.__EVENTTARGET.value = target;
	f.__EVENTARGUMENT.value = args;
	
	if (url.length == 0)
		url = f.action;

	ajaxRun_post(url, request(), callback, func);
}

function registerEvent(o, t, f) 
{
	if (o.addEventListener)
	{
		if (t == 'mousewheel')
		{
			o.addEventListener('DOMMouseScroll', f, false);
		} 
		o.addEventListener(t, f, false);
	}
	else if (o.attachEvent) 
		o.attachEvent('on'+ t, f);
	else 
		o['on'+ t] = f;
};

function unregisterEvent(o, t, f) 
{
	if (o.removeEventListener) 
	{
		if (t == 'mousewheel')
		{
			o.removeEventListener('DOMMouseScroll', f, false);
		} 		
		o.removeEventListener(t, f, false);
	} else if (o.detachEvent) 
		o.detachEvent('on'+ t, f);
	else 
		o['on'+ t] = null;
};

function eventObject(evt) 
{
    return (evt) ? evt : window.event;
}

function senderObject(evt) 
{
    evt = eventObject(evt);
	return (evt.target) ? evt.target : evt.srcElement;
}

function elementObject(id)
{
	if (document.getElementById)
		return document.getElementById(id);
	else if (document.all)
		return document.all[id];
	else if (document.layers)
		return document.layers[id];
	return null;
}

function styleObject(name, nest)
{
	var w3c = document.getElementById ? true : false;
	var iex = document.all ? true : false;
	var ns4 = document.layers ? true : false;	
	nest = nest ? 'document.'+nest+'.' : '';
	return w3c ? document.getElementById(name).style : iex ? document.all[name].style : ns4 ? eval(nest+'document.'+name) : false;	
}

// AJAX
function ajaxObject()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  return xmlHttp;
}


function ajaxRun(url, callback, func)
{
	var xmlHttp = ajaxObject();
	
	xmlHttp.onreadystatechange = function()
	{
		// We are going to write some code here	
		if (xmlHttp.readyState == 4)
		{
			// Get the data from the server's response 
			if (callback)
				callback.call(this, xmlHttp.responseText);
			if (func)
				func.call(this, true);
		}
	}	
	
	if (func)
		func.call(this, false);
	xmlHttp.open("GET", site_url(url), true);
	xmlHttp.send(null);			
}

function ajaxRun_post(url, query, callback, func)
{
	var xmlHttp = ajaxObject();
	
	xmlHttp.onreadystatechange = function()
	{
		// We are going to write some code here	
		if (xmlHttp.readyState == 4)
		{
			// Get the data from the server's response 
			if (callback)
				callback.call(this, xmlHttp.responseText);
			if (func)
				func.call(this, true);
		}
	}	
	
	if (func)
		func.call(this, false);
	xmlHttp.open("POST", site_url(url), true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	//xmlHttp.setRequestHeader("Content-length", obj.length);
	//xmlHttp.setRequestHeader("Connection", "close");
	xmlHttp.send(query);
}

// Validation
var clientUI =
{	
	addItem : function (group, param)
	{
		if (clientUI.clients[group] == undefined)
			clientUI.clients[group] = [];
		
		var o = new ValidateItem(param);
		clientUI.clients[group][clientUI.clients[group].length] = o;
	},	
			
	clients : []
};

function validateItems(gname)
{
	if (gname == undefined)
		gname = 'default';
		
	if (clientUI.clients[gname] != undefined)
	{
		var items = clientUI.clients[gname];
		for (var i=0; i<items.length; i++)
		{
			if (!items[i].validate())
			{
				items[i].focus();
				return false;
			}
		}		
		return true;
	}
	return true;
}

function validateAllItems(gname)
{
	if (gname == undefined)
		gname = 'default';
	var ret = true;
	if (clientUI.clients[gname] != undefined)
	{
		var items = clientUI.clients[gname];
		for (var i=0; i<items.length; i++)
		{
			if (!items[i].validate())
			{
				items[i].focus();
				ret = false;
			}
		}
	}
	return ret;
}

ValidateItem = function(param)
{
	this.id = param.id;
	this.validation_func = param.validation_func;
	this.error_msg = param.error_msg;
	this.error_div = param.error_div;
	this.validation_data = param.validation_data;
	
	this.validate = function()
	{
		var o = elementObject(this.id);
		if (o == null)
			o = this.id;
			
		var ret;

		if (typeof this.validation_data == 'object')
			eval('ret='+this.validation_func+'(o,'+this.validation_data+')');
		else
			eval('ret='+this.validation_func+'(o,"'+this.validation_data+'")');

		if (ret == false)
		{
			if (this.error_div)
			{
				var e = elementObject(this.error_div);
				e.innerHTML = this.error_msg;
			} else
				alert(this.error_msg);
			return false;
		} else {
			if (this.error_div)
			{
				var e = elementObject(this.error_div);
				e.innerHTML = '';
			}
		}
		
		return true;
	}
	
	this.focus = function()
	{
		var o = elementObject(this.id);
		o.focus();
	}
}

// Page
PageInfo = 
{	
	px : function ()
	{
		return document.childNodes ? 'px' : 0;
	},
	
	getResolutionWidth  : function() 
	{
		return self.screen.width; 
	},
	
	getResolutionHeight : function() 
	{
		return self.screen.height; 
	},
	
	getColorDepth       : function() 
	{
		return self.screen.colorDepth; 
	},

	getScrollLeft       : function() 
	{
		var scrollLeft = 0; 
		if (document.documentElement && document.documentElement.scrollLeft && document.documentElement.scrollLeft != 0) 
		{
			scrollLeft = document.documentElement.scrollLeft; 
		}
		
		if (document.body && document.body.scrollLeft && document.body.scrollLeft != 0) 
		{
			scrollLeft = document.body.scrollLeft; 
		}
		
		if (window.pageXOffset && window.pageXOffset != 0) 
		{
			scrollLeft = window.pageXOffset; 
		}
		
		return scrollLeft; 
	},
	
	getScrollTop        : function() 
	{
		var scrollTop = 0; 
		if (document.documentElement && document.documentElement.scrollTop && document.documentElement.scrollTop != 0) 
		{
			scrollTop = document.documentElement.scrollTop; 
		}
		
		if (document.body && document.body.scrollTop && document.body.scrollTop != 0) 
		{
			scrollTop = document.body.scrollTop; 
		}
		
		if (window.pageYOffset && window.pageYOffset != 0) 
		{
			scrollTop = window.pageYOffset; 
		}
		
		return scrollTop; 
	},

	getDocumentWidth    : function() { var documentWidth = 0; var w1 = document.body.scrollWidth; var w2 = document.body.offsetWidth; if (w1 > w2) { documentWidth = document.body.scrollWidth; } else { documentWidth = document.body.offsetWidth; } return documentWidth; },
	getDocumentHeight   : function() { var documentHeight = 0; var h1 = document.body.scrollHeight; var h2 = document.body.offsetHeight; if (h1 > h2) { documentHeight = document.body.scrollHeight; } else { documentHeight = document.body.offsetHeight; } return documentHeight; },
	getVisibleWidth     : function() { var visibleWidth = 0; if (self.innerWidth) { visibleWidth = self.innerWidth; } else if (document.documentElement && document.documentElement.clientWidth) { visibleWidth = document.documentElement.clientWidth; } else if (document.body) { visibleWidth = document.body.clientWidth; } return visibleWidth; },
	getVisibleHeight    : function() { var visibleHeight = 0; if (self.innerHeight) { visibleHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { visibleHeight = document.documentElement.clientHeight; } else if (document.body) { visibleHeight = document.body.clientHeight; } return visibleHeight; },
	
	windowSize : function() {
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }
	
	  return [myWidth, myHeight];
	},

	getElementLeft      : function(element) { var element = (typeof element == "string") ? elementObject(element) : element; var left = element.offsetLeft; var oParent = element.offsetParent; while (oParent != null) { left += oParent.offsetLeft; oParent = oParent.offsetParent; } return left; },
	getElementTop       : function(element) { var element = (typeof element == "string") ? elementObject(element) : element; var top = element.offsetTop; var oParent = element.offsetParent; while (oParent != null) { top += oParent.offsetTop; oParent = oParent.offsetParent; } return top; },
	getElementWidth     : function(element) { var element = (typeof element == "string") ? elementObject(element) : element; return element.offsetWidth; },
	getElementHeight    : function(element) { var element = (typeof element == "string") ? elementObject(element) : element; return element.offsetHeight; },
	
	addFrag : function(str)
	{
		var frag = document.createDocumentFragment();
		frag.appendChild(document.createTextNode(str));
		document.body.appendChild(frag);	
	},
	
	addStr : function(str)
	{
		if( document.layers && window.Layer && document.classes ) {
			//create a layer 350px wide
			document.layers['newName'] = new Layer( 350 );
			//write its content
			document.layers['newName'].document.open();
			document.layers['newName'].document.write(str);
			document.layers['newName'].document.close();
			//style it
			document.layers['newName'].left = 0;
			document.layers['newName'].top = 0;
			document.layers['newName'].visibility = 'show';
		} else if( document.body ) {
			var theString = '<div style="position:absolute;left:0px;top:0px;' +
				'width:350px;">'+str+'</div>';
			if( document.body.insertAdjacentHTML ) {
				document.body.insertAdjacentHTML( 'beforeEnd', theString );
			} else if( typeof( document.body.innerHTML ) != 'undefined' ) {
				document.body.innerHTML += theString;
			} else {
				//FAILURE, nothing works
			}
		} else {
		  //FAILURE, nothing works
		}
	},
		
	onEnter : function (evt)
	{
		var e = eventObject(evt);
		if ((e.which && e.which == 13) || 
			(e.keyChar && e.keyChar == 13) ||
			(e.keyCode && e.keyCode == 13))
			return true;
		else
			return false;
	},
	
	evalScript : function (data)
	{
		var head = document.getElementsByTagName("head")[0] || document.documentElement;
		var script = document.createElement("script");
		script.type = "text/javascript";
		try{
			script.setAttribute('text', data);
		} catch(e) {}
		try{
			script.appendChild(document.createTextNode(data));
		} catch(e) {}
		head.insertBefore(script, head.firstChild);
		head.removeChild(script);
	},

	getMouseX           : function() { return PageInfo.mouseX; },
	getMouseY           : function() { return PageInfo.mouseY; },


	// HELPER CODE FOR TRACKING MOUSE POSITION
	mouseX: 0,
	mouseY: 0,
	onMouseMove: function(e) 
	{
		e = eventObject(e); 
		PageInfo.mouseX = e.clientX + PageInfo.getScrollLeft(); 
		PageInfo.mouseY = e.clientY + PageInfo.getScrollTop(); 
	}
};
// HELPER CODE FOR TRACKING MOUSE POSITION
registerEvent(document, "mousemove", PageInfo.onMouseMove);
