/////////////////////////////////////////////////////////////////////////////

function EnableFields(myform, fields, enable)
{
	// convert string to 1x1 array
	if (typeof fields == 'string')
		fields = new Array(fields);
	
	// go through entire list and enable/disable form fields
	for (var f in fields)
	{	
		if (myform.elements[fields[f]])
			myform.elements[fields[f]].disabled = !enable;
	}
}

/////////////////////////////////////////////////////////////////////////////

function EnableDates(myform, fields, enable)
{
	// convert string to 1x1 array
	if (typeof fields == 'string')
		fields = new Array(fields);
	
	// go through entire list and generate list of date fields
	var date_fields = new Array();
	for (var f in fields)
	{	
		date_fields.push(fields[f]+'_year');
		date_fields.push(fields[f]+'_month');
		date_fields.push(fields[f]+'_day');
	}
	
	// enable/disable form fields
	EnableFields(myform, date_fields, enable);
}

/////////////////////////////////////////////////////////////////////////////

function SetDate(myform, field_name, y, m, d)
{
	var fields = new Array();	
		fields.push(new Array('year', y));
		fields.push(new Array('month', m));
		fields.push(new Array('day', d));
		
	for (j=0; j<fields.length; j++)
	{
		key 	= field_name+'_'+fields[j][0];
		value 	= fields[j][1];
		
		for (i=0; i<myform[key].length; i++)
		{
			if (myform[key].options[i].value==value)
			{
				myform[key].options[i].selected = true;
				break;
			}
		}
	}
}

/////////////////////////////////////////////////////////////////////////////

var g_year 	= new Object;
var g_month = new Object;
var g_day 	= new Object;

function SaveDate(myform, field_name)
{
	g_year[field_name] 	= myform[field_name+'_year'].options[myform[field_name+'_year'].selectedIndex].value;
	g_month[field_name] = myform[field_name+'_month'].options[myform[field_name+'_month'].selectedIndex].value;
	g_day[field_name] 	= myform[field_name+'_day'].options[myform[field_name+'_day'].selectedIndex].value;
}

function RevertDate(myform, field_name)
{
	SetDate(myform, field_name, g_year[field_name], g_month[field_name], g_day[field_name]);
}

/////////////////////////////////////////////////////////////////////////////

function ValidEmail(email)
{
	return ( (email!="") && (email.match(/^(\w|\-|\_|\.)+\@((\w|\-|\_)+\.)+[a-zA-Z]{2,}$/i)) );	
}

function ValidateEmail(email)
{
	return ValidEmail(email);
}

/////////////////////////////////////////////////////////////////////////////

var collapsibles = new Object();

function HighlightCollapsible(obj, hilight, click)
{
	if (hilight==undefined)
		hilight = true;
		
	if (click==undefined)
		click = false;
	
	table = document.getElementById(obj.id.substr(0, obj.id.lastIndexOf('_header')));
	
	if (obj && table)
	{
		if (hilight)
		{
			collapsibles[obj.id] = obj.className;
			
			if (click)
			{
				if (table.className=='formPanel_hidden')
					obj.className='CollapsibleHeader_off';
				else
					obj.className='CollapsibleHeader_on';
					
				collapsibles[obj.id] = obj.className;
			}
			else
			{
				obj.className = 'CollapsibleHeader_on';
			}
		}
		else
		{
			obj.className = collapsibles[obj.id];
		}
	}
}

/////////////////////////////////////////////////////////////////////////////

function ToggleVisibility(id)
{
	var obj = document.getElementById(id);
	if (obj)
		obj.style.display = (obj.style.display=='none')?'block':'none';
}

/////////////////////////////////////////////////////////////////////////////

function ToggleArrow(id, arrow)
{
	if (typeof arrow == 'string')
		arrow = document.getElementById(arrow);
		
	var obj = document.getElementById(id);
	obj.className = obj.className=='formPanel_hidden'?'formPanel_visible':'formPanel_hidden';
	arrow.src = obj.className=='formPanel_hidden'?'../_img/arrow_closed.gif':'../_img/arrow_opened.gif';
}

/////////////////////////////////////////////////////////////////////////////

