/*
	Ajax interaction for entries page
	Copyright 2008 by Surge Internet Services Ltd
	Author: Alex Ryder
*/

/**
 * Why does js not have a string trim function built it
 */
String.prototype.trim = function() {
	// Strip leading and trailing white-space
	return this.replace(/^\s*|\s*$/g, "");
}

/**
 * Compact White space down to single spaces
 */
String.prototype.compactWhiteSpace = function() {
	// compact white-space down to single white-space
	return this.replace(/^\s+|\s+$/g, '').replace(/\s{2,}/g, ' ');
};


// check for valid email, and show/hide relevant error message
function ValidEmail(elem, errorElemId) {

	var val = "" + elem.value;
	var valid = false; 

	// ignore blank emails
	if (val == "") {
		valid = true;
		
	} else {
		var emailRegex = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b/i;
		
		// simplified email regex, see http://www.regular-expressions.info/email.html
		valid = val.match(emailRegex);
	}
	
	// match success, hide error message
	if (valid) {
		$(errorElemId).hide();
	} else {
		$(errorElemId).show();
	}		
}


// show dialog
function GenericDialogShow(dialog, saveButton, cancelButton, addLink) {
	saveButton.value = "Save";
	saveButton.disabled = false;
	cancelButton.show();
	cancelButton.disabled = false;	
	addLink.hide();
	dialog.show();
}

/* OFFICIALS *******************************************************/
function OfficialAddDialog() {
	GenericDialogShow($('divOfficialDialog'), $('OfficialSaveButton'), $('OfficialCancelButton'), $('OfficialAddLink'));
	// set focus to first data entry field
	$('OfficialName').focus();	
}

// OFFICIAL CANCEL ACTION
function OfficialCancelAction() {
	$('divOfficialDialog').hide();
	$('OfficialForm').reset();
	$('OfficialAddLink').show();
	$('divOfficialErrorMsg').hide();		
}

// SAVE OFFICIAL ACTION
function OfficialSaveAction(url) {
	// change save button so it says saving
	$('OfficialSaveButton').value = "Saving...";
	$('OfficialSaveButton').disabled = true;
	$('OfficialCancelButton').hide();
	$('divOfficialErrorMsg').hide();		
			
	var tpl = new Template(	
		"<tr id=\"OfficialRow#{OfficialId}\" class=\"tableRow\" onmouseover=\"this.style.background='#eeeeee'\" onmouseout=\"this.style.background='white'\">" +
	  	" <td id=\"OfficialName#{OfficialId}\" class=\"tableCell\">#{OfficialName}</td>" +
	  	" <td id=\"OfficialMobile#{OfficialId}\" class=\"tableCell\">#{OfficialMobile}</td> " +
	  	" <td class=\"tableActionCell\"><a href=\"javascript: OfficialDelete(#{OfficialId})\">Delete</a>&nbsp;</td>" +
	    "</tr>"   
	);      
	
	new Ajax.Request( url,
	{
		method:'post',
		parameters: {OfficialId: $F('OfficialId'), OfficialName: $F('OfficialName'), OfficialMobile: $F('OfficialMobile')},
		onSuccess: function(transport) 
		{
		  	var response = transport.responseText || "no response text";
		  	var parms = {OfficialId: response, OfficialName: $F('OfficialName'), OfficialMobile: $F('OfficialMobile')};
			$('OfficialTable').insert( tpl.evaluate(parms) ); 
			$('divOfficialDialog').hide();			
			$('OfficialForm').reset();	
			$('OfficialAddLink').show();						
		},
		onFailure: function(transport)
		{ 
			// display error
			$('divOfficialErrorMsg').update(transport.responseText);
			$('divOfficialErrorMsg').show();		
			$('OfficialSaveButton').value = "Save";
			$('OfficialSaveButton').disabled = false;
			$('OfficialCancelButton').show();						
		}
	 });
} 

// OFFICIAL DELETE ACTION
function OfficialDeleteAction(url, id) {
	if ( confirm("Delete " + $('OfficialName' + id).innerHTML + "?")) {
		new Ajax.Request( url,
		{
			method:'post',
			parameters: {OfficialId: id},
			onSuccess: function(transport) 
			{
			  	var response = transport.responseText || "no response text";
				$('OfficialRow' + id).remove();				
			},
			onFailure: function()
			{ 
				alert('Something went wrong...') 
				$('divOfficialsErrorNotice').insert(response);			
			}
		 });
	}
}

/* COMPETITORS *****************************************************/
function CompetitorAddDialog() {
	GenericDialogShow($('divCompetitorDialog'), $('CompetitorSaveButton'), $('CompetitorCancelButton'), $('CompetitorAddLink'));
	// set focus to first data entry field
	$('CompetitorLastName').focus();	
}

// COMPETITORS CANCEL ACTION
function CompetitorCancelAction() {
	$('divCompetitorDialog').hide();
	$('CompetitorForm').reset();
	$('CompetitorAddLink').show();
	$('divCompetitorErrorMsg').hide();				
}

