// JavaScript Document
/*
This script contains all the functionality for the RichDateBox / CalendarInput

requirements: findObj() javascript function (by Macromedia)
			: ajax module must have been initialised on the page ($aj = new ajax(); echo $aj->getinitjavascript())

usage:

To include an instance of the calendarInput you need to first create a place holder element in your HTML
This would typically be a <div> but could equally be a <span>, <td> etc

eg: (html)

<div id="calendarholder1"></div>

Then you use javascript to fill this container with the HTML for the calendar

eg: (js)

ci = new calendarInput(uniqueid, formfield, initialvalue);
dch = findObj("calendarholder1");
dch.innerHTML = ci.gethtml();

Note that inital value should be a inetgral UNIX timestamp (not JavaScript timestamp, jstimestamp = 1000 * unixtimestamp)
Also you need to make sure that the placeholder is loaded before you try and fill it.
To do this, either place the last two lines of the above script after the placeholder in the page or call them from a javascript function
*/

if (typeof(calenderboxes)=="undefined")
{
	var calendarboxes = new Array();
}

function showcalendar(calendarid, date, x, y)
{
	if (cbox = calendarboxes[calendarid])
	{
		date="";
		
		var sx = getScrollX();
		var sy = getScrollY();
		
		cbox.show(date, x + sx, y + sy);
		
		//alert(sx + ", " + sy);
		//cbox.showcallback();
	}
}

/*
declare functions for calendarInput class
*/

