var DSAOC = {};
DSAOC.PayEvents = {};
DSAOC.TShirtEvents = {};

function googSearchInputEventFocus(obj)
{
	if (!obj.defaultText)
		obj.defaultText = obj.value;
	
	if (obj.defaultText == obj.value)
		obj.value = '';

	obj.className = '';
}
function googSearchInputEventBlur(obj)
{
	obj.value = obj.value.replace(/^[ \t]+|[ \t]+$/, '');
	if (obj.value.length == 0)
	{
		obj.className =  'search-empty';
		obj.value = obj.defaultText;
	}
}
function googSearchSubmit(obj)
{
	if (!obj.elements[0].defaultText || obj.elements[0].value == obj.elements[0].defaultText)
		return false;

	return true;
}
function highlightSubmenu()
{
	var pageRegex = /^.*\/([^#]*)/;
	var currentURL = location.href.replace(pageRegex, '$1');
	for (var x=0, uls = document.getElementsByTagName('ul'); x < uls.length; x++)
	{
		if (uls[x].className != 'sectionmenu')
			continue;
		
		for (var y=0, anchors = uls[x].getElementsByTagName('a'); y < anchors.length; y++)
		{
			if (anchors[y].href.replace(pageRegex, '$1') == currentURL)
			{
				highlightItem(anchors[y]);
				var childULs = anchors[y].parentNode.getElementsByTagName('ul');
				for (var z=0; x < childULs.length; x++)
				{
					if (childULs[z].parentNode == anchors[y].parentNode)
					{
						childULs[z].className += ' selected';
					}
				}
			}
		}
	}
}
function highlightItem(obj)
{
	obj.className = 'selected';
	if (obj.parentNode.parentNode.className == 'sectionmenu')
		return;
	
	/*
	var childULs = obj.parentNode.getElementsByTagName('ul');
	for (var x=0; x < childULs.length; x++)
		if (childULs[x].parentNode == obj)
			childULs[x].parentNode.className += ' selected';
	*/
//	$$('ul.sectionmenu li a.selected').pop().parentNode.getElementsByTagName('ul')
	
	var parentObj = obj.parentNode.parentNode;
	parentObj.className += ' selected';
	do {
		parentObj = parentObj.previousSibling;
	}
	while (!parentObj.tagName);
	highlightItem(parentObj);
}

function $(fieldName)
{
	var obj = document.getElementById(fieldName);
	return obj;
}

function prev(obj)
{
	var prevObj = obj;
	do
	{
		prevObj = prevObj.previousSibling;
	} while (prevObj.tagName == undefined);
	return prevObj;
}
function next(obj)
{
	var nextObj = obj;
	do
	{
		nextObj = nextObj.nextSibling;
	} while (nextObj!= null && nextObj.tagName == undefined);
	return nextObj;
}

function requireEmail()
{
	var emailAddr = $('email_address_for_receipt');
	if (emailAddr == null)
		emailAddr = $('email_address');
	
	if (emailAddr == null)
		return;
	
	emailAddr.isValid = function () {
		return (emailAddr.value.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) != null);
	};
	
	requireField(emailAddr);
}
function setupEmailNewsletter()
{
	$('email_newsletter').onclick = function () {
		if (this.checked)
			requireEmail();
		else
			unRequireEmail();
	};
}
function setupMailingNewsletter()
{
	$('mailing_newsletter').onclick = function () {
		if (this.checked)
			requireAddress();
		else
			unRequireAddress();
	};
}
function unRequireAddress()
{
	$('address_line_1').isValid = $('city').isValid = $('state').isValid = $('zip').isValid = function () {
		return true;
	};
	unRequireField($('address_line_1'));
	unRequireField($('city'));
	unRequireField($('state'));
	unRequireField($('zip'));
}

function requireField(field)
{
	field.parentNode.style['position'] = 'relative';	
	
	var requiredText = document.createElement('em');
	requiredText.appendChild(document.createTextNode('* Required'));
	
	field.parentNode.appendChild(requiredText);
}

function unRequireField(field)
{
	var nodes = field.parentNode.childNodes;
	var node = nodes[nodes.length-1];
	if (node.tagName.toLowerCase() == 'em')
		field.parentNode.removeChild(node);

	field.className = field.className.replace(/[ ]*errField[ ]*/g, '');
}
function unRequireEmail()
{
	var emailAddr = $('email_address');
	if (emailAddr == null)
		emailAddr = $('email_address_for_receipt');
	
	if (emailAddr == null)
		return;
	
	emailAddr.isValid = function () {
		return true;
	};
	unRequireField(emailAddr);
}
function requireAddress()
{
	$('address_line_1').isValid = $('city').isValid = $('state').isValid = function () {
		return (this.value.match(/[a-z]{2,}/i) != null);
	};
	
	$('zip').isValid = function () {
		return (this.value.match(/[0-9]{5}/i) != null);
	};
	
	requireField($('address_line_1'));
}
function requireQuantity()
{	
	var qty = $('number_of_people_quantity');
	if (qty == null)
		qty = $('quantity');
	
	qty.isValid = function () {
		var quant = Number(this.value.replace(/[^0-9]/g,'').substr(0,10));
		if (quant == Number.NaN || quant < 1)
			this.value = 1;
		else if (quant != this.value || this.value.match('.'))
			this.value = quant;
			
		updateEventTotalCost();
			
		return true;
	};
	
	qty.onblur = qty.isValid;
	
	qty.onkeyup = function () {
		if (this.value.length == 0)
			return;
		qty.isValid();
	};
	
	qty.isValid();
	
	requireField(qty);
}
function unRequireQuantity()
{
	var qty = $('number_of_people_quantity');
	if (qty == null)
		qty = $('quantity');
		
	qty.isValid = function () {return true;};
	unRequireField(qty);
}


function requireName()
{
	$('fname').isValid = $('lname').isValid = function () {
			return (this.value.match(/[a-z]{2,}/i) != null);
	};
	requireField($('lname'));
}

function requireCC()
{
	// visa has the least possible # digits at 13. max length of a CC# is 19.
	// remove anything that's not a number before checking.
	$('card_number').isValid = function() {
		
		var correctNumberOfDigits = (this.value.replace(/[^0-9]/g,'').match(/[0-9]{13,19}/) != null);
		
		if (correctNumberOfDigits && !CCchecksum())
		{
			this.parentNode.childNodes[this.parentNode.childNodes.length-1].innerHTML = '* Credit Card Number is invalid!';
			return false;
		}

		this.parentNode.childNodes[this.parentNode.childNodes.length-1].innerHTML = '* Required';
			
		return correctNumberOfDigits;
	};
	
	requireField($('card_number'));
}
function unRequireCC()
{
	$('card_number').isValid = function() {return true;}
	$('card_number').value = '';
	unRequireField($('card_number'));
}

function requireCVC()
{
	$('card_security_number').isValid = function () {
		return this.value.replace(/[^0-9]/g,'').match(/[0-9]{3,4}/) != null;
	};
	requireField($('card_security_number'));
}
function unRequireCVC()
{
	$('card_security_number').isValid = function() {return true;}
	$('card_security_number').value = '';
	unRequireField($('card_security_number'));
}
function requireExpDate()
{
	requireField($('card_exp_year'));
}

function requireDonationAmount()
{
	$('donation_amount').isValid = function () {
		var amt = Number(this.value.replace(/[^0-9.]/g,''));
		if (amt == Number.NaN)
			return false;
		
		amt = amt.toFixed(2);
		this.value = amt;

		return amt > 0;
	};
	requireField($('donation_amount'));
}

function CCchecksum()
{
	var ccnum = $('card_number').value.replace(/[^0-9]/g, '').split('');
	var checkdigit = Number(ccnum.pop());	// check digit is the last digit
	
	ccnum = ccnum.reverse();	// makes it easier to double the correct digits
	var sum = 0;

	for (var x=0; x < ccnum.length; x++)
	{
		// starting from the 2nd to last digit (rather, the last digit now
		// that we've removed the check digit), we need to double every other
		// number
		ccnum[x] = Number(ccnum[x]) * (1+!(x%2));

		if (ccnum[x] >= 10)
			ccnum[x] -= 9;
		
		sum += ccnum[x];
	}
	
	sum += checkdigit;
		
	// if this is a multiple of 10, then the CC# is valid
	return (sum % 10 == 0);
}

function limitTextAreas()
{
	var textareas = document.getElementsByTagName('textarea');
	for (var x=0; x < textareas.length; x++)
	{
		textareas[x].onkeyup = textareas[x].onkeydown = textareas[x].onblur = textareas[x].onfocus = textareas[x].isValid = function () {
			if (this.value.length > 1000)
			{			
				var scrollPos = this.scrollTop;
				this.value = this.value.substr(0, 1000);
				this.scrollTop = scrollPos;
			}
			return true;
		};
	}
}

function validateForm(form, additionalChecks)
{
	var errors = [];
	for (var elements = form.elements, x=0; x < elements.length; x++)
	{
		if(!elements[x].isValid)
			continue;


		elements[x].className = elements[x].className.replace(/[ ]*errField[ ]*/g, '');
		if (!elements[x].isValid())
		{
			elements[x].className += ' errField';
			errors.push(elements[x].title);
		}
	}
	
	if (additionalChecks != undefined)
		errors = additionalChecks(form, errors);
	
	if (!errors.length)
		return true;
	
	var errMsg = "There %% error%% found with the following field%%:\n";
	if (errors.length == 1)
		errMsg = errMsg.replace('%%', 'was an').replace('%%', '').replace('%%', '');
	else
		errMsg = errMsg.replace('%%', 'were').replace('%%', 's').replace('%%', 's');
	
	for (var x=0; x < errors.length; x++)
		errMsg += "   " + errors[x] + "\n";
	
	alert(errMsg);
	return false;
}

function atLeastOneNewsletter(form, errors)
{
	if (!$('email_newsletter').checked && !$('mailing_newsletter').checked)
		errors.push('You must choose at least one: Email and/or Mailing Newletter');
	
	return errors;
}

function eventRegisterNewEventSelected()
{
	var qty = $('number_of_people_quantity');
	if (qty == null)
		qty = $('quantity');
	
	var id = $('event_id').value;
	if (DSAOC.PayEvents[id] == undefined)
	{		
		unRequireQuantity();
		
		$('price_each').value = '';
		qty.value = '';
		
		var pricingStuff = prev(prev(prev(prev(prev($('card_number').parentNode))))); /* prev(prev(prev(prev(prev(prev($('card_number').parentNode)))))); */
		
		for (var x=0; x < 11; x++)
		{
			pricingStuff.style['display'] = 'none';
			pricingStuff = next(pricingStuff);
		}
		
		unRequireCC();
		unRequireCVC();
		
		//unRequireEmail();
	}
	else
	{
		$('price_each').innerHTML = '$' + DSAOC.PayEvents[id];

		requireQuantity();
		qty.isValid();
		
		var pricingStuff = prev(prev(prev(prev(prev(prev($('card_number').parentNode))))));
		
		for (var x=0; x < 12; x++)
		{
			pricingStuff.style['display'] = 'block';
			pricingStuff = next(pricingStuff);
		}		
		
		requireCC();
		requireCVC();
		
		//requireEmail();
	}
	
	if (DSAOC.TShirtEvents[id] == true)
	{
		$('tshirt_size').parentNode.style['display'] = 'block';
	}
	else
	{
		$('tshirt_size').parentNode.style['display'] = 'none';
	}
	
	$('event_id').onchange = eventRegisterNewEventSelected;
}

function updateEventTotalCost()
{
	var qty = $('number_of_people_quantity');
	if (qty == null)
		qty = $('quantity');
		
	
	var total = Number(DSAOC.PayEvents[ $('event_id').value ]);
	total *= Number(qty.value);
	total = total.toFixed(2);
	
	// .split('').reverse().join('') will take a string and reverse it
	// if total = 234567.89, then total now equals 98.765432
	total = total.toString().split('').reverse().join('');
	// put a comma after every 3 digits... 98.7654321 => 98.765,432,
	total = total.replace(/([0-9]{3})/g, '$1,');
	// reverse the string again and remove the leading comma. "98.765,432," => "234,567.89"
	total = total.split('').reverse().join('').replace(/^,/, '');
	
	$('total_cost').innerHTML = '$' + total;
}


function documentOnLoad(func)
{
	// found @ http://dean.edwards.name/weblog/2006/06/again/, and then slightly modified
	if (/WebKit/i.test(navigator.userAgent)) { // sniff
	  var _timer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
		  clearInterval(_timer);
		  func(); // call the onload handler
		}
	  }, 10);
	}
	else if (document.addEventListener) {
	  document.addEventListener("DOMContentLoaded", func, false);
	}

	// for Internet Explorer (using conditional comments)
	/*@cc_on @*/
	/*@if (@_win32)
	var id = '__ie_onload' + Math.round(Math.random() * Math.pow(10,10));
	document.write("<script id="+id+" defer src='//:'><\/script>");
	var script = document.getElementById(id);
	script.onreadystatechange = function() {
	  if (this.readyState == "complete") {
		func(); // call the onload handler
	  }
	};
	/*@end @*/
}

documentOnLoad(highlightSubmenu);
