//
// Copyright © Anygraaf Oy. All rights reserved.
//

function AgAjax (url)
{
	this.url				= url;
	this.xmlHttp			= false;
	this.queryQueue			= new Array();
	this.readyFunction		= false;
	this.rFuncAttributes	= false;
	this.statusElem			= false;
	this.Timeout			= false;
	
	// Public functions
	this.Query = Query;
	this.XmlQuery = XmlQuery;
		
	this.AjaxQuery = AjaxQuery;
	function AjaxQuery ()
	{
		if(this.queryQueue.length > 0)
		{
			if(this.xmlHttp && this.xmlHttp.readyState != 0 && this.xmlHttp.readyState != 4)
			{
				this.Timeout = setTimeout(AgAjaxQuery, 100, this);
			}
			else
			{
				this.statusElem = document.getElementById("ajax_status");
				if(this.statusElem)
					this.statusElem.innerHTML = 'Lähetetään kyselyä';
					
				var query = this.queryQueue.shift();
				this.readyFunction = query[2];
				this.rFuncAttributes = query[3];
				
				this.xmlHttp = AgXmlHttp();
				try {
					this.xmlHttp.open("POST",this.url,query[1]);
					this.xmlHttp.setRequestHeader("Content-Type", query[4]); 
					var self = this;
					this.xmlHttp.onreadystatechange = function () { self.StateChange(); };
					this.xmlHttp.send(query[0]);
				}
				catch (e)
				{
					this.queryQueue.push(query);
					this.Timeout = setTimeout(AgAjaxQuery, 100, this);
					return;
				}
				
				if(!query[1] && this.xmlHttp.readyState==4)
					this.ExecReady(); // Mozilla refuses to use onreadystatechange with synchronous requests.
					
				if(this.queryQueue.length > 0)
					this.AjaxQuery();
			}
		}
	}
	function Query (keys,values,async,func,funcAttr)
	{
		var queryStr="";
		for(var i=0; i < keys.length; i++)
		{
			if(i>0) queryStr += "&";
			queryStr += keys[i] + "=" + values[i];
		}
		this.queryQueue.push(Array(queryStr,async,func,funcAttr,"application/x-www-form-urlencoded"));
		this.AjaxQuery();
	}
	function XmlQuery (xml,async,func,funcAttr)
	{
		this.queryQueue.push(Array(xml,async,func,funcAttr,"text/xml"));
		this.AjaxQuery();
	}
	this.StateChange = function ()
	{
		if(this.statusElem)
			switch (this.xmlHttp.readyState)
			{
				case 0: this.statusElem.innerHTML = ""; break;
				case 1: this.statusElem.innerHTML = 'Lähetetään kyselyä'; break;
				case 2: this.statusElem.innerHTML = 'Ladataan'; break;
				case 3: this.statusElem.innerHTML = 'Luetaan'; break;
			}
	
		if(this.xmlHttp.readyState==4)
			this.ExecReady();
	}
	this.ExecReady = function () {
		if(this.readyFunction)
		{
			var tmp_func = this.readyFunction;
			var tmp_attr = this.rFuncAttributes;
			this.readyFunction = false;
			this.rFuncAttributes = false;
			tmp_func(this.xmlHttp, tmp_attr);
		}
		if(this.queryQueue.length == 0 && this.statusElem)
			this.statusElem.innerHTML = 'Valmis';
	}
	
	this.ClearQueue = function () { this.queryQueue.splice(0,this.queryQueue.length); clearTimeout(this.Timeout); }
}

function AgAjaxQuery(obj) { obj.AjaxQuery(); }
function AgIsSet ( test ) { return (typeof(test)!='undefined'&&test!=null); }

