var carriers = null;
var countries = null;
var oldEmail = null;
var oldPhone = null;
var signup = {}
var formdata = newFormData();

function newFormData() {
	return {username:"", email:"", passwrd:"", passwrd_verify:"", country:"US", postalCode:"", birthMonth:"01", birthDay:"01", birthYear:"2006", gender:"", referral:"", phoneNumber:"", phoneCarrier:""};
}

function accountCreated(){
	nd();
	window.location = _AX + "/account_created.htm";
}

function accountError(msg, exception) {
	nd();
	var output = "We are unable to complete your request at this time.";
	
	if (msg == "An account with that screen name already exists.") {
		starItem("usernameError");
	    output = msg;
	} else if (msg == "An account with that email address already exists.") {
	    starItem("emailError");
	    output = msg;
	} else if (msg.substring(0, 20)  == "You must be at least") {
	    formdata = newFormData();
		output = msg;
	} else if (msg.substring(0, 35)  == "This email belongs to someone under"){
	    formdata = newFormData()
		output = msg;
	}
	
	alert(output);
}

function accountUpdated(data){
	if(data != null){
		window.location = _AX + "/userHome.htm?id=" + data;
	}
	else{
		accountError("", "");
	}
}

function allValidChars(email) {
  var parsed = true;
  var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
  for (var i=0; i < email.length; i++) {
    var letter = email.charAt(i).toLowerCase();
    if (validchars.indexOf(letter) != -1)
      continue;
    parsed = false;
    break;
  }
  return parsed;
}

function cancelSignUp(){
	var cancel = confirm("Are you sure you want to cancel?");
	if (cancel){
		window.location = _AX + "/home.htm";
	}
}

function cancelUpdate(data){
	var cancel = confirm("Are you sure you want to cancel?");
	if (cancel){
		window.location = _AX + "/userHome.htm?id=" + data;
	}
}

function checkBirthdate(birthDay, birthMonth, birthYear, suppress){
	clearItem("birthError");
	if (birthDay == "01" && birthMonth == "01" & birthYear == "2006"){
		if(!suppress){alert("Please enter your birth date.");};
		starItem("birthError");
		return 1;
	} else {
		return 0;
	}
}

function checkCaptcha(captcha, suppress){
	var captchaInput = getElement("captcha");
	clearItem("captchaError");
	if(captcha == ""){
		if(!suppress){alert("Please enter a verification code.");};
		starItem("captchaError");
		captchaInput.value = "";
		return 1;	
	}
	if(!validCaptcha(captcha) || suppress){
		if(!suppress){alert("The verification code is invalid.");};
		var captchaImg = getElement("captchaImg");
		killChildren(captchaImg);
		// generate new captcha
		var img = document.createElement("img");
		var now = new Date();
		img.setAttribute("src", "jcaptcha/"+ now.getTime());
		captchaImg.appendChild(img);
		
		starItem("captchaError");
		captchaInput.value = "";
		return 1;	
	}
	
	return 0;
}

function checkEmail (email, suppress) {
	var emailInput = getElement("email");
    clearItem("emailError"); 
	if (email == "") {
		if(!suppress){alert("Please enter your email address.");};
		starItem("emailError");
		emailInput.value = "";
		return 1;
	} else if (!(isValidEmail(email))) { 
		if(!suppress){alert("That email address is invalid.");};
	   starItem("emailError");
	   emailInput.value = "";
	   return 1;
	}
	else if(takenEmail() == 1){
		if(!suppress){alert("That email address is already taken.");};
		starItem("emailError");
		emailInput.value = "";
		return 1;
	}
	return 0;
}

function checkGender(gender, suppress){
	clearItem("genderError");
	if(gender == ""){
		if(!suppress){alert("Please enter your gender.");};
		starItem("genderError");
		return 1;	
	}
	
	return 0;
}

