///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                       Copyright (c) 2003-2006                             //
//                            Marc Peterson                                  //
//                     marc.s.peterson at gmail.com                          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

// Last updated:
//   06-25-2007 - * CUSTOMIZED * for Pueblito Escondido
//   05-18-2007 - moved initCal() and useCalDay() into this include since they are used almost everywhere 
//   03-27-2007 - made calendar move up if going beyond window height (happens when icon is on bottom of screen)
//   03-09-2007 - added close bar, created closeCalendar() and parseDateStr()
//   08-16-2006 - created

// requires common.js

function buildCal(y, m, d, obj, callback_fn)
{
	// Moz, IE
	if ( !document.getElementById ) return;

	var today = new Date();
	if ( d == "" || d === undefined ) d = today.getDate();
	if ( y == "" || y === undefined ) y = today.getFullYear();
	if ( m == "" || m === undefined  ) m = today.getMonth()+1;
	y = parseInt(y);
	m = parseInt(m);

	y_today = today.getFullYear();
	m_today = today.getMonth()+1;
	d_today = today.getDate();

	var y_prev = y-1;
	var y_next = y+1;
	var m_next_y = y;
	var m_prev_y = y;
	var m_prev = m - 1;
	if ( m_prev < 1 ) { m_prev=12; m_prev_y--; }
	var m_next = m + 1;
	if ( m_next > 12 ) { m_next=1; m_next_y++; }

	var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	var days_of_month = [31,0,31,30,31,30,31,31,30,31,30,31];

	var date = new Date(y, m-1, 1);
	date.start_index = date.getDay()+1;

	var cal = document.getElementById("calendar");
	if ( cal == null )
	{
		cal = document.createElement("div");
		cal.className = "calendar";
		cal.id = "calendar";
		cal.style.position = "absolute";
		cal.style.visibility = "hidden";
		cal.style.left = "0px";
		cal.style.top = "0px";
		document.body.appendChild(cal);
		if ( obj !== undefined ) cal.call_obj = obj;
		cal.call_y = y;
		cal.call_m = m;
		cal.call_d = d;
		cal.callback = callback_fn;
	}
	
	// Determine leap year	
	days_of_month[1] = ( ((date.getFullYear()%100!=0)&&(date.getFullYear()%4==0)) || (date.getFullYear()%400==0) ) ? 29 : 28;

	var html = '<table cols="7" cellpadding="0" border="0" cellspacing="0"><tr align="center">';
	html += '<td colspan="7" align="center" class="month"><span class="left_arrow" onclick="buildCal('+m_prev_y+', '+m_prev+',\'\')">&lt;</span><span class="right_arrow" onclick="buildCal('+m_next_y+', '+m_next+',\'\')">&gt;</span>'+months[m-1]+'</td></tr>';
	html += '<tr align="center">';
	for (s=0; s<7; s++) html += '<td class="days_of_week">'+"SMTWTFS".substr(s,1)+'</td>';
	html += '</tr><tr align="center" class="week">';

	var i = 1;
	var done = false;

	while ( !done )
	{
		// If a day of the month, print it
		if ( ((i-date.start_index) >= 0 ) && ((i-date.start_index) < days_of_month[m-1]) )
		{
			var day = i - date.start_index + 1;
			if ( day == d_today  &&  m == m_today  &&  y == y_today ) html += '<td class="today" onclick="useDay('+y+','+m+','+day+')">'+day+'</td>';
			else if ( day == cal.call_d  &&  m == cal.call_m  &&  y == cal.call_y ) html += '<td class="marked" onclick="useDay('+y+','+m+','+day+')">'+day+'</td>';
			else html += '<td onclick="useDay('+y+','+m+','+day+')">'+day+'</td>';
		}
		// Not a day of the month, make an empty cell
		else
		{
			html += '<td class="empty">&nbsp;</td>'
		}

		// If the end of a week, finish the line and decide if another is to be made
		if ( (i%7) == 0 )
		{
			html += '</tr>';
			if ( i-date.start_index+1 >= days_of_month[m-1] ) done = true;		// If the last day of the month, end the loop
			else html += '<tr align="center" class="week">';						// if more days, start a new week
		}

		if ( i >= 42 ) done = true;	
		i++;
	}
	html += '<tr><td colspan="7" class="month"><span class="left_arrow" onclick="buildCal('+y_prev+', '+m+', \'\')">&lt;</span><span class="right_arrow" onclick="buildCal('+y_next+', '+m+', \'\')">&gt;</span>'+y+'</td></tr>';
	html += '<tr><td colspan="7" class="close"><span onclick="closeCalendar();" style="cursor:pointer;">close</span></td></tr>';
	html += '</table>';
	cal.innerHTML = html;


	// If cal_2 iframe doesn't exist, make it.  This ensure calendar is visible ontop of all other form elements.
	var cal_2 = document.getElementById("calendar_2");

	if ( cal_2 == null )
	{
		cal_2 = document.createElement("iframe");
		cal_2.className = "calendar_2";
		cal_2.src = null;
		cal_2.id = "calendar_2";
		cal_2.style.position = "absolute";
		cal_2.style.visibility = "hidden";
		cal_2.style.left = "0px";
		cal_2.style.top = "0px";
		cal_2.scrolling = "no";
		document.body.appendChild(cal_2);
		cal_2.style.width = getWidth(cal)+"px";
		cal_2.style.height = getHeight(cal)+"px";
		cal_2.style.border = "none";
	}

	// If a reference object was passed, move calendar next to it
	if ( obj !== undefined )
	{
		var pos		= findPosition(obj);
		var w		= getWidth(obj);
		var h		= getHeight(obj);
		var h_cal	= getHeight(cal);							// calendar height
//		var t		= pos.y + h - h_cal + 20;					// calendar aligns with bottom of field
		var t		= pos.y;									// calendar aligns with top of field
		var h_body	= document.body.parentNode.scrollHeight;	// content height
		if ( (t+h_cal) > h_body ) t -= ( (t+h_cal) - h_body + 5 );	// if calendar goes beyond content, push it up
		cal.style.left	= (pos.x+w)+10+"px";
		cal.style.top	= t+"px";
		cal.style.visibility = "visible";

		cal_2.style.left= cal.style.left;
		cal_2.style.top	= cal.style.top;
		cal_2.style.visibility = "visible";
	}
}