function AgXmlEntities( string, use )
{
	var sLine=String(string);

	if ( use ) {
		sLine = sLine.replace( /&/g, "&amp;" );
		sLine = sLine.replace( /</g, "&lt;" );
		sLine = sLine.replace( />/g, "&gt;" );
		sLine = sLine.replace( /'/g, "&apos;" );
		sLine = sLine.replace( /\"/g, "&quot;" );
	}
	else {
		sLine = sLine.replace( /&lt;/g, "<" );
		sLine = sLine.replace( /&gt;/g, ">" );
		sLine = sLine.replace( /&apos;/g, "'" );
		sLine = sLine.replace( /&quot;/g, "\"" );
		sLine = sLine.replace( /&amp;/g, "&" );
	}
	return sLine;
}

function AgGetNodeText (node)
{
	var text="";
	for(var i=0; i < node.childNodes.length; i++)
		text += node.childNodes[i].nodeValue;
	return text;
}

function AgXmlHttp ()
{
	var xmlHttp;
	try
	{
		xmlHttp=new XMLHttpRequest();
	}
	catch (e)
	{
		try
		{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				MessageBox("Your browser does not support AJAX!");
			}
		}
	}
	return xmlHttp;
}

function AgUrlExists(url)
{
	var xmlHttp = GetXmlHttp();
	xmlHttp.open("GET", url, false);
	// This could (& should) be done with HEAD-request, but
	// for some reason Opera hangs when trying to GET the icon
	// after HEAD-request..
	xmlHttp.send(null);
	if (xmlHttp.status==200)
	{
		xmlHttp.abort();
		return true;
	}
	else
	{
		xmlHttp.abort();
		return false;
	}
}

function AgFormatDate(date)
{
	var ret = date.getFullYear();
	if(date.getMonth()+1 < 10)
		ret += "0";
	ret += String(date.getMonth()+1);
	if(date.getDate() < 10)
		ret += "0";
	ret += String(date.getDate());
	return ret;
}

function AgLoadFormattedDate(date)
{
	var d = new Date();
	var datestr = new String(date);
	d.setFullYear(datestr.substr(0,4));
	d.setMonth(datestr.substr(4,2)-1);
	d.setDate(datestr.substr(6,2));
	return d;
}

function AgWeekNumber(date)
{
    var year = date.getFullYear(),
		month = date.getMonth()+1,
		day = date.getDate();

    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + 
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                 Math.floor(y/400) - 32045;

    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;        
}

function AgWeekDayIndex(day, offset)
{
	day -= offset;
	if(day < 0)
		return 7+day;
	else return day;
}

function AgWeekDayStr(day)
{
	switch (day)
	{
		case 0: return "ma";
		case 1: return "ti";
		case 2: return "ke";
		case 3: return "to";
		case 4: return "pe";
		case 5: return "la";
		case 6: return "su"; 
	}
}

function AgCalendar (retFunc)
{
	this.m_date = new Date();
	this.m_currDate = new Date();
	this.m_currStartDate = new Date();
	if(!AgIsSet(this.m_mainDiv))
		this.m_mainDiv = document.createElement("div");
	this.m_retFunc = retFunc
	
	Init();
	function Init()
	{
		var body = document.getElementsByTagName("body")[0];
		this.m_mainDiv.className = "calendar";
		var pos = AgGetMouse();
		this.m_mainDiv.style.position="absolute";
		this.m_mainDiv.style.top = pos.y+"px";
		this.m_mainDiv.style.left = pos.x+"px";
		body.appendChild(this.m_mainDiv);
		Draw();
	}
	function Draw ()
	{
		
		m_currDate = new Date(m_currStartDate);
		var child;
		while( child = this.m_mainDiv.firstChild )
			this.m_mainDiv.removeChild(child);
	
		var monthSel = document.createElement("select");
		monthSel.calendar = this;
		monthSel.onchange = AgCalendarClickHelper;
		for(var i=1; i < 13; i++)
		{
			var option = document.createElement("option");
			option.value = i;
			option.appendChild(document.createTextNode(i));
			if(i == this.m_currDate.getMonth()+1)
				option.defaultSelected = option.selected = true;
			monthSel.appendChild(option);
		}
		var yearSel = document.createElement("select");
		yearSel.calendar = this;
		yearSel.onchange = AgCalendarClickHelper;
		for(var i=0; i < 5; i++)
		{
			var option = document.createElement("option");
			option.value = this.m_date.getFullYear()-i;
			option.appendChild(document.createTextNode(this.m_date.getFullYear()-i));
			if(this.m_currStartDate.getFullYear() == this.m_date.getFullYear()-i)
				option.defaultSelected = option.selected = true;
			yearSel.appendChild(option);
		}
		this.m_mainDiv.appendChild(monthSel);
		this.m_mainDiv.appendChild(yearSel);
		var close = document.createElement("a");
		close.appendChild(document.createTextNode("Close"));
		close.calendar = this;
		close.onclick = AgCalendarClose;
		close.href = "#";
		this.m_mainDiv.appendChild(close);
		var table = document.createElement("table");
		var thead = document.createElement("thead");
		var tr = document.createElement("tr");
		var th = document.createElement("th");
		tr.appendChild(th);
		for(var i=0; i < 7; i++)
		{
			th = document.createElement("th");
			th.appendChild(document.createTextNode(AgWeekDayStr(i)));
			tr.appendChild(th);
		}
		thead.appendChild(tr);
		table.appendChild(thead);
		
		this.m_currDate.setDate(1);
		var month = this.m_currDate.getMonth();
		var tbody = document.createElement("tbody");
		var tr = document.createElement("tr");
		if(AgWeekDayIndex(this.m_currDate.getDay(),1) != 0)
		{
			var td = document.createElement("td");
			td.appendChild(document.createTextNode(AgWeekNumber(this.m_currDate)));
			tr.appendChild(td);
			for(var i=0; i < AgWeekDayIndex(this.m_currDate.getDay(),1); i++)
			{
				var td = document.createElement("td");
				tr.appendChild(td);
			}
		}
		while(this.m_currDate.getMonth() == month)
		{
			if(AgWeekDayIndex(this.m_currDate.getDay(),1) == 0)
			{
				tbody.appendChild(tr);
				tr = document.createElement("tr");
				var td = document.createElement("td");
				td.appendChild(document.createTextNode(AgWeekNumber(this.m_currDate)));
				tr.appendChild(td);
			}
			var td = document.createElement("td");
			var a = document.createElement("a");
			a.appendChild(document.createTextNode(this.m_currDate.getDate()));
			a.href = '#';
			a.onclick = AgCalendarClickHelper;
			a.calendar = this;
			a.date = new Date(this.m_currDate);
			td.appendChild(a);
			if(	this.m_currDate.getDate() == this.m_date.getDate() &&
				this.m_currDate.getMonth() == this.m_date.getMonth()  &&
				this.m_currDate.getFullYear() == this.m_date.getFullYear())
					a.className = "today";
			tr.appendChild(td);
			this.m_currDate.setDate(this.m_currDate.getDate()+1);
		}
		tbody.appendChild(tr);
		table.appendChild(tbody);
		this.m_mainDiv.appendChild(table);
	}
	this.Select = Select;
	function Select(date)
	{
		Close();
		this.m_retFunc(date);
	}
	this.Change = Change;
	function Change(num)
	{
		if(num < 13)
			this.m_currStartDate.setMonth(num-1)
		else if(num > 1900)
			this.m_currStartDate.setFullYear(num)
		Draw();
	}
	this.Close = Close;
	function Close ()
	{
		var body = document.getElementsByTagName("body")[0];
		//this.m_mainDiv.style.display = "none";
		body.removeChild(this.m_mainDiv);
	}
}

function AgCalendarClickHelper ()
{
	if(AgIsSet(this.date))
		this.calendar.Select(this.date);
	else
		this.calendar.Change(parseInt(this.options[this.selectedIndex].value));
	return false; // Prevents page refreshing on some browsers
}

function AgCalendarClose ()
{
	this.calendar.Close();
	return false;
}

function AgFormatSqlTime(str)
{
	var out = "" + str.substr(0,2) + ":" + str.substr(2,2) + ":" + str.substr(4,2);
	return out;
}

if (!document.all) document.captureEvents(Event.MOUSEMOVE)
document.onmousemove = AgMouseUpdate;
var AgMouseX = 0; var AgMouseY = 0;
function AgMouseUpdate(e) {
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		AgMouseX = e.pageX;
		AgMouseY = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		AgMouseX = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		AgMouseY = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
}

function AgGetMouse() { return {x: AgMouseX, y: AgMouseY}; }

function AgHighLight  (elem_i,round_i)
{
	var elem;
	var round = (AgIsSet(round_i)?parseInt(round_i):0);
	if(AgIsSet(this.style))
		elem = this;
	else if(typeof(elem_i) == "object")
		elem = elem_i;
	else
		elem = document.getElementById(elem_i);

	if(round > 0)
	{
		if(round < 6 && AgIsSet(elem.hl_orig))
		{
			if(elem.style.background == elem.hl_orig)
				elem.style.background = "#f1bcc6";
			else
				elem.style.background = elem.hl_orig;
			setTimeout(AgHighLight,500,elem,(++round));
		}
	}
	else
	{
		elem.hl_orig = elem.style.background;
		elem.style.background = "#f1bcc6";
		elem.hl_func = AgHighLight;
		setTimeout(AgHighLight,500,elem,(++round));
	}
}