function checkPassword (passwrd, suppress) {
    clearItem("passwrdError");
	if (passwrd == "") {
		if(!suppress){alert("Please enter your password.");};
		starItem("passwrdError");
		return 1;
	} else if (isErrorPassword(passwrd)) {
		if(!suppress){alert("Your password contains invalid characters.");};
		starItem("passwrdError");
		return 1;
	}
	return 0;    
}

function checkPasswordVerify (passwrd, passwrd_verify, suppress){
	clearItem("passwrdVerifyError");
	if (passwrd_verify == "") {
		if(!suppress){alert("Please verify your password.");};
		starItem("passwrdVerifyError");
		return 1;
	} else if (passwrd != passwrd_verify){
		if(!suppress){alert("The passwords you entered don't match.");};
		starItem("passwrdVerifyError");
		return 1;
	}
	return 0;
}

function checkPhoneCarrier(numberErr, phoneCarrier, suppress) {
	var phoneNumber = getElement("phoneNumber");
	clearItem("phoneCarrierError");
	if( phoneNumber.value.length != 0 && numberErr == 0 && phoneCarrier == "NUL" ){
		if(!suppress){alert("Please select your phone carrier.");};
		starItem("phoneCarrierError");
		return 1;
	}

	return 0;    
}

function checkPhoneNumber (phoneNumber, suppress) {
    var illegalChars = /[\D]/; // allow only numbers
	
	var phoneInput = getElement("phoneNumber");
	var phoneCarrier = getElement("phoneCarrier");
	clearItem("phoneNumberError");

	if (phoneNumber.length > 10 ){
		if(!suppress){alert("Invalid phone number.");};
		starItem("phoneNumberError");
		phoneInput.value = "";
		return 1;
	}
	if (phoneNumber.length == 0 && phoneCarrier.value != "NUL"){
		if(!suppress){alert("Please enter your phone number.");};
		starItem("phoneNumberError");
		phoneInput.value = "";
		return 1;	
	}
	if (phoneNumber.length > 0 && phoneNumber.length <= 10) {
		if (phoneNumber.length < 10 || illegalChars.test(phoneNumber)) {
			if(!suppress){alert("Invalid phone number.");};
			starItem("phoneNumberError");
			phoneInput.value = "";
			return 1;
		}
	}
	if (takenPhone() == 1){
		if(!suppress){alert("That phone number is already taken.");};
		starItem("phoneNumberError");
		phoneInput.value = "";
		return 1;
	}
	return 0;    
}

function checkPostalCode (postalCode, suppress) {
    var illegalChars = /[\D_]/; // allow only letters and numbers
	clearItem("postalCodeError");
	var cntry = getElement("country");
	if (cntry.value == "US"){
		if (postalCode == "") {
			if(!suppress){alert("Please enter your postal code");};
			starItem("postalCodeError");
			return 1;
		} else if (illegalChars.test(postalCode) || postalCode.length != 5) {
			if(!suppress){alert("Invalid postal code.");};
			starItem("postalCodeError");
			return 1;
		} else {
			return 0;    
		}
	} else {
		return 0;
	}
}

function checkUsername(username, suppress) {
	var nameInput = getElement("username");
	clearItem("usernameError");
	if (username == "") {
		if(!suppress){alert("Please enter a username.");};
		starItem("usernameError");
		nameInput.value = "";
		return 1;
	}
	else if(takenUsername(username) == 1){
		if(!suppress){alert("That username is already taken.  Please choose another one.");};
		starItem("usernameError");
		nameInput.value = "";
		return 1;
	}
		
	return 0;
}   

function cleanPhoneNumber(number){
	number = number.replace( /^1/g,"");
	number = number.replace( /[()]/g,"");
	number = number.replace( /\s/g, "");
	number = number.replace( /\-/g, "" );
	return number;
}

function getGender(){
	var gens = document.getElementsByName("gender");
	for (var i=0; i < gens.length; i++){
		if (gens[i].checked) {
     		return(gens[i].value);
   		}
  	}
	return "";
}