function ToggleCheckbox(checkbox, id)
{
	var status = document.getElementById(id);
	if (!status) return;
	
	if (status.innerHTML)
	{			
		if (checkbox.checked)
			status.innerHTML = 'Yes';
		else
			status.innerHTML = 'No';
	}
}

/////////////////////////////////////////////////////////////////////////////

function UpdateRelatedCheckboxes(checkbox, id, list)
{
	ToggleCheckbox(checkbox, id);
	for (i=0; i<list.length; i++)
	{
		list[i][0].checked = false;
		ToggleCheckbox(list[i][0], list[i][1]);
	}
}

/////////////////////////////////////////////////////////////////////////////

function GetAjax()
{
	var ajax = false;
	
	// Firefox/Mozilla/Safari
	if(window.XMLHttpRequest)
	{
		try {
			ajax = new XMLHttpRequest();
		} catch(e) {
			ajax = false;
		}
	// Internet explorer
	} 
	else if(window.ActiveXObject) 
	{
		try {
			ajax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				ajax = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				ajax = false;
			}
		}
	}
	
	return ajax;
}

/////////////////////////////////////////////////////////////////////////////

function trace(msg, expand_obj)
{
	if (expand_obj==undefined)
		expand_obj = true;

	var msg_box = document.getElementById('trace_window');
	if (!msg_box)
		return;
	else
		if (msg==undefined)
			msg_box.innerHTML = '';
		else
			if (expand_obj)
				msg_box.innerHTML += print_r(msg) + "<br />\n";
			else
				msg_box.innerHTML += msg + "<br />\n";
}

/////////////////////////////////////////////////////////////////////////////

function trace_clear()
{
	var msg_box = document.getElementById('trace_window');
	if (!msg_box)
		return;
	else
		msg_box.innerHTML = '';
}

/////////////////////////////////////////////////////////////////////////////

function print_r(obj)
{
	if (typeof(obj)=="string")
		return obj;

	var str = obj + "<br />\n";
	for (var k in obj)
	{
		str += k + ": "+typeof(obj[k])+((typeof(obj[k])=="number" || typeof(obj[k])=="string")?' ('+obj[k]+')':'')+"<br />\n";
	}
	return str;
}

/////////////////////////////////////////////////////////////////////////////

function toPx(number)
{
	return number+'px';	
}

/////////////////////////////////////////////////////////////////////////////

function fromPx(number)
{
	return parseInt(number);	
}

/////////////////////////////////////////////////////////////////////////////

function isCanadianProvince(prov)
{	
	return (prov=="AB" || prov=="BC" || prov=="MB" || prov=="NB" || 
			prov=="NF" || prov=="NT" || prov=="NS" || prov=="NU" || 
			prov=="ON" || prov=="PE" || prov=="QC");
}

/////////////////////////////////////////////////////////////////////////////

function AddOnload(func)
{	
	var oldonload = window.onload;
	if (typeof window.onload != 'function'){
    	window.onload = func;
	} else {
		window.onload = function(){
		oldonload();
		func();
		}
	}
}

/////////////////////////////////////////////////////////////////////////////

function GetRadioVal(radioObj)
{
	for (i=0; i<radioObj.length; i++)
	{
		if (radioObj[i].checked)
			return radioObj[i].value;
	}

	return null;
}

/////////////////////////////////////////////////////////////////////////////

function GetListVal(listObj)
{
	return listObj.options[listObj.selectedIndex].value;
}

/////////////////////////////////////////////////////////////////////////////

function ClearRadios(radioObj)
{
	for (i=0; i<radioObj.length; i++)
		radioObj[i].checked = false;
}

/////////////////////////////////////////////////////////////////////////////

function ErrorFocus(obj, msg)
{
	alert("ERROR:\n----------\n" + msg);
	if (obj) obj.focus();
	return false;
}

/////////////////////////////////////////////////////////////////////////////

function GetFormElement(form, elName)
{
	var el = form.elements[elName];

	if (el && !el.type)
		el.type = el[0].type;

	return el ? el : null;
}

/////////////////////////////////////////////////////////////////////////////

