/*
 * Form Validation
 *
 * Note: Because of the asyncronous nature of AJAX I had to setup a chain of validation functions to get to the final result (http://www.gamedev.net/community/forums/topic.asp?topic_id=417180&whichpage=1&#2779618)
 */


function getHTTPObject()
{
	if (window.XMLHttpRequest) // Netscape, Mozilla, Firefox, Safari, etc
		var xmlhttp = new XMLHttpRequest();
	
	else if (window.ActiveXObject) // IE
		var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	
	return xmlhttp;
}


function getResults(url, value, callback, type, element, submit)
{
	var http = new getHTTPObject(); // may be a waste to create new XHR each time, but might solve some problems
	
	if(http)
	{
		http.open("GET", url, true);
		http.onreadystatechange = function()
		{
			if(http.readyState == 4 && http.status == 200)
				callback(http.responseText, value, type, element, submit);
		}
		http.send(null);
	}
}


function validateModel(result, value, type, element, submit)
{
	element	= document.getElementById(element);
	submit	= document.getElementById(submit);
	
	switch(type)
	{
		case 'username':
		
			if(result == "1") // No username entered
			{
				element.cells[0].innerHTML = 'You must enter a username';
				element.className = "error_show";
			}
			
			else if(result == "true") // Username already exists
			{
				element.cells[0].innerHTML = value + ' already exists. Please choose another.';
				element.className = "error_show";
			}
			
			else // Username is ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";	
			}
			
			break;
		
		case 'password':
		
			if(result == "1") // Password matches username
			{
				element.cells[0].innerHTML = 'Password cannot match username.';
				element.className = "error_show";
			}
			
			else if(result == "2") // Password.length < 5
			{
				element.cells[0].innerHTML = 'Password must be at least 5 characters.';
				element.className = "error_show";
			}
			
			else if(result == "3") // Ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";
			}
			break;
			
		case 'confirm_password':
		
			if(result == "1") // confirmpassword doesn't match password
			{
				element.cells[0].innerHTML = 'Passwords must match.';
				element.className = "error_show";
			}
			
			else // Ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";
			}
			
			break;
			
		case 'email':
		
			if(result == "1") // email was empty
			{
				element.cells[0].innerHTML = 'You must enter an e-mail address.';
				element.className = "error_show";
			}
			
			else if(result == "2") // email wasn't valid
			{
				element.cells[0].innerHTML = value + ' is not a valid e-mail address.';
				element.className = "error_show";
			}
			
			else if(result == "true") // email already in database
			{
				element.cells[0].innerHTML = value + ' is already registered.';
				element.className = "error_show";
			}
			
			else // Ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";
			}

			break;
			
		case 'forgot-login':
		
			if(result == "1") // email was empty
			{
				element.cells[0].innerHTML = 'You must enter an e-mail address.';
				element.className = "error_show";
			}
			
			else if(result == "2") // email wasn't valid
			{
				element.cells[0].innerHTML = value + ' is not a valid e-mail address.';
				element.className = "error_show";
			}
			
			else if(result == "false") // email not in database
			{
				element.cells[0].innerHTML = value + ' wasn\'t found in our records.';
				element.className = "error_show";
			}
			
			else // Ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";
			}

			break;
			
		case 'zip':

			if(result == "1") // zip not 5 digits
			{
				element.cells[0].innerHTML = 'ZIP Code must be 5 digits.';
				element.className = "error_show";
			}
			
			else // Ok
			{
				element.cells[0].innerHTML = "";
				element.className = "error_hide";
			}
			
			break;
	};
}