function getSuppress(error){
	if(error > 0){
		return true;
	}
	
	return false;
}

function initPassRecover(){
	var right = getElement("right");
	killChildren(right);
	
	var recover = '<div id="secondaryRight">';
		recover += 'Forgot your password?';
		recover += '<p>Please supply either piece of information below and you will be sent an email with a reminder of your username and password.</p>';
		recover += '<p>Enter your Cellblock username:</p>';
		recover += '<form name="recoverUsername" action="" onSubmit="passwordRecovery(\'username\'); return false;">';
		recover += '<input type="text" id="usernameReminder"> ';
		recover += '<input type="submit" value="Submit" /></form>';
		recover += '<p>- or -</p>';
		recover += '<p>Enter your email address:</p>';
		recover += '<form name="recoverUsername" action="" onSubmit="passwordRecovery(\'email\'); return false;">';
		recover += '<input type="text" id="emailReminder"> <input type="submit" value="Submit" />';
		recover += '</form>';
		recover += '<div id="message" style="color:red"></div>';
		recover += '</div>';
				
	right.innerHTML = recover;
}

function isValidEmail(email) {
    if (! allValidChars(email)) {  // check to make sure all characters are valid
        return false;
    }
    if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
        return false;
    } else if (email.lastIndexOf(".") < email.indexOf("@")) {  // last dot must be after the @
        return false;
    } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
        return false;
    } else if (email.indexOf("..") >=0) { // two periods in a row is not valid
		return false;
    } else if (email.lastIndexOf(".") == (email.length-1)) {  // . must not be the last character
		return false;
    }
    return true;
}

function passwordRecovery(source) {
	var inputSource = source;
	if (inputSource == 'username') {
		var usernameInput = getElement("usernameReminder");
		var recoverUsername = usernameInput.value;
		accountController.recoverAccountInfo(0, recoverUsername, passwordRecoveryConfirm);
		
	} else if (inputSource == 'email') {
		var emailInput = getElement("emailReminder");
		var recoverEmail = emailInput.value;
		accountController.recoverAccountInfo(1, recoverEmail, passwordRecoveryConfirm);
	}
	
}

function passwordRecoveryConfirm(data) {
	var message = getElement("message");
	killChildren(message); 
	if (data) {
		var rtrnToLog = getElement("returnToLogin");
		killChildren(rtrnToLog);		
		message.appendChild(textNode("An email with your username and password has been sent."));
	} else {
		message.appendChild(textNode("There is no account information for the username or email address you supplied."));
	}
}

function processEmailCheck(email, data) {
	var emailInput = getElement("email");
	if (!data && (emailInput.value != oldEmail)) {
		return 1;
	}	
	return 0;
}

function processPhoneCheck(number, data) {
	var phoneInput = getElement("phoneNumber");
	if(!data && cleanPhoneNumber(phoneInput.value) != oldPhone){
		return 1;
	}

	return 0;
}

function processNameCheck(Uname, data) {
	if(data){
		return 0;
	}
	return 1;
}

function takenEmail() {
	var emailInput = getElement("email");
	var email = strTrim(emailInput.value);
	var error = 1;
	accountController.checkUniqueEmail(email, {
		callback: function(data) {
		error =	processEmailCheck(email, data);
		},
		async:false
									   });
	return error;
}

function takenPhone() {
	var phoneInput = getElement("phoneNumber");
	var number = cleanPhoneNumber(phoneInput.value);
	var error = 1;
	accountController.checkUniquePhoneNumber(number, {
		callback: function(data) {				
			error = processPhoneCheck(number, data);
		},
		async:false
			 });
	return error;
}

function takenUsername() {
	var usernameInput = getElement("username");
	var Uname = strTrim(usernameInput.value);
	var error = 1;
	accountController.checkUniqueUsername(Uname, {
		callback: function(data) {				
			error = processNameCheck(Uname, data);
		},
		async:false
			 });
	return error;
}