function RepopulateForm(form, varList)
{
	if (varList == null)
		return;

	for (i=0; i<varList.length; i++)
	{
		if (varList[i].name == "submit")
			continue;

		element = GetFormElement(form, varList[i].name);

		if (element == null)
			continue;

		else if (element.type == "text")
			element.value = varList[i].value;

		else if (element.type == "textarea")
			element.value = varList[i].value;

		else if ((String(element.type).search(/object/gi) != -1) || (element[0]) && (element[0].type == "radio"))
		{
			for (j=0; j<element.length; j++)
			{
				if (element[j].value == varList[i].value)
				{
					element[j].checked = true;
					break;
				}
			}
		}

		else if (element.type == "checkbox")
		{
			if (varList[i].value != "")
				element.checked = true;
		}

		else if (String(element.type).search(/select/gi) != -1)
		{
			if (varList[i].value != "")
			{
				for (j=0; j<element.length; j++)
				{
					if (element[j].value == varList[i].value)
					{
						element[j].selected = true;
						break;
					}
				}
			}
		}
	}
}

/////////////////////////////////////////////////////////////////////////////

var map_services = new Object();
	map_services['google'] 		= 'http://maps.google.com/maps?f=q&hl=en&q={ADDRESS}+{CITY},+{STATE}+{ZIP}&ie=UTF8';
	map_services['yahoo'] 		= 'http://maps.yahoo.com/maps_result?addr={ADDRESS}&csz={CITY},+{STATE}+{ZIP}&country=us';
	map_services['mapquest'] 	= 'http://www.mapquest.com/maps/map.adp?searchtype=address&country=US&address={ADDRESS}&city={CITY}&state={STATE}&zipcode={ZIP}';
	map_services['msn'] 		= 'http://maps.msn.com/home.aspx?strt1={ADDRESS}&city1={CITY}&stnm1={STATE}&zipc1={ZIP}&cnty1=0';

/////////////////////////////////////////////////////////////////////////////

function GetMapLink(myform, map_field, service)
{		
	if (map_services[service])
	{
		var str = map_services[service];
		str = str.replace(/\{ADDRESS\}/, escape(myform.address.value + ' ' + myform.address2.value));
		str = str.replace(/\{CITY\}/, escape(myform.city.value));
		str = str.replace(/\{STATE\}/, escape(myform.state[myform.state.selectedIndex].value));
		str = str.replace(/\{ZIP\}/, escape(myform.zip.value));
		
		map_field.value = str;
	}
}

/////////////////////////////////////////////////////////////////////////////

function CheckAll(myform, radio_name, checked)
{
	for (var i=0; i<myform.elements.length; i++)
	{
		if (myform.elements[i].name==radio_name)
			myform.elements[i].checked = checked;
	}
}

/////////////////////////////////////////////////////////////////////////////

function CardinalNum(num)
{
	var suffix = '';
	num = Number(num);
	var num_str = new String(num);
	var last_num = num_str.charAt(num_str.length-1);
	
	if (num!=11 && last_num=='1')
		suffix = 'st';
	else if (num!=12 && last_num=='2')
		suffix = 'nd';
	else if (num!=13 && last_num=='3')
		suffix = 'rd';
	else
		suffix = 'th';
		
	num_str = num_str+suffix
	
	return num_str;
}

/////////////////////////////////////////////////////////////////////////////

function GetMonthName(month, full_name)
{
	var name = '';
	full_name = full_name==undefined?true:full_name;
	
	switch (Number(month))
	{
		case 0: name = full_name?"January":"Jan"; break;
		case 1: name = full_name?"February":"Feb"; break;
		case 2: name = full_name?"March":"Mar"; break;
		case 3: name = full_name?"April":"Apr"; break;
		case 4: name = full_name?"May":"May"; break;
		case 5: name = full_name?"June":"Jun"; break;
		case 6: name = full_name?"July":"Jul"; break;
		case 7: name = full_name?"August":"Aug"; break;
		case 8: name = full_name?"September":"Sep"; break;
		case 9: name = full_name?"October":"Oct"; break;
		case 10: name = full_name?"November":"Nov"; break;
		case 11: name = full_name?"December":"Dec"; break;
	}
	
	return name;
}

