// Constants/Globals
var baseURL = "http://regapi.betatechnologies.info/core/regapi-ajax.php";
var checkNameBaseURL = "http://regapi.betatechnologies.info/core/check-name-exists.php";

// Generic error, writing on appropriate places
function formError(message, append)
{
	$("#title_text").text("ERROR!");
	if (append)
	{
		$("#message_text").append(message);
	}
	else
	{
		$("#message_text").html(message);
	}
}

// validate email
function validateEmail(emailAddress)
{
	//testing regular expression
	var emailFilter = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$/;
	//if it's valid email
	if (emailFilter.test(emailAddress))
	{
		return true;
	}
	//if it's NOT valid
	else
	{			
		return false;
	}
}

// validate date
function validateDate(year, month, day)
{
	if (month < 1 || month > 12)
	{ // check month range
		return("Month must be between 1 and 12.");
	}

	if (day < 1 || day > 31)
	{
		return("Day must be between 1 and 31.");
	}

	if ((month==4 || month==6 || month==9 || month==11) && day==31)
	{
		return("Month " + month + " doesn`t have 31 days!");
	}

	if (month == 2)
	{ // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) 
		{
			return("February " + year + " doesn't have " + day + " days!");
		}
	}
	return ""; // date is valid
}

// jQuery main starts here

$(document).ready(function()
{
	// main
	
	$("#title_text").html("Loading...<img src=\"http://regapi.betatechnologies.info/core/indicator.gif\" alt=\"Loading...\" height=\"12\" width=\"12\" />");
	$("#fname").attr("disabled", "disabled");	// wait until JSON returns to be able to trigger
	$("#ca_btn").attr("disabled", "disabled").unbind("click");
//	$("#ca_btn").unbind("click");
	
	// Handle dates - first delete the element already inside
	$("#year_field").empty();
	var currentDate = new Date();

	var year = currentDate.getFullYear() - 17;
	var date;
	for (date = year; date >= 1900; date--)
	{
		$("#year_field").append("<option value=\"" +date+"\">" +date+ "</option>\n");
	}
	
	var regapiName = $("#regapi_container").attr("name");
	
	$.getJSON(baseURL + "?userid=" + regapiName + "&callback=?", function(msg)
	{
		if (msg.error)
		{
			// got an error; flag it and deal with messages
			formError(msg.error);
			$("#lname").empty();
			$("#sim").val("No Sim");
		}
		else
		{
			$("#title_text").html("&nbsp;");
			// $("#message_text").text("Ready!"); // redundant, since button is now turned on
			
			// Clear Last Names and add from what we have
			$("#lname").empty();
			
			for (var i in msg.names)
   			{   				
   				$("#lname").append("<option value=\"" + msg.names[i] + "\">" 
   					+ i + "</option>\n");
   			}
			
			// Set other attributes in preparation for a fully-filled form	
   			$("#sim").attr("value", msg.sim).val(msg.sim);
   			$("#x").attr("value", msg.x).val(msg.x);
   			$("#y").attr("value", msg.y).val(msg.y);
   			$("#z").attr("value", msg.z).val(msg.z);

			// set a handler for the input field for the first name, to check on it later on
			//  and enable it
			$("#fname").removeAttr("disabled").bind("change", {check_user_url: msg.urls.check_name}, isAvailableAvatar);

   			// Now we can reactivate the button and set a handler for the pseudo-submit button	
			$("#ca_btn").removeAttr("disabled").bind("click", function (regapiValues)
			{
				submitREGAPI(msg);
				return false;
			});
		}
		return false;			
	}
	);	// end JSON
	return false;
});


/* Callback for button click event:
	deals with submitting the form: retrieves manually all values, adds the ones we
	got earlier, and submits the whole lot to the same PHP script */