// COMPETITOR SAVE ACTION
function CompetitorSaveAction(url) {
	// change save button so it says saving
	$('CompetitorSaveButton').value = "Saving...";
	$('CompetitorSaveButton').disabled = true;
	$('CompetitorCancelButton').disabled = true;
	$('divCompetitorErrorMsg').hide();		
			
	var tpl = new Template(	
		"<tr id=\"CompetitorRow#{Id}\" class=\"tableRow\" onmouseover=\"this.style.background='#eeeeee'\" onmouseout=\"this.style.background='white'\">" +
		"	<td id=\"CompetitorRank#{Id}\" class=\"tableCell\"></td>" +
		"	<td id=\"CompetitorName#{Id}\" class=\"tableCell\">#{LastName}, #{FirstName}</td>" +
		"	<td id=\"CompetitorDateOfBirth#{Id}\" class=\"tableCell\">#{DateOfBirth}</td>" +
	    "   <td class=\"tableActionCell\"><a href=\"javascript: CompetitorDelete(#{Id})\">Delete</a>&nbsp;</td>" +
		"</tr>"
	);      
	
// 	    "   <td id=\"CompetitorCustomField1#{Id}\" class=\"tableCell\">#{CustomField1}</td>" + 			
	
	var gender = $F('CompetitorGenderM') || $F('CompetitorGenderF');
	
	var customField1 = null;
	if ($('CompetitorCustomField1') != null)
		 customField1 = $F('CompetitorCustomField1');
	else
		 customField1 = null;
		 		 
	if ($('CompetitorCustomField2') != null)
		 customField2 = $F('CompetitorCustomField2');
	else
		 customField2 = null;
		 
	if ($('CompetitorCustomField3') != null)
		 customField3 = $F('CompetitorCustomField3');
	else
		 customField3 = null;
		 
	if ($('CompetitorCustomField4') != null)
		 customField4 = $F('CompetitorCustomField4');
	else
		 customField4 = null;		 		 
	
	new Ajax.Request( url,
	{
		method:'post',
		parameters: {CompetitorId: $F('CompetitorId'), CompetitorLastName: $F('CompetitorLastName'), CompetitorFirstName: $F('CompetitorFirstName'), CompetitorDateOfBirth: $F('CompetitorDateOfBirth'), CompetitorGender: gender, CompetitorCustomField1: customField1, CompetitorCustomField2: customField2, CompetitorCustomField3: customField3, CompetitorCustomField4: customField4},
		onSuccess: function(transport) 
		{
		  	var response = transport.responseText || "";
		  	
		  	// expecting id|grade_id|rank|dob|last_name|first_name

			// trim string
			response = response.trim();

		  	var lines = response.split("\r\n");
		  		  	
		  	var returnValues = lines[0].split("|");
		  	
		  	var id = returnValues[0];
		  	var grade_id = returnValues[1];
		  	var rank = returnValues[2];
		  	var dob = returnValues[3];
		  	var last_name = returnValues[4];
		  	var first_name = returnValues[5];
		  	var custom_field_1 = returnValues[6];
		  	
		  	var parms = {Id: id, LastName: last_name, FirstName: first_name, DateOfBirth: dob, CustomField1: custom_field_1 };
		  	  	
			$('CompetitorGradeTable' + grade_id).insert( tpl.evaluate(parms) ); 
			
			// allow for entering of multiple competitors, without closing 
		//	$('divCompetitorDialog').hide();			
		//	$('CompetitorAddLink').show();
		// 	
			$('CompetitorSaveButton').value = "Save";
			$('CompetitorSaveButton').disabled = false;
			$('CompetitorCancelButton').disabled = false;
			$('CompetitorForm').reset();	
			$('CompetitorFirstName').focus();			
			
			// display subhdr, if it isn't already
			$('CompetitorGradeSubHdr' + grade_id).show();				
			
			// apply new rankings to grade
			for (i=1;lines.length;i++) {
				// trim lines
				lines[i] = lines[i].trim();
			
				pair = lines[i].split('|');
				competitor_id = pair[0];
				rank = pair[1];
				
//				alert("CompetitorRank: " + i + ":" + competitor_id);
				$('CompetitorRank' + competitor_id).update(rank);
			}		

		},
		onFailure: function(transport)
		{ 
			// display error
			$('divCompetitorErrorMsg').update(transport.responseText);
			$('divCompetitorErrorMsg').show();		
			$('CompetitorSaveButton').value = "Save";
			$('CompetitorSaveButton').disabled = false;
			$('CompetitorCancelButton').show();						
		}
	 });
} 