/////////////////////////////////////////////////////////////////////////////

function GetDayOfWeek(day, full_name)
{
	var name = '';
	full_name = full_name==undefined?true:full_name;
	
	switch (Number(day))
	{
		case 0:	name = full_name?"Sunday":"Sun"; break;
		case 1:	name = full_name?"Monday":"Mon"; break;
		case 2:	name = full_name?"Tuesday":"Tue"; break;
		case 3:	name = full_name?"Wednesday":"Wed"; break;
		case 4:	name = full_name?"Thursday":"Thu"; break;
		case 5:	name = full_name?"Friday":"Fri"; break;
		case 6:	name = full_name?"Saturday":"Sat"; break;
	}
	
	return name;
}

/////////////////////////////////////////////////////////////////////////////

function GetDateRepeatString(repeat, year, month, day, end_year, end_month, end_day)
{	
	// ----------
	// constants
	// ----------
	var BEC_EVENT_REPEAT_NONE = 0;
	var BEC_EVENT_REPEAT_RANGE = 1;
	var BEC_EVENT_REPEAT_WEEKLY = 2;
	var BEC_EVENT_REPEAT_BIWEEKLY = 3;
	var BEC_EVENT_REPEAT_MONTHLY_DAY = 4;
	var BEC_EVENT_REPEAT_MONTHLY_WEEK = 5;
	var BEC_EVENT_REPEAT_YEARLY = 6;
	// ----------
	
	var text = '';
	
	end_year = end_year==undefined?0:end_year;
	end_month = end_month==undefined?0:end_month;
	end_day = end_day==undefined?0:end_day;
	
	var has_end = (end_year>0 && end_month>0 && end_day>0);
	var date_start_TS = new Date(year, month-1, day);
	var first_week_TS = new Date(year, month-1, 1);
	var date_end_TS = new Date(end_year, end_month-1, end_day);

	switch (Number(repeat))
	{
		case BEC_EVENT_REPEAT_NONE:
			text = '';
			break;
		case BEC_EVENT_REPEAT_RANGE: // from m/d/Y to m/d/Y
			text = 'From '+(month+'/'+day+'/'+year)+' to '+(end_month+'/'+end_day+'/'+end_year);
			break;
		case BEC_EVENT_REPEAT_WEEKLY: // every saturday until...
			text = 'Every '+GetDayOfWeek(date_start_TS.getDay(), false);
			if (has_end)
				text += ' until '+(end_month+'/'+end_day+'/'+end_year);
			break;
		case BEC_EVENT_REPEAT_BIWEEKLY: // every other saturday until...
			text = 'Every other '+GetDayOfWeek(date_start_TS.getDay(), false);
			if (has_end)
				text += ' until '+(end_month+'/'+end_day+'/'+end_year);
			break;
		case BEC_EVENT_REPEAT_MONTHLY_DAY: // the 2nd of every month until...
			text = 'The '+CardinalNum(date_start_TS.getDate())+' of every month';
			if (has_end)
				text += ' until '+(end_month+'/'+end_day+'/'+end_year);
			break;
		case BEC_EVENT_REPEAT_MONTHLY_WEEK: // the 2nd saturday of every month until...
			var week=0;
			var dayOfWeek = first_week_TS.getDay();
			for (i=0; i<day; i++)
			{
				if (dayOfWeek>0 && dayOfWeek%7==0)
				{
					dayOfWeek = 0;
					week++;
				}
			
				dayOfWeek++;
			}
		
			text = 'The '+CardinalNum(week+1)+' '+GetDayOfWeek(date_start_TS.getDay(), false)+' of every month';
			if (has_end)
				text += ' until '+(end_month+'/'+end_day+'/'+end_year);
			break;
		case BEC_EVENT_REPEAT_YEARLY:
			text = 'Every year on '+GetMonthName(date_start_TS.getMonth(), false)+' '+CardinalNum(date_start_TS.getDate());
			if (has_end)
				text += ' until '+(end_month+'/'+end_day+'/'+end_year);
			break;
		default:
			break;
	}
	
	return text;
}