function validateController(type, value, element, submit)
{
	var validEmail = /^([a-zA-Z0-9_'+*$%\^&!\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9:]{2,4})+$/; // http://fightingforalostcause.net/misc/2006/compare-email-regex.php
	
	switch(type)
	{
		case 'username':
			if(value.length == 0)
				validateModel("1", value, type, element, submit);
			else
				getResults("/qualifine/models/validation/check_username.php?username=" + value, value, validateModel, type, element, submit);
			break;
			
		case 'password':
			if(value == document.getElementById("register_username").value)
				validateModel("1", value, type, element, submit);
			else if(value.length < 5)
				validateModel("2", value, type, element, submit);
			else
				validateModel("3", value, type, element, submit);
			break;
			

		case 'confirm_password':
			if(value != document.getElementById("register_password").value)
				validateModel("1", value, type, element, submit);
			else
				validateModel("2", value, type, element, submit);
			break;
		
		// should also check against db so it can't be username
		case 'reset_password':
			type = 'password';
			if(value.length < 5)
				validateModel("2", value, type, element, submit);
			else
				validateModel("3", value, type, element, submit);
			break;
			
		case 'confirm_reset_password':
			type = 'confirm_password';
			if(value != document.getElementById("reset_password").value)
				validateModel("1", value, type, element, submit);
			else
				validateModel("2", value, type, element, submit);
			break;
			
		case 'email':
			
			if(value.length == 0)
				validateModel("1", value, type, element, submit);
			else if(!validEmail.test(value))
				validateModel("2", value, type, element, submit);
			else
				getResults("/qualifine/models/validation/check_email.php?email=" + value, value, validateModel, type, element, submit);
			break;

		// updating my account info. if they don't change their e-mail, don't complain that it already exists in db
		case 'editemail':
			type = 'email';

			if(value == currentemail)
				validateModel("ok", value, type, element, submit);
			else if(value.length == 0)
				validateModel("1", value, type, element, submit);
			else if(!validEmail.test(value))
				validateModel("2", value, type, element, submit);
			else
				getResults("/qualifine/models/validation/check_email.php?email=" + value, value, validateModel, type, element, submit);
			break;
			
		case 'forgot-login':
			if(value.length == 0)
				validateModel("1", value, type, element, submit);
			else if(!validEmail.test(value))
				validateModel("2", value, type, element, submit);
			else
				getResults("/qualifine/models/validation/check_email.php?email=" + value, value, validateModel, type, element, submit);
			break;
			
		case 'zip':
			if(value.length != 0 && value.length != 5)
				validateModel("1", value, type, element, submit);
			else
				validateModel("2", value, type, element, submit);
			break;
	};
}


/*
 * Miscellaneous
 */

// fills in billing address fields based on previous address
function usePreviousAddress()
{
	document.getElementById("street_address1").value = street1;
	document.getElementById("street_address2").value = street2;
	document.getElementById("city").value = city;
	document.getElementById("state").value = state;
	document.getElementById("zip").value = zip;
}

function course_popup(url)
{
	window.open(url, "CourseDetails", "width=450, height=300, resizable=yes, scrollbars=yes");
}

function switchMenu(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	} else {
		el.style.display = '';
	}
}

function getCalendar(year, month)
{
	var http = new getHTTPObject();
	var calendar = document.getElementById("home-calendar");
	Effect.Fade(calendar, {queue: 'front', duration: '.25'});

	if(http)
	{
		calendar.style.display = 'none';
		http.open("GET", "/qualifine/views/store_controller/calendar.php?year=" + year + "&month=" + month, true);
		http.onreadystatechange = function()
		{
			
			if(http.readyState == 4 && http.status == 200)
			{
				calendar.innerHTML = http.responseText;
				Effect.Appear(calendar, {queue: 'end', duration: '.75'});				
			}
		}
		http.send(null);
	}
}

function showCourseDetails(id)
{
	if(effectInProgress == false)
	{
		effectInProgress = true;
		
		id				= document.getElementById(id);
		var news		= document.getElementById("home-news");
		var newslink	= document.getElementById("view_all_news_link");
		var coursedesc	= document.getElementById("home-course-desc");
		
		coursedesc.innerHTML = '<span class="home-section-header"><img src="/qualifine/images/layout/course-details.gif" border="0" /></span><br />' + id.innerHTML;
		
		coursedesc.style.display = "none";
		news.style.display = "none";
		newslink.style.display = "none";
		//Effect.Fade(news, {queue: 'parallel', duration: '.5'});
		Effect.Appear(coursedesc, {queue: 'parallel', duration: '.75'});
		
		effectInProgress = false;
	}
}

function showNews()
{
	if(effectInProgress == false)
	{
		effectInProgress = true;
		
		var news		= document.getElementById("home-news");
		var newslink	= document.getElementById("view_all_news_link");
		var coursedesc	= document.getElementById("home-course-desc");

		news.style.display = "none";
		coursedesc.style.display = "none";
		//Effect.Fade(coursedesc, {queue: 'parallel', duration: '.5'});
		Effect.Appear(news, {queue: 'parallel', duration: '.75'});
		Effect.Appear(newslink, {queue: 'parallel', duration: '.75'});
		
		effectInProgress = false;
	}
}

function showOtherPaymentTypes()
{
	document.getElementById("otherpay0").className = "error_hide";
	
	for(var i = 1; i < 4; i++)
		document.getElementById("otherpay" + i).className = "error_show";
	
}

// Calculations here are also done in models/course.php/generate_confirm(), so if you need to make sure they're in sync
function updateRegistrantTotals()
{
	var i, j, subtotal, total, personFullReg, numFullReg, discounts, message;
	var discountDiv 		= document.getElementById("discounts");
	var courseStartArray	= new Array();
	var discountMessages	= new Array();
	var now 				= new Date();
	var thirtyInAdvance		= new Date();

	discountDiv.innerHTML = '';
	discountDiv.style.display = 'none';
	total = numFullReg = discounts = 0;
	courseStartArray = courseStart.split('-');
	thirtyInAdvance.setFullYear(courseStartArray[0], courseStartArray[1] - 1, courseStartArray[2]);
	thirtyInAdvance.setDate(thirtyInAdvance.getDate() - 30);
		
	for(i = 1; i <= numPeople; i++)
	{
		subtotal = 0;
		personFullReg = true;
		
		for(j = 1; j <= numDays; j++)
		{
			if(document.getElementById('person' + i + 'day' + j).checked == true)
				subtotal += parseInt(document.getElementById('day' + j + 'cost').innerHTML.substr(1));
			else
				personFullReg = false;
		}
		
		// Calculate discounts for registering for all days, and for registering early using cc
		if(personFullReg)
		{
			subtotal = fullRegCost;
			numFullReg++;
			
			if(now < thirtyInAdvance)
			{
				subtotal *= .95;
				discountMessages.push('5% off for registering ' + document.getElementById('person' + i + 'name').innerHTML  + ' 30 days in advance for the entire course. Please note that you must pay online with a credit card to recieve this discount.');
			}
		}
				
		total += subtotal;
		document.getElementById('cost' + i).innerHTML = '$' + subtotal.toFixed(2);
	}
	
	if(numFullReg >= 3)
	{
		discounts += total * .05;
		discountMessages.push('5% off for registering 3 or more people for the entire course.');
	}
	
	if(discountMessages.length > 0)
	{
		discountDiv.innerHTML = '<br /><strong>Discounts:</strong><br /><em>';
		while(message = discountMessages.pop())
		{
			discountDiv.innerHTML += message + '<br />';
		}
		discountDiv.innerHTML += '</em>';
		
		discountDiv.style.display = 'inline';
	}
	
	total -= discounts;
	document.getElementById('total').innerHTML = '$' + total.toFixed(2);
}

var effectInProgress = false;						// Global flag for effects
var numPeople, numDays, fullRegCost, courseStart;	// Global vars for updateRegistrantTotals()