// COMPETITOR DELETE ACTION
function CompetitorDeleteAction(url, id) {
	if ( confirm("Delete " + $('CompetitorName' + id).innerHTML + "?")) {
		new Ajax.Request(url,
		{
			method:'post',
			parameters: {CompetitorId: id},
			onSuccess: function(transport) 
			{
			  	var response = transport.responseText || "";
		  	
			  	// expecting id|grade_id + new rankings
	
				// trim string
				response = response.trim();
	
			  	var lines = response.split("\r\n");
			  	var returnValues = lines[0].split("|");
			  	var id = returnValues[0];
			  	var grade_id = returnValues[1];
			  	
				$('CompetitorRow' + id).remove();	  			  	
			  	
				//if no rankings then, we msut have deleted the last row in that grade						
				if (lines.length == 1) {
					$('CompetitorGradeSubHdr' + grade_id).hide();
				}			  	
			  			  					
				// apply new rankings to grade
				for (i=1;lines.length;i++) {
					pair = lines[i].split('|');
					competitor_id = pair[0];
					rank = pair[1];
				
					$('CompetitorRank' + competitor_id).update(rank);
				}			
							
							
			},
			onFailure: function()
			{ 
				alert('Something went wrong...') 
				$('divCompetitorErrorNotice').insert(response);			
			}
		 });
	}
}


/* ZONE TO ASSOCIATION *********************************************/
function ZoneToAssociationSaveAction(url, zoneId, associationId) {
	
	new Ajax.Request( url,
	{
		method:'post',
		parameters: {ZoneId: zoneId, AssociationId: associationId},
		onSuccess: function(transport) 
		{
			// nothing			
		},
		onFailure: function()
		{ 
			alert('Something went wrong...') 
			$('divZoneToAssociationErrorNotice').insert(response);			
		}
	 });
} 


/**** UTILITY FUNCTIONS ****/ 

/**
 * Calculate age as at
 */
function calcAgeAt(referenceDate, dob) {

 	// assume reference date is formatted YYYY-MM-DD
	var refymd = referenceDate.split("-");
	var refDate = new Date();
	refDate.setFullYear(refymd[0], refymd[1]*1-1, refymd[2]); // *1 casts string to number,  month is 0 based
	
 	// assume dob is formatted dd/mm/yyyy
 	var dobdmy = dob.split("/");
	var dobDate = new Date();
	dobDate.setFullYear(dobdmy[2], dobdmy[1]*1-1, dobdmy[0]); // *1 casts string to number, month is 0 based
	
	age = refDate.getFullYear() - dobDate.getFullYear();
	if (refDate.getMonth() - dobDate.getMonth() < 0) {
		age--;
	} else if(refDate.getMonth() - dobDate.getMonth() == 0 ) {
		if (refDate.getDate() - dobDate.getDate() < 0) {
			age--;
		}
	}

	return age;
}



/**
 * Parse String to Date Obj, throws exception if data is out of range
 * Can handle several formats
 * ddmmyy
 * ddmmyyyy
 * dd-mm-yy
 * dd-mm-yyyy
 * can handle any delimiters, eg space, hyphen, slash, dot
 */
function parseDate(dateStr) {

	// assume dmy format
	dateStr = dateStr.trim();
	
	if (dateStr == "") {
		myDate = null;
	} else {
		
		// digits only, at space delimiters
		if (dateStr.search(/^\d+$/) > -1) {
			dateStr = dateStr.substr(0,2) + " " + dateStr.substr(2,2) + " " + dateStr.substr(4);
		} else {	
			// turn all delimiters into spaces
			dateStr = dateStr.replace(/\D+/g, " ").compactWhiteSpace();
		}
			
		// split into date parts (assuming dmy order)	
		dmy = dateStr.split(" ");		

		yearInt = (dmy[2]*1);
				
		// 2 digit year, lets expand it
		if (yearInt < 100) {
			// use year 30 for century calcs 
			if (yearInt < 30 ) {
				yearInt = 2000 + yearInt;
			} else {
				yearInt = 1900 + yearInt;
			}
		} 		

		// check year is valid
		if (yearInt < 1930) {
			throw ("Invalid Year");
		}
		
		// check month is valid		
		monthInt = dmy[1]*1;
		if (monthInt < 1 || monthInt > 12) {
			throw "Invalid Month";
		}
		
		// check day of month is valid
		dayOfMonthInt = dmy[0]*1;
		if (dayOfMonthInt < 1) {
			throw "Invalid Date";
		}
		
		if (monthInt == 2) {
			// feb
			if (dayOfMonthInt > 29) {
				throw "Invalid Date";
			}		
		} else if (monthInt == 4 || monthInt == 6 || monthInt == 9 || monthInt == 11) {      
			if (dayOfMonthInt > 30) {
				throw "Invalid Date";
			}
		} else {
			if (dayOfMonthInt > 31) {
				throw "Invalid Date";
			}
		}		  
					
		myDate = new Date();
		myDate.setFullYear(yearInt, (monthInt-1), dayOfMonthInt);  // month is zero based		
	} 

	return myDate;
}