function calendarInput(calendarid, target, value)
{
	var me = this;
	
	var x;
	var y;
	
	this.calendarid = calendarid;
	this.target = target;
	this.displaytarget = "disp-" + target;
	this.value = value;
	this.revertvalue = value;
	
	this.width = 250;
	
	//alert("datebox loaded");

	//this.setvalue(value);
	
	calendarboxes[calendarid] = this;		

	//alert(calendarid);
	
	this.show = function(date, x, y)
	{
		//alert(me.calendarid);
		
		params = new Array();
		classparams = new Array();
		
		classparams["table"] = "calendarsmall";
		classparams["td"] = "calendarsmall";
	
		dc = findObj("datetimepopup" + me.calendarid);
		
		if (!x) x = me.x;
		if (!y) y = me.y;
		
		if (x)
		{			
			dc.style.position = "absolute";
			//alert(dc.style.width);
			dc.style.left = x - me.width - 5;
			me.x = x;			
		}
		
		if (y)
		{
			dc.style.position = "absolute";
			dc.style.top = y - 5;			
			me.y = y;
		}
				
		params[0] = me.calendarid;
		//alert("params0 = " + params[0]);

		if (!date) date = me.value;
		date = parseInt(date);
		if (date)
		{
			params[1] = date;
		}
		else
		{
			var dt = new Date();
			params[1] = Math.floor(dt.getTime()/1000);
		}

		params[2] = "";
		params[3] = "";

		newar = new Array();
		newar["table"] = "calendarsmall";
		newar["tr"] = "calendarsmall";
		newar["td"] = "calendarsmall";
		newar["tdheading"] = "calendarsmall";

		//params[4] = newar;
		params[4] = "calendarsmall";
		params[5] = "j";
		params[6] = "";
		params[7] = "ccal=calendarboxes['" + me.calendarid + "'];ccal.setvalue('//datetime//', false, true)";
		params[8] = true;
		params[9] = true;
		
		//tg = findObj(this.target);
		if (me.value)
		{
			tgval = parseInt(me.value);
			tgd = new Date(tgval * 1000);
			tgd.setHours(0);
			tgd.setMinutes(0);
			tgd.setSeconds(0);
			params[10] = Math.floor(tgd.getTime() / 1000);
		}
		
		if (!params[10])
		{
			var dt = new Date();
			dt.setHours(0);
			dt.setMinutes(0);
			dt.setSeconds(0);
			params[10] = Math.floor(dt.getTime()/1000);
		}
		
		pdt = new Date(params[10] * 1000);
		
		params[11] = "";
		
		params[12] = "attending";
		params[13] = false;
		
		params[14] = new Array();
		params[14][0] = this.target;
		params[14][1] = (me.displaytarget) ? me.displaytarget : me.target;
		params[14][2] = x;
		params[14][3] = y;
	
		var callback_func = calendarboxes[calendarid].showcallback;
		//alert("cbf = " + callback_func);
		//alert(calendarboxes[calendarid].target);
		//ajax_reset();
		//alert("readystate for " + me.id + " = " + xmlhttp.readyState);
		call_object_method("cms_calendar", "getcalendarviewhtmlwithextendeddata", "", params, false, me.showcallback);
	}
	
	//alert(calendarboxes);
	
	this.showcallback = function()
	{
		//alert("cbxs = " + calendarboxes);
		//alert("cid = " + me.calendarid);
		dctxt = "calendar" + me.calendarid;

		dc = findObj(dctxt);
		dtp = findObj("datetimepopup" + me.calendarid);
		
		if (xmlhttp.readyState==4)
		{
			if (xmlhttp.responseText)
			{
				ret = eval(xmlhttp.responseText);
				
				htmltext = "";
				
				//alert("ret = " + ret);
				
				htmltext += "<input type=\"hidden\" name=\"calendar-date" + me.calendarid + "\" value=\"" + ret["activeday"] + "\">";
				htmltext += "<table class=\"calendarsmallbackground\" style=\"border: none\">";
				//htmltext += "<tr>\n<td>\n<a href=\"javascript:showcalendar('" + ret["calendarid"] + "', '" + ret["lastmonthstarttime"] + "', '" + ret["passthru"][0] + "', '" + ret["passthru"][1] + "', '" + ret["passthru"][2] + "', '" + ret["passthru"][3] + "')\" class=\"calendarsmall\">&laquo;</a></td>";
				htmltext += "<tr>\n<td>\n<a href=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];ccal.show('" + ret["lastmonthstarttime"] + "', '" + ret["passthru"][2] + "', '" + ret["passthru"][3] + "')\" class=\"calendarsmall\">&laquo;</a></td>";
				htmltext += "<td align=\"center\">" + ret["headertext"] + "</td>";
				//htmltext += "<td align=\"right\"><a href=\"javascript:showcalendar('" + ret["calendarid"] + "', '" + ret["nextmonthstarttime"] + "', '" + ret["passthru"][0] + "', '" + ret["passthru"][1] + "', '" + ret["passthru"][2] + "', '" + ret["passthru"][3] + "')\" class=\"calendarsmall\">&raquo;</a></td>";
				htmltext += "<td align=\"right\"><a href=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];ccal.show('" + ret["nextmonthstarttime"] + "', '" + ret["passthru"][2] + "', '" + ret["passthru"][3] + "')\" class=\"calendarsmall\">&raquo;</a></td>";
				htmltext += "</tr>\n<tr>\n<td colspan=\"3\">" + ret["html"] + "</td></tr></table>";
				
				dc.innerHTML = htmltext;
				dc.style.display = "";
				dtp.style.display = "";
				
				chr = findObj("calendar-hour" + me.calendarid);
				cmn = findObj("calendar-minutes" + me.calendarid);
				
				tdt = new Date(me.value * 1000);
				
				chrval = String(tdt.getHours());
				cmnval = String(tdt.getMinutes());
				
				if (isNaN(chrval))
				{
					chrval = "00";
				}
				else
				{
					while (chrval.length<2)
					{
							chrval = "0" + chrval;
					}
				}
				
				if (isNaN(cmnval))
				{
					cmnval = "00";
				}
				else
				{
					while (cmnval.length<2)
					{
							cmnval = "0" + cmnval;
					}
				}
				
				chr.value = chrval;
				cmn.value = cmnval;
				
			}
			
			ajax_reset();				

		}
	}


	this.callOnChangeHandler = function()
	{
		if (me.onChange)
		{
			//eval(me.onChange);
		}
	}
	
	this.callOnClickHandler = function()
	{
		if (me.onClick)
		{
			//eval(me.onClick);
		}
	}
	
	this.disable = function()
	{
		bt = findObj("btn_show_" + me.calendarid);
		bt.style.display = "none";
	}
	
	this.enable = function()
	{
		bt = findObj("btn_show_" + me.calendarid);
		bt.style.display = "";
	}
	
	this.formatdisplaydate = function(date)
	{
		var d = new Date(date * 1000);
		
		if (d.valueOf())
		{			
			chrval = String(d.getHours());
			cmnval = String(d.getMinutes());
			
			while (chrval.length<2)
			{
					chrval = "0" + chrval;
			}
			
			while (cmnval.length<2)
			{
					cmnval = "0" + cmnval;
			}
		
			ret = chrval + ":" + cmnval + "  " + d.toDateString();
		}
		else
		{
			ret = "No Date Specified";
		}
		
		return ret;
	}
	
	this.gethtml = function(omitFormTags)
	{
		var cval;
		
		if (me.value)
		{
			cval = me.value;
		}
		else
		{
			var dt = new Date();
			dt.setHours(0);
			dt.setMinutes(0);
			dt.setSeconds(0);
			cval = Math.floor(dt.getTime()/1000);
		}
		
		//ret = "<form onSubmit=\"ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.lookup(); return false\"><input disabled=\"true\" name=\"" + me.displaytarget + "\" value=\"" + me.formatdisplaydate(me.value) + "\" size=\"50\">";
		var ret = "";
		if (!omitFormTags) ret += "<form>";
		ret += "<input disabled=\"true\" name=\"" + me.displaytarget + "\" value=\"" + me.formatdisplaydate(me.value) + "\" size=\"20\">";
		ret += "<input type=\"hidden\" name=\"" + me.target + "\" value=\"" + me.value + "\" size=\"50\">";
		ret += "<a href=\"#\" onclick=\"showcalendar('" + me.calendarid + "', '" + cval + "', event.clientX, event.clientY)\">&nbsp;<img name=\"btn_show_" + me.calendarid + "\" src=\"images/icons/ico-calendar.gif\" border=\"0\" alt=\"Click here to enter a date\" title=\"Click here to enter a date\"></a>";
		if (!omitFormTags) ret += "</form>\n<form>";
		//ret += "<form onSubmit=\"ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.lookup(); return false\">";
		ret += "<div id=\"datetimepopup" + me.calendarid + "\" style=\"display: none; width: " + me.width + "px\">";
		ret += "<table class=\"calendarsmallbackground\" cellpadding=\"3\" cellspacing=\"0\">";
		ret += "<tr>";
		ret += "<td>";
		ret += "<div id=\"calendar" + me.calendarid + "\" style=\"margin: 5px; border: 1px solid #666666\"></div>";
		ret += "<div id=\"timesettings\" style=\"margin: 5px\"><input name=\"calendar-hour" + me.calendarid + "\" size=\"2\" maxlength=\"2\" style=\"text-align: center\" title=\"Hour\" onChange=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.updateTime()\">&nbsp;:&nbsp;<input name=\"calendar-minutes" + me.calendarid + "\" size=\"2\" maxlength=\"2\" style=\"text-align: center\" title=\"Minutes\" onChange=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.updateTime()\"></div>";
		ret += "<div id=\"datelookup" + me.calendarid + "\" style=\"margin: 5px; vertical-align: top; display:none; background-color: #cccccc; width: 100%; padding: 5px\" width=\"100%\">";
		ret += "<input name=\"calendar-lookup" + me.calendarid + "\"><a href=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.lookup()\"><img src=\"images/icons/ico-search.gif\" alt=\"Look Up\" border=\"0\"></a>";
		ret += "</div>";
		ret += "</td>";
		ret += "<td width=\"20\" valign=\"top\">";
		ret += "	<table height=\"80\">";
		ret += "	<tr>";
		ret += "	<td>";
		ret += "	<a href=\"#\"><img src=\"images/icons/ico-help.gif\" alt=\"\" border=\"0\"><a></td>";
		ret += "	</tr>";
		ret += "	<tr>";
		ret += "	<td>";
		ret += "	<a href=\"#\" onClick=\"ccal=calendarboxes['" + me.calendarid + "'];ccal.toggleLookupBox()\"><img id=\"btn-lookup" + me.calendarid + "\" src=\"images/icons/ico-calendar-searchgray.gif\" border=\"0\">";
		ret += "	</td>";
		ret += "	</tr>";
		ret += "	<tr>";
		ret += "	<td align=\"center\">-";
		ret += "	</td>";
		ret += "	</tr>";
		ret += "	<tr>";
		ret += "	<td>";
		ret += "	<a href=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.hide('revert')\"><img src=\"images/icons/ico-delete-on.gif\" border=\"0\" alt=\"Cancel and revert to stored date\"></a>";
		ret += "	</td>";
		ret += "	</tr>";
		ret += "	<tr>";
		ret += "	<td>";
		ret += "	<a href=\"javascript:ccal=calendarboxes['" + me.calendarid + "'];if (ccal) ccal.hide()\"><img src=\"images/icons/ico-tick-on.gif\" border=\"0\" alt=\"Accept new entry\">";
		ret += "	</td>";
		ret += "	</tr>";
		ret += "	</table>";
		ret += "</td>";
		ret += "</tr>";
		ret += "</table>";
		ret += "</div>";
		if (!omitFormTags) ret += "</form>";
		
		return ret;
		
	}

	this.hide = function(update)
	{
		//dc = findObj("datetimepopup" + me.calendarid);
		dc = findObj("datetimepopup" + me.calendarid);
		cd = findObj("calendar-date" + me.calendarid);
		
		if (update=="revert")
		{
			if (typeof(me.revertvalue)!="undefined")
			{
				chr = findObj("calendar-hour" + me.calendarid);
				cmn = findObj("calendar-minutes" + me.calendarid);
				
				tdt = new Date(me.revertvalue * 1000);
				
				//alert(me.value + "=> " + me.revertvalue);
				//alert(tdt);
				
				chr.value = tdt.getHours();
				cmn.value = tdt.getMinutes();
				
				me.setvalue(me.revertvalue, true);			
			}
		}
		else if (update)
		{
			cval = cd.value;
			tg = findObj(me.target);
			tg.value = cval;
			//me.setdisplaytext();
			//alert("setting value");
			me.setvalue(false, true);
			//me.callOnChangeHandler();
		}
		else
		{
			me.updateTime();
		}

		dc.style.display = "none";
		
	}
	
	this.setdisplaytext = function()
	{
		if (dt = findObj(me.displaytarget))
		{
			/*
			var d = new Date(me.value * 1000);
			
			chrval = String(d.getHours());
			cmnval = String(d.getMinutes());
			
			while (chrval.length<2)
			{
					chrval = "0" + chrval;
			}
			
			while (cmnval.length<2)
			{
					cmnval = "0" + cmnval;
			}
	
			dt.value = chrval + ":" + cmnval + "  " + d.toDateString();
			*/
			dt.value = me.formatdisplaydate(me.value);
			
		}

	}
	
	this.setvalue = function(value, keephidden, keeptime)
	{
		target = String(me.target);
		displaytarget = String(me.displaytarget);
	
		//alert(me.target);
		
		tg = findObj(me.target);
		dtg = findObj(me.displaytarget);
		
		cd = findObj("calendar-date" + me.calendarid);
		chr = findObj("calendar-hour" + me.calendarid);
		cmn = findObj("calendar-minutes" + me.calendarid);
		
		if (value)
		{
			calendarvalue = value;
			me.value = value;
		}
		else
		{
			calendarvalue = me.value;
		}
		
		/*
		cdd = new Date(calendarvalue);
		cdd.setHours(0);
		cdd.setMinutes(0);
		cdd.setSeconds(0);
		
		cd.value = cdd.toString();
		*/
		
		valuedate = parseInt(calendarvalue);
		valuedate = new Date(valuedate * 1000);
		
		if (keeptime)
		{
			if (ichr = parseInt(chr.value))
			{
				//alert(ichr);
				valuedate.setHours(ichr);
			}
			
			if (icmn = parseInt(cmn.value))
			{
					valuedate.setMinutes(icmn);
			}
		}
		
		tg.value = valuedate.getTime()/1000;
		me.value = tg.value;
		
		chrval = String(valuedate.getHours());
		cmnval = String(valuedate.getMinutes());
		
		//alert(chrval);
		while (chrval.length<2)
		{
				chrval = "0" + chrval;
		}
		
		while (cmnval.length<2)
		{
				cmnval = "0" + cmnval;
		}
	
		if (isNaN(parseInt(chrval)))
		{
			chr.value = "00";
		}
		else
		{
			chr.value = chrval;
		}

		if (isNaN(parseInt(chrval)))
		{
			cmn.value = "00";
		}
		else
		{
			cmn.value = cmnval;
		}
		
		//alert("hour = " + chrval + ", minutes = " + cmnval);
		me.setdisplaytext();
	
		if (!keephidden) me.show();
	}

	this.toggleLookupBox = function()
	{
		fl = findObj("datelookup" + me.calendarid);
		bl = findObj("btn-lookup" + me.calendarid);
		
		if (fl.style.display == "none")
		{
			fl.style.display = "";
			bl.src = "images/icons/ico-calendar-lookup.gif";
		}
		else
		{
			fl.style.display = "none";
			bl.src = "images/icons/ico-calendar-searchgray.gif";
		}
	}
	
	this.updateTime = function()
	{
		calendarvalue = me.value;
		
		target = String(me.target);
		displaytarget = String(me.displaytarget);
	
		//alert(me.target);
		tg = findObj(me.target);
		dtg = findObj(me.displaytarget);
		
		cd = findObj("calendar-date" + me.calendarid);
		chr = findObj("calendar-hour" + me.calendarid);
		cmn = findObj("calendar-minutes" + me.calendarid);
		
		calendarvalue = cd.value;
		
		valuedate = parseInt(calendarvalue);
		valuedate = new Date(valuedate * 1000);
		
		if (isNaN(ichr = chr.value)==false)
		{
			valuedate.setHours(ichr);
			//alert("hour = " + chr.value + " => " + ichr);
		}
		
		if (isNaN(icmn = cmn.value)==false)
		{
			//alert("minute = " + cmn.value + " => " + icmn);
			valuedate.setMinutes(icmn);
		}
			
		tg.value = valuedate.getTime()/1000;
		me.setvalue(tg.value, true);
		//me.setdisplaytext();
		
		//me.show();
	}
	
	this.lookup = function()
	{
		calendarid = me.calendarid
		
		clu = findObj("calendar-lookup" + calendarid);
		dlu = findObj("datelookup" + calendarid);
		
		if (clu.value&&dlu.style.display!="none")
		{
			var params = new Array();
			
			params[0] = clu.value;
			params[1] = me.value;
			params[2] = new Array();
			params[2][0] = calendarid;
			params[2][1] = me.target;
			params[2][2] = me.displaytarget;
			
			call_object_method("cms_calendar", "lookupdate", "", params, false, me.lookupcallback);
		}
	}
	
	this.lookupcallback = function()
	{
		if (xmlhttp.readyState == "4")
		{
			ret = eval(xmlhttp.responseText);
			if (ret["timestamp"]==-1)
			{
				alert("Could not find a matching date");
			}
			else
			{		
				cd = findObj("calendar-date" + me.calendarid);
				ch = findObj("calendar-hour" + me.calendarid);
				cm = findObj("calendar-minutes" + me.calendarid);
				
				dt = new Date(ret["timestamp"] * 1000);
				
				//cd.value = ret["timestamp"];
				ch.value = dt.getHours();
				cm.value = dt.getMinutes();
		
				ajax_reset();
				me.setvalue(ret["timestamp"]);
				//setcalendarvalue(ret["passthru"][0], ret["passthru"][1], ret["passthru"][2], ret["timestamp"])
			}
		}
	}
	
}