function submitREGAPI(regapiValues)
{	
	// check for valid values
	
	if (!$("#fname").val())
	{
		formError("No valid first name!");
		$("#fname").focus();
		return false;
	}
	if (!$("#lname").val())
	{
		formError("No last name selected!");
		$("#lname").focus();
		return false;
	}
	if (!validateEmail($("#email").val()))
	{
		formError("Invalid email address!");
		$("#email").focus();
		return false;
	}
	if (!$("#pword").val())
	{
		formError("Password cannot be empty!");
		$("#pword").focus();
		return false;
	}
	var tempCheckDate;	// validateDate returns a string
	if ((tempCheckDate = validateDate($("#year_field").val(), $("#month_field").val(), $("#day_field").val())) != "")
	{
		formError(tempCheckDate);
		$("#day_field").focus();
		return false;
	}
	
	// All validation seems to be fine; let's create the avatar
	// First, generate the very complex URL
	var regapiName = $("#regapi_container").attr("name");
		
	var createAvatarURL = baseURL + "?userid=" + regapiName +
		"&fname="	+ encodeURIComponent($("#fname").val()) +
		"&lnames="	+ $("#lname").val() +
		"&email="	+ $("#email").val() +
		"&pword="	+ $("#pword").val() +
		"&year="	+ $("#year_field").val() +
		"&month="	+ $("#month_field").val() +
		"&day="		+ $("#day_field").val() +
		"&sim="		+ encodeURIComponent(regapiValues.sim) +
		"&x="		+ regapiValues.x +
		"&y="		+ regapiValues.y +
		"&z="		+ regapiValues.z +
		"&ox="		+ regapiValues.ox +
		"&oy="		+ regapiValues.oy +
		"&oz="		+ regapiValues.oz +
		"&limit="	+ regapiValues.limit +
		"&create_user="	+ encodeURIComponent(regapiValues.urls.create_user) +
		"&get_error_codes="	+ encodeURIComponent(regapiValues.urls.get_error_codes) +
		"&callback=?";
	
	// disable submit button until RegAPI terminates
	$("#ca_btn").attr("disabled", "disabled").unbind("click");
	
	// add some visual feedback that something is happening
	$("#title_text").html("Creating avatar...<img src=\"http://regapi.betatechnologies.info/core/indicator.gif\" alt=\"Creating avatar...\" height=\"12\" width=\"12\" />");

	// since Linden Lab uses last name IDs, put the full last name inside a hidden variable
	//  which will be submitted by the form
	$("#full_lastname").val($("#lname option:selected").text());
			
	$.getJSON(createAvatarURL, function(msg)
		{
			createAvatar(msg);
		});

	return false;	// important, to disable built-in submit events
}

/* Callback to create an avatar */
function createAvatar(retValue)
{
	if (retValue.error)
	{
		// got an error; flag it and deal with messages
		formError(retValue.error);
	}
	else
	{
		$("#title_text").html("&nbsp;");
		$("#message_text").text(retValue.message);
		//alert(retValue.message);
	}
	// Now we can reactivate the button
	$("#ca_btn").removeAttr("disabled");

	// yay — now submit the form!!
	$("#regapi_form").submit();
}

/* Callback to check if an avatar is available */
function isAvailableAvatar(e)
{
	// add a spinning wheel and disable it to prevent getting incorrect typos
	$("#fname").css({'background': 'url(http://regapi.betatechnologies.info/core/indicator.gif)', 'background-color': 'white', 'background-repeat': 'no-repeat', 'background-position': 'right center'}).attr("disabled", "disabled");
	
	var checkNameURL = checkNameBaseURL + "?check_name=" + 
		encodeURIComponent(e.data.check_user_url) +
		"&fname=" + encodeURIComponent($("#fname").val()) + 
		"&lname=" + $("#lname").val() + "&callback=?"; 
/*
	var output = "e.data.check_user_url: " + e.data.check_user_url;
	alert(output);
	alert(checkNameURL);
*/
	// clean up clutter before a new call
	$("#title_text").html("&nbsp;");
	$("#message_text").html("&nbsp;");

	$.getJSON(checkNameURL, function(msg)
	{
		$("#fname").css({'background' : 'none', 'background-color': 'white'}).removeAttr("disabled");
		if (msg.error)
		{
			// got an error; flag it and deal with messages
			formError(msg.error);
			$("#fname").focus();
		}
		else
		{
			$("#message_text").text(msg.message);
		}
		return false;
	}); // end JSON
	return false;
}