function closeCalendar()
{
	var cal = document.getElementById("calendar");
	if ( cal ) cal.parentNode.removeChild(cal);

	var cal_2 = document.getElementById("calendar_2");
	if ( cal_2 ) cal_2.parentNode.removeChild(cal_2);
}

function useDay(y, m, d)
{
//	alert(y+" "+m+" "+d);
	var cal = document.getElementById("calendar");
	cal.callback(y, m, d);
}

function parseDateStr(str_date)
{
	var is_date_ok = true;
	var ret = new Array();
	ret["m"] = "";	
	ret["d"] = "";	
	ret["y"] = "";	

	// try to extract the month/day/year from the date string
	if ( str_date != "" && str_date != "mm/dd/yyyy" ) 
	{
		var parts		= str_date.split("/");
		if ( parts.length == 3 )
		{
			var m = parseInt(parts[0]);
			var d = parseInt(parts[1]);
			var y = parseInt(parts[2]);
			if ( m >= 1 && m <= 12 )
			{
				if ( d >= 1 && d <= 31 )
				{
					if ( y < 10 ) y = "200"+y;
					else if ( y < 100 ) y = "20"+y;
					else if ( y < 1000 ) is_date_ok = false;
				}
				else is_date_ok = false;
			}
			else is_date_ok = false;
		}
		else is_date_ok = false;
	}
	else is_date_ok = false;

	if ( is_date_ok )
	{
		ret["m"] = m;
		ret["d"] = d;
		ret["y"] = y;
	}

	return ret;
}

function initCal(id, form_id, obj)
{
	var oForm = document.getElementById(form_id);

	// If calendar object exists, remove it
	var cal		= document.getElementById("calendar");
	var cal_2	= document.getElementById("calendar_2");
	if ( cal )
	{
		// If same object called the calendar, remove calendar and exit
		if ( cal.call_obj == obj )
		{
			cal.parentNode.removeChild(cal);
			if ( cal_2 ) cal_2.parentNode.removeChild(cal_2);
			return;
		}
		// Otherwise remove calendar and allow new one to be created
		else
		{
			cal.parentNode.removeChild(cal);
			if ( cal_2 ) cal_2.parentNode.removeChild(cal_2);
		}
	}

	date = parseDateStr(getInputValue(oForm[id]));

	buildCal(date["y"], date["m"], date["d"], obj, useCalDay);
	document.getElementById("calendar").input_id = id;
	document.getElementById("calendar").form_id = form_id
}

function useCalDay(y, m, d)
{
	var cal		= document.getElementById("calendar");
	var cal_2	= document.getElementById("calendar_2");
	var oForm	= document.getElementById(cal.form_id);
	var id		= cal.input_id;

	setInputValue(oForm[id], m+"/"+d+"/"+y);

	cal.parentNode.removeChild(cal);
	cal_2.parentNode.removeChild(cal_2);
}