function validCaptcha(captcha){
	var isValid = false;
	imageCaptchaController.validateCaptchaForId(captcha, {
			callback: function(data){
				isValid = data;
			}, async: false});
	return isValid;	
}

function validateAccount() {
	var data = {};
	data.captcha = strTrim(getElement("captcha").value);
	data.username = strTrim(getElement("username").value);
	data.email = strTrim(getElement("email").value);
	// trim it!
	data.passwrd = strTrim(getElement("passwrd").value);
	// trim it!
	data.passwrd_verify = strTrim(getElement("passwrd_verify").value);
	data.country = getElement("country").value;
	data.postalCode = getElement("postalCode").value;
	data.birthMonth = getElement("birthMonth").value;
	data.birthDay = getElement("birthDay").value;
	data.birthYear = getElement("birthYear").value;
	data.gender = getGender();
	data.receiveEmails = getElement("receiveEmails").checked;
	data.referral = getElement("referral").value;
	data.phoneCarrier = "";//getElement("phoneCarrier").value;
	//var number = getElement("phoneNumber").value;
	
	// strip extra phone characters
	data.phoneNumber = "";//cleanPhoneNumber(number);
	var error = 0;
    error += checkUsername(data.username, getSuppress(error));
    error += checkEmail(data.email, getSuppress(error));
    error += checkPassword(data.passwrd, getSuppress(error));
    error += checkPasswordVerify(data.passwrd, data.passwrd_verify, getSuppress(error));
    error += checkPostalCode(data.postalCode, getSuppress(error));
	error += checkBirthdate(data.birthDay, data.birthMonth, data.birthYear, getSuppress(error));
	error += checkGender(data.gender, getSuppress(error));
	//var numberErr = checkPhoneNumber(data.phoneNumber, getSuppress(error));
	//error += numberErr;
	//error += checkPhoneCarrier(numberErr, data.phoneCarrier, getSuppress(error));
	error += checkCaptcha(data.captcha, getSuppress(error));
	
	data.passwrd = escape(data.passwrd);
	
	if(error == 0){
		overlib("Creating your account ... please wait.");
		var cb = { callback:accountCreated, errorHandler:accountError};
		accountController.createNewAccount(data, cb);
	}
}
function validateUpdateAccount() {
	var data = {};
	data.email = getElement("email").value;
	// trim it!
	data.passwrd = strTrim(getElement("passwrd").value);
	// trim it!
	data.passwrd_verify = strTrim(getElement("passwrd_verify").value);
	data.country = getElement("country").value;
	data.postalCode = getElement("postalCode").value;
	var number = getElement("phoneNumber").value;
	// strip extra phone characters

	data.phoneNumber = cleanPhoneNumber(number);
	data.phoneCarrier = getElement("phoneCarrier").value;
	data.receiveEmails = getElement("receiveEmails").checked;

	var error = 0;
    error += checkEmail(data.email, getSuppress(error));
	if(data.passwrd != ""){
		error += checkPassword(data.passwrd, getSuppress(error));
	}
	if(data.passwrd != data.passwrd_verify){
    	error += checkPasswordVerify(data.passwrd, data.passwrd_verify, getSuppress(error));
	}
	
    error += checkPostalCode(data.postalCode, getSuppress(error));
	var numberErr = checkPhoneNumber(data.phoneNumber, getSuppress(error));
	error += numberErr;
		
	error += checkPhoneCarrier(numberErr, data.phoneCarrier, getSuppress(error));
	
	data.passwrd = escape(data.passwrd);
	
    if (error == 0) {
		if(data.phoneCarrier == "NUL"){
			data.phoneCarrier = null;
		}
		overlib("Updating your account ... please wait.");
		var cb = { callback:accountUpdated, errorHandler:accountError};
		profileController.updateProfile(data, cb);
	}
}
