///JavaScript Document
///BROWSER DETECTION ///////////////////////////////////////////////////////////////////////////
var agt = navigator.userAgent.toLowerCase();
var BROWSER_NS4 = document.layers;
var BROWSER_OP5 = (agt.indexOf("opera 5") != -1) || (agt.indexOf("opera/5") != -1);
var BROWSER_OP6 = (agt.indexOf("opera 6") != -1) || (agt.indexOf("opera/6") != -1);
var BROWSER_MAC = (agt.indexOf("mac") != -1);
var BROWSER_IE = (agt.indexOf("msie") != -1); 
var BROWSER_MOZ = (agt.indexOf("gecko") != -1);

///EXTENSION FUNCTION Trim /////////////////////////////////////////////////////////////////////////////////
String.prototype.trim = function() 
{
	s = this.replace(/^\s+/, '');
	return s.replace(/\s+$/, '');
}
///CLASS Size /////////////////////////////////////////////////////////////////////////////////
function Size(width, height)
{
	this.Width = width;
	this.Height = height;
}

///CLASS Point ////////////////////////////////////////////////////////////////////////////////
function Point(x, y) 
{
	this.X = x;
	this.Y = y;
}
/// FUNCTION addListener////////////////////////////////////////////////////////////////////////
function addListener(element, type, expression, bubbling)
{
  bubbling = bubbling || false;
  if(window.addEventListener)	
  { // Standard
    element.addEventListener(type, expression, bubbling);
    return true;
  } 
  else if(window.attachEvent) 
  { // IE
    element.attachEvent('on' + type, expression);
    return true;
  } 
  else 
  	return false;
}
/// ImageLoader ////////////////////////////////////////////////////////////////////////////////
function ImageLoader(url)
{
	var self = this;
  	self.URL = url;
  	self.Image = null;
  	self.OnLoad = null;
  
  	self.Load = function()
  	{
	 	 self.Image = document.createElement('img');
		 addListener(self.Image, 
					'load', 
					function(e){
						if(self.OnLoad != null){
							self.OnLoad(self.Image);
						}
					}, 
					false
					);
		 self.Image.src = self.URL;
  	}
}
///FUNCTION GetElementByID /////////////////////////////////////////////////////////////////////
function getElement(element_id) 
{
	var elem;
	
	if (BROWSER_NS4) 
	{
		elem = getObjNN4(document, element_id);
	}
	else 
	{
		if(document.getElementById) 
		{
			elem = document.getElementById(element_id);	
		}			 
		else if (document.all)
		{
			elem = document.all[element_id];
		}
	}
	
	return elem; 
}
///FUNCTION getElementSize /////////////////////////////////////////////////////////////////////
function getElementSize(element_obj) 
{
	var size = new Size(0, 0);
	
	if (BROWSER_NS4) 
	{
		size.Width =  element_obj.clip.width;
		size.Height = element_obj.clip.height;
	}
	else 
	{
		if (BROWSER_OP5)
		{ 
			size.Width =  element_obj.element_obj.style.pixelWidth;
			size.Height = element_obj.style.pixelHeight;
		} 
		else 
		{
			
			size.Width =  element_obj.offsetWidth;
			size.Height = element_obj.offsetHeight;
		}
	} 
	
	return size;
}
///FUNCTION getElementCoords /////////////////////////////////////////////////////////////////////
function  getElementCoords(element_obj) 
{
	var point = new Point(0, 0);
	
	if (BROWSER_NS4) 
	{
		point.X = element_obj.pageX;
		point.Y = element_obj.pageY;
	}
	else 
	{
		point.X = element_obj.offsetLeft;
		point.Y = element_obj.offsetTop;
		var temp = element_obj.offsetParent;
		while (temp != null) {
			point.X += temp.offsetLeft;
			point.Y += temp.offsetTop;
			temp = temp.offsetParent;
		}
	}
	
	return point;
}
///FUNCTION getPageSize //////////////////////////////////////////////////////////////////////////////
function getPageSize()
{    
	var size = new Size(0, 0);
	if (window.innerHeight && window.scrollMaxY) 
	{ // Firefox 
		size.Height = window.innerHeight + window.scrollMaxY - 20;  
		size.Width = window.innerWidth + window.scrollMaxX - 20;     
	} 
	else if (document.body.scrollHeight > document.body.offsetHeight)
	{ // all but Explorer Mac 
		size.Height = document.body.scrollHeight;         
		size.Width = document.body.scrollWidth;     
	} 
	else 
	{ // works in Explorer 6 Strict, Mozilla (not FF) and Safari 
		size.Height = document.body.offsetHeight;         
		size.Width = document.body.offsetWidth;       
	}     
	return size;
}
///FUNCTION getScrollPosition //////////////////////////////////////////////////////////////////////////////
function getScrollPosition() {
  var position = new Point(0, 0);
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    position.Y = window.pageYOffset;
    position.X = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    position.Y = document.body.scrollTop;
    position.X = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    position.Y = document.documentElement.scrollTop;
    position.X = document.documentElement.scrollLeft;
  }
  return position;
}
///FUNCTION getClientSize //////////////////////////////////////////////////////////////////////////////
function getClientSize() {
  var size = new Size(0, 0);
  if( typeof( window.innerWidth ) == 'number' ) 
  {
    //Non-IE
    size.Width = window.innerWidth;
    size.Height = window.innerHeight;
  } 
  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 
  {
    //IE 6+ in 'standards compliant mode'
    size.Width = document.documentElement.clientWidth;
    size.Height = document.documentElement.clientHeight;
  } 
  else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) 
  {
    //IE 4 compatible
    size.Width = document.body.clientWidth;
    size.Height = document.body.clientHeight;
  }
  return size;
} 
///FUNCTION createXmlHttpRequest ////////////////////////////////////////////////////////////////
function createXmlHttpRequest()
{  
    var xmlHttpRequest = null;
 	try { // Firefox, Opera 8.0+, Safari    
		xmlHttpRequest = new XMLHttpRequest();    
	}
	catch (e)
	{        
		try {      
			// Internet Explorer 6.0+
			xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");     
		}
		catch (e)
		{      
			try {   
				// Internet Explorer 5.5+ 
				xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");        
			}
			catch (e) {              
				throw "Your browser does not support AJAX!";  
			}      
		}    
	}
	return xmlHttpRequest;
}
///FUNCTION Opacity //////////////////////////////////////////////////////////////////////////////	
function changeOpacity(opacity, element_id) 
{ 
	var obj = getElement(element_id);
	obj.style.filter = "Alpha(opacity="+opacity+")"; 
	obj.style.MozOpacity = opacity / 100;
} 
function opacity(element_id, opacStart, opacEnd, millisec, style) 
{ 
	var max_x;

	if(opacStart > opacEnd) {
		var max_x =  opacStart - opacEnd;
	}
	else if(opacStart < opacEnd) {
		var max_x =  opacEnd - opacStart; 
	}
	else {
		return;
	}

	var a = millisec / max_x; 
	var b = millisec / Math.pow(max_x, 3);
	var c = millisec / Math.sqrt(max_x);
		
	//determine the direction for the blending, if start and end are the same nothing happens 
	var time = 0;
	var x = 0;
	if(opacStart > opacEnd)
	{ 
		for(var i = opacStart; i >= opacEnd; i--) 
		{ 
			setTimeout("changeOpacity("+ i +", '"+ element_id +"')", time); 
			switch (style)
			{
				case "normal": 
					time = Math.round(a * x);
					break;
				case "slow":
					time = Math.round(b * Math.pow(x, 3));
					break;
				case "fast":
					time = Math.round(c * Math.sqrt(x));
					break;
			}
			x++;
		} 
	}
	else if(opacStart < opacEnd) 
	{ 
		for(var i = opacStart; i <= opacEnd; i++) 
		{ 
			setTimeout("changeOpacity("+ i +", '"+ element_id +"')", time); 
			switch (style)
			{
				case "normal": 
					time = Math.round(a * x);
					break;
				case "slow":
					time = Math.round(b * Math.pow(x, 3));
					break;
				case "fast":
					time = Math.round(c * Math.sqrt(x));
					break;
			}
			x++; 
		} 
	} 
}

///EVENT window.onDomReady /////////////////////////////////////////////////////////////////////
//create onDomReady Event
window.addDomReadyEvent = _domReadyEvent;
//Setup the event
function _domReadyEvent(fn)
{
	//W3C
	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", function () { fn(); }, false);
	}
	//IE
	else {
		var pre_func = document.onreadystatechange;
		document.onreadystatechange = function () {
			_domReadyState(fn, pre_func); 
		}
	}
}
//IE execute function
function _domReadyState(fn, pre_fn)
{
	//dom is ready for interaction
	if(document.readyState == "complete") {
		if(pre_fn) pre_fn();
		fn();
	}
}
//////////////////////////////////////////////////////////////////////////////////////////////////