document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

var loaderImage = 'theme/images/ajax-loader.gif';
var dragObject  = null;
var mouseOffset = null;

function getElement(psID)
{
	if(document.all)
	{
		return document.all[psID];
	}
		else
	{
		return document.getElementById(psID);
	}
}

var ajaxPool = (function()
{
	var stack = new Array();
	var poolSize = 10;
	var nullFunction = function() {};
	function getHTTPObject() 
	{
		if(window.XMLHttpRequest)
		{
			return new XMLHttpRequest();
		}
		else if(window.ActiveXObject) 
		{
			return  new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	for (var i = 0; i < poolSize; i++) 
	{
		stack.push(getHTTPObject());
	}
	return ({
		release:function(xhr)
		{
			xhr.onreadystatechange = nullFunction;
			stack.push(xhr);
		},
		getInstance:function()
		{
			if (stack.length < 1) 
			{
				return getHTTPObject();
			}
			else 
			{
				return stack.pop();
			}
		},
		toString:function()
		{
			return "stack size = " + stack.length;
		}
	});
})();

var ajaxPreLoader = (function()
{
	return ({
		show:function(called){
			if (called && loaderImage)
			{
				var object = getElement('content');
				if (object.offsetWidth)
				{
					var newdiv = document.createElement('div');
					newdiv.setAttribute('id','loader');
					newdiv.style.position='absolute';
					newdiv.style.top='0px';
					newdiv.style.left='0px';
					newdiv.style.width=(object.offsetWidth+10)+'px';
					newdiv.style.height=(object.offsetHeight+10)+'px';
					imgposX = Math.round(((object.offsetWidth+10)/2)-16);
					imgposY = Math.round(((object.offsetHeight+10)/2)-16);
					if (imgposY<0)
					{
						imgposY = 50;
					}
					newdiv.innerHTML = '<img src="'+loaderImage+'" style="position:absolute;left:'+imgposX+'px;top:'+imgposY+'px;" class="loader" />';
					object.appendChild(newdiv);
				}
				
			}
		},
		hide:function(called){
			if (called && loaderImage)
			{
				var object = getElement('content');
				if (getElement('loader')&&getElement('content'))
				{
					object.removeChild(getElement('loader'));
				}
				window.scroll(0,0);
			}
		}
	});
})();

var ajaxResponse = (function()
{			
	function processForm(form)
	{
		var params =''
		for (var i = 0; i<form.elements.length; i++) 
		{
			if ((form.elements[i].type == 'radio')||(form.elements[i].type == 'checkbox')) 
			{
				if (form.elements[i].checked) 
				{
					params += form.elements[i].name + '=' + form.elements[i].value + '&';
				}
			}
			else if(form.elements[i].type=='select-one')
			{
				var index = form.elements[i].selectedIndex;
				params += form.elements[i].name + '=' + form.elements[i].options[index].value + '&';
			}
			else
			{
				if (form.elements[i].value)
				{
					params += form.elements[i].name + '=' + urlencode(form.elements[i].value) + '&';
				}
				else
				{
					params += form.elements[i].name + '=&';
				}
				
			}	
		}
		return (params.substr(0,(params.length-1)));
	}
	
	function uniqueUrl(url)
	{
		var unique = 'rnd='+(Math.random() * Date.parse(new Date()));
		if (url.indexOf("?")>-1)
		{
			url += '&'+unique;
		}
		else
		{
			url += '?'+unique;
		}
		return url;
	}
	
	function handleResponse(method,handler,response)
	{
		switch(method)
		{
			case 'GET_CONTENT':
				switch (handler.tagName)
				{
					case 'DIV':
						handler.innerHTML = response;
					break;
				}
			break;
			case 'HANDLE_RESPONSE':
				handler(response);
			break;
		}
	}
	
	return ({
		get:function(query,method,handler,showloader)
		{
			if (ajaxPreLoader)
			{
				ajaxPreLoader.show(showloader);
			}
			query = uniqueUrl(query);
			var httpStream = ajaxPool.getInstance();
			httpStream.open('GET', query, true);
			httpStream.onreadystatechange = function()
			{
				if (httpStream.readyState == 4)
				{
					if (ajaxPreLoader)
					{
						ajaxPreLoader.hide(showloader);
					}
					if(httpStream.status == 408)
			        {
			             // Do Something
			        }
					else if (httpStream.status == 200) 
					{
						handleResponse(method,handler,httpStream.responseText);
					}
					ajaxPool.release(httpStream);
				}
			}
			httpStream.send(null);
		},
		post:function(form,url,method,handler,showloader)
		{
			if (ajaxPreLoader)
			{
				ajaxPreLoader.show(showloader);
			}
			if (form.submit && form.submit.disabled)
			{
				form.submit.disabled=true;
			}
			var httpStream = ajaxPool.getInstance();
			var params = processForm(form);
			url=uniqueUrl(url);
			httpStream.open("POST", url, true);
			httpStream.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			httpStream.setRequestHeader("Content-length", params.length);
			httpStream.setRequestHeader("Connection", "close");
			httpStream.onreadystatechange = function() 
			{
				if(httpStream.readyState == 4) 
				{
					if(httpStream.status == 408)
			        {
			              // Do Something
			        }
					else if (httpStream.status == 200) 
					{
						handleResponse(method,handler,httpStream.responseText);
						if (ajaxPreLoader)
						{
							ajaxPreLoader.hide(showloader);
						}
						if (form.submit&&form.submit.disabled)
						{
							form.submit.disabled=false;
						}
					}
					ajaxPool.release(httpStream);
				}
			}
			httpStream.send(params);
		}
	});
})();

var attachToHead = (function()
{
	return ({
		css:function(location){
			var headID = document.getElementsByTagName("head")[0];
			var loaded = false;
			for ( i=1; i< headID.childNodes.length; i++ ) 
			{
				node = headID.childNodes[i];
				if (node.nodeName=="LINK")
				{
					if (node.href.match(location))
					{
						var loaded=true;
					}
				}
			}
			if (!loaded)
			{
				var cssNode = document.createElement('link');
				cssNode.type = 'text/css';
				cssNode.rel = 'stylesheet';
				cssNode.href = location;
				headID.appendChild(cssNode);
			}
		},
		js:function(location,reload){
			var headID = document.getElementsByTagName("head")[0];
			var loaded = false;
			for ( i=1; i< headID.childNodes.length; i++ ) 
			{
				node = headID.childNodes[i];
				if (node.nodeName=="SCRIPT")
				{
					if (node.src.match(location))
					{
						if (!reload)
						{
							var loaded = true;
						}
						else
						{
							headID.removeChild(node);
						}
					}
				}
			}
			if (!loaded)
			{
				var newScript = document.createElement('script');
				newScript.type = 'text/javascript';
				newScript.src = location;
				headID.appendChild(newScript);
			}
		}
	});
})();	

function urlencode(url) 
{
	var data = url;
	var utftext = "";
	len = data.length;
	for (var i=0;i<len;i++) 
	{
		var c = data.charCodeAt(i);
		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 escape(utftext);
}

function getDocumentSize()
{
	if (document.layers)
	{
		documentWidth	= window.innerWidth  + window.pageXOffset - 20;
		documentHeight 	= window.innerHeight + window.pageYOffset - 20;
	}
	else if (document.all)
	{
		documentWidth 	= document.documentElement.offsetWidth  + document.documentElement.scrollLeft - 20;
		documentHeight 	= document.documentElement.offsetHeight + document.documentElement.scrollTop  - 20;
	}
	else if (document.getElementById && self.innerWidth && (window.pageXOffset>-1))
	{
		documentWidth	= self.innerWidth  + window.pageXOffset - 20;
		documentHeight 	= self.innerHeight + window.pageYOffset - 20;
	}
	docSize = new Array(documentWidth,documentHeight);
	return docSize;
}

function getMouseOffset(target, ev)
{
	ev = ev || window.event;
	var docPos    = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function mouseCoords(ev)
{
	if(ev.pageX || ev.pageY)
	{
		return {x:ev.pageX, y:ev.pageY};
	}
	else
	{
		coorX=0;
		coorY=0;
		if (document.body)
		{
			coorX = ev.clientX + document.body.scrollLeft - document.body.clientLeft;
			coorY = ev.clientY + document.body.scrollTop  - document.body.clientTop;
		}
		return {
			x:coorX,
			y:coorY
		};
	}
}

function getPosition(object)
{
	var left = 0;
	var top  = 0;
	while (object.offsetParent)
	{
		left += object.offsetLeft;
		top  += object.offsetTop;
		object = object.offsetParent;
	}
	left += object.offsetLeft;
	top  += object.offsetTop;
	return {x:left, y:top};
}

function mouseMove(event)
{
	event = event || window.event;
	var mousePos = mouseCoords(event);
	if(dragObject)
	{
		dragObject.style.top      = (mousePos.y - mouseOffset.y)+'px';
		dragObject.style.left     = (mousePos.x - mouseOffset.x)+'px';
		return false;
	}
}

function mouseUp()
{
	dragObject = null;
}

function makeDraggable(elementName,clickArea)
{
	objectToDrag=getElement(elementName);
	clickAble = getElement(clickArea);
	clickAble.onmousedown = function(event)
	{
		dragObject  = objectToDrag;
		mouseOffset = getMouseOffset(objectToDrag, event);
		return false;
	}
}

function addElement(parentDiv,divIdName,htmlString,styleCSS,classCSS) 
{
	var parent = getElement(parentDiv); 
	if (getElement(parentDiv))
	{
		var newdiv = document.createElement('div');
		newdiv.setAttribute('id',divIdName);
		if (styleCSS)
		{
			setStyle(newdiv,styleCSS); 
		}
		if (classCSS)
		{
			newdiv.setAttribute('class',classCSS);
		}
		if(htmlString)
		{
			newdiv.innerHTML = htmlString;
		}
		parent.appendChild(newdiv);
	}
	return getElement(divIdName)
}

function setStyle(object,styleCSS) 
{
	var cssSet = styleCSS.split(';');
	for (var attribute in cssSet) 
	{
		var styleSet = cssSet[attribute].split(':');
		switch (styleSet[0])
		{
			case 'position':
				object.style.position=styleSet[1];
			break;
			case 'top':
				object.style.top=styleSet[1];
			break;
			case 'left':
				object.style.left=styleSet[1];
			break;
			case 'width':
				object.style.width=styleSet[1];
			break;
			case 'height':
				object.style.height=styleSet[1];
			break;
		}
	}
}

function removeElement(parentDiv,divIdName)
{
	if (getElement(parentDiv)&&getElement(divIdName))
	{
		var parent = getElement(parentDiv);
		var olddiv = getElement(divIdName);
		parent.removeChild(olddiv);
	}
}

function createPopup(parent,div,title,width,height,dragable,posX,posY)
{
	var docSize = getDocumentSize();
	if (!getElement(div))
	{
		if (!posY)
		{
			posY=Math.round((docSize[1]/2)-(height/2));
		}
		if (!posX)
		{
			posX=Math.round((docSize[0]/2)-(width/2));
		}
		addElement('container',div,'<div id="'+div+'_header" class="popup_header" style="width:'+width+'px;"><input type="button" value="X" onclick="removeElement(\''+parent+'\',\''+div+'\');" class=\"popup_close\" /><p>'+title+'</p></div><div id=\"'+div+'_content\" class="popup_content"></div>','position:absolute;top:'+posY+'px;left:'+posX+'px;width:'+width+'px;height:'+height+'px;','popup');
		if (dragable)
		{
			makeDraggable(div,div+'_header');
		}
		return getElement(div+'_content');
	}
}
