var userName; 
var userNameStatus;
var emailAddress;
var emailAddressConfirm;
var emailStatus;
var password;
var passwordConfirm;
var passwordStatus;
var firstName;
var firstNameStatus;
var lastName;
var lastNameStatus;
var birthDate;
var birthDateStatus;
var genderMale;
var genderFemale;
var genderStatus;
var zip;
var zipStatus;
var response='';
var req;
var httpSignup;
var xml;

function initializeSignup() {
	loadDom();
	loadImages();
	userName.focus();
	
	var tos_link = $('tos_link');
	tos_link.setAttribute('target', '_blank');
	
	var priv_link = $('priv_link');
	priv_link.setAttribute('target', '_blank');

	addEvent(userName, 'focus', checkUserName);
	addEvent(userName, 'blur', checkUserName);
	addEvent(userName, 'keyup', checkUserName);

	addEvent(password, 'focus', checkPassword);
	addEvent(password, 'blur', checkPassword);	
	addEvent(password, 'keyup', checkPassword);	

	addEvent(passwordConfirm, 'focus', checkPassword);
	addEvent(passwordConfirm, 'blur', checkPassword);
	addEvent(passwordConfirm, 'keyup', checkPassword);

	addEvent(emailAddress, 'focus', checkEmail);
	addEvent(emailAddress, 'blur', checkEmail);	
	addEvent(emailAddress, 'keyup', checkEmail);	
	
	addEvent(emailAddressConfirm, 'focus', checkEmail);
	addEvent(emailAddressConfirm, 'blur', checkEmail);	
	addEvent(emailAddressConfirm, 'keyup', checkEmail);	

	addEvent(firstName, 'focus', checkFirstName);
	addEvent(firstName, 'blur', checkFirstName);
	addEvent(firstName, 'keyup', checkFirstName);
	
	addEvent(lastName, 'focus', checkLastName);
	addEvent(lastName, 'blur', checkLastName);
	addEvent(lastName, 'keyup', checkLastName);

/*	
	addEvent(birthDate, 'focus', checkDate); 
	addEvent(birthDate, 'blur', checkDate); 
	addEvent(birthDate, 'keyup', checkDate); 	
	
	addEvent(genderMale, 'click', checkGender); 
	addEvent(genderMale, 'blur', checkGender); 
	addEvent(genderFemale, 'click', checkGender); 	
	addEvent(genderFemale, 'blur', checkGender); 		

	addEvent(zip, 'focus', checkZip);
	addEvent(zip, 'blur', checkZip);
	addEvent(zip, 'keyup', checkZip);	
*/
}

function loadImages() {
	var success = new Image(); success.src = "/images/blnk/success.gif"
	var failure = new Image(); failure.src = "/images/blnk/failure.gif"	
}

function loadDom() {
	
	userName = $("user_user_name");
	userNameStatus = $("user_name_status");

	password = $("user_password");
	passwordConfirm = $("user_password_confirmation");
	passwordStatus = $("user_password_status");

	emailAddress = $("user_email");
	emailAddressConfirm = $('user_email_confirmation');
	emailStatus = $("user_email_status");

	firstName = $("user_first_name");
	firstNameStatus = $("user_first_name_status");

	lastName = $("user_last_name");
	lastNameStatus = $("user_last_name_status");
	
/*
	birthDate = $("birthdate");
	birthDateStatus = $("birthDateStatus");	
	genderMale = $("genderMale");
	genderFemale = $("genderFemale");	
	genderStatus = $("genderStatus");
	zip = $("zip");
	zipStatus = $("zipStatus");
*/
}

function setSuccess(a, b) {
  a.innerHTML = '' + (b == null ? '&nbsp;' : b) + '';
  a.className = 'success';
  if (b==null){
    a.addClassName("without_message");
  }
}

function setFailure(a, b) {
  a.innerHTML = '' + (b == null ? '&nbsp;' : b) + '';
  a.className = 'failure';
}

function checkUserName() {

	var b=userName.value, c=/\W/, d=/[A-Za-z]/, e=/\w/;
	if(b=="") { 
		setFailure(userNameStatus, 'Username must be 4 - 16 characters'); return false
	} else if (!d.test(b.charAt(0))) {
		setFailure(userNameStatus, 'Username must begin with a letter'); return false;
	} else if (!e.test(b.charAt(b.length-1))) {
		setFailure(userNameStatus, 'Username must end with a letter or number'); return false;
	} else if (c.test(b)	) {
		setFailure(userNameStatus, 'Username has an invalid character'); return false;
	} else if ((b.length < 4) || (b.length > 16)) {
		setFailure(userNameStatus, 'Username must be 4 - 16 characters'); return false;
        } else if( $("perform_user_name_check") && $("perform_user_name_check").value == "false" ) {
                setSuccess(userNameStatus, userName.value + ' is available'); return false;
	} else {
        url = "/account/json_check_user_availability"
        new Ajax.Request(url,
			{
				method: 'get',
				parameters: 'user_name=' + b,
				onComplete: setUserExist
			});
	}
}

function setUserExist(request) {
	var isAvailable = request.responseText
	
	if(isAvailable == 'true') {
		setSuccess(userNameStatus, userName.value + ' is available'); return false;
	} else if (isAvailable == 'false') {
		setFailure(userNameStatus, userName.value + ' is not available'); return false;
	} else {
		setFailure('Unknown error, maybe its available'); return false;
	}	

}

function checkEmail() {
	var a=emailAddress.value, b=/^[\w-\.]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}$/, c=emailAddressConfirm.value;
	if (!(b.test(a))) { 
    	setFailure(emailStatus, 'Invalid email address'); return false;
	} else if(a != c) {
		setFailure(emailStatus, 'Email addresses do not match'); return false
	} else {
		setSuccess(emailStatus); return false;
	}
}

function checkPassword() {
	
	var a=password.value, b=passwordConfirm.value;
	
	if((a.length < 4) || (a.length > 10)) {
		setFailure(passwordStatus, 'Password must be 4 - 10 characters'); return false;
	} else if(a!=b) {
		setFailure(passwordStatus, 'Passwords do not match'); return false;
	} else {
		setSuccess(passwordStatus); return false;
	}
}

function checkFirstName() {
	var a=firstName.value,b=/[A-Za-z]/;
	if(a.IsEmpty()) {
		setFailure(firstNameStatus, 'First name required'); return false;
	} else if (!b.test(a.charAt(0))) {
		setFailure(firstNameStatus, 'First name must begin with a letter'); return false;
	} else if(a.length>20) {
		setFailure(firstNameStatus, 'First name is too long'); return false;
	} else {
		setSuccess(firstNameStatus); return false;
	}
}

function checkLastName() {
	var a=lastName.value,b=/[A-Za-z]/;
	if(a.IsEmpty()) {
		setFailure(lastNameStatus, 'Last name required'); return false;
	} else if (!b.test(a.charAt(0))) {
		setFailure(lastNameStatus, 'Last name must begin with a letter'); return false;
	} else if(a.length>20) {
		setFailure(lastNameStatus, 'Last name is too long'); return false;
	} else {
		setSuccess(lastNameStatus); return false;
	}
}

function checkDate() {
	// e = month; f = day; g = year;
	var a="/",miny=1905,b=birthDate.value,c=b.indexOf(a),d=b.indexOf(a,c+1),e=b.substring(0,c),f=b.substring(c+1,d),g=b.substring(d+1);
	if (f.charAt(0)=="0"&&f.length>1) { f=f.substring(1); }
	if (e.charAt(0)=="0"&&e.length>1) { e=e.substring(1); }
	var m=parseInt(e-1),y=parseInt(g); d=parseInt(f); var h=new Date(y,m,d);
	if ((d!=h.getDate()) || (m!=h.getMonth()) || (y!=h.getFullYear()) || (g.length != 4) || (y<miny)) {
		setFailure(birthDateStatus, '(mm/dd/yyyy) Invalid Date'); return false;
	} else if (getAge(d, m, y) < 13) {
		setFailure(birthDateStatus, 'You must be 13 years or older to signup'); return false;
	} else {
		h=getAge(d, m, y);
		setSuccess(birthDateStatus, 'You are ' + h + ' years old'); return false;
	}
}

function getDays(){
	var i=0;this[i++]=0;this[i++]=31;this[i++]=29;this[i++]=31;this[i++]=30;this[i++]=31;this[i++]=30;
	this[i++]=31;this[i++]=31;this[i++]=30;this[i++]=31;this[i++]=30;this[i]=31;this.length=i;
}

function getAge(dd, mm, yy){
	var t=new Date(), mon=t.getMonth()+1, day=t.getDate(), year=t.getFullYear(), DD=parseInt(dd), MM=parseInt(mm + 1), YY=parseInt(yy), age, MTB=new getDays();
	if (MTB[MM] < DD || DD < 1) return -1; if (MM == 2 && DD == 29){ if (!(((YY % 4 == 0) && (YY % 100 != 0)) || (YY % 400 == 0))){ return -1;}}
	age = year - YY; if ((MM > mon) || (MM == mon && day < DD)) age --; return age;
}

function checkGender() {
	if(genderMale.checked || genderFemale.checked) {
		setSuccess(genderStatus); return;
	} else {
		setFailure(genderStatus, 'Select your gender'); return false;
	}
}

function checkZip() {
	var a = zip.value, b = /\D/;
	if(a.length != 5) {
		setFailure(zipStatus, 'Please enter a valid US zip code'); return false;
	} else if(b.test(a)) {
		setFailure(zipStatus, zip.value + ' is not a valid US zip code'); return false;
	} else {
		checkZipAJAX();
	}
}

function checkZipAJAX() {
    var url = '/signup/zip.xml?' + zip.value;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest()
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
	req.onreadystatechange = processZipRequest;
    req.open("GET", url, true);
    req.send(null);
}

function processZipRequest() {
    if (req.readyState == 4) {
        if (req.status == 200) {
			xml = req.responseXML.documentElement;
			if (req.readyState == 4) {
				response = xml.getElementsByTagName('exists')[0].firstChild.data;
				if (response==0) {
					setFailure(zipStatus, zip.value + ' is not a valid US zip code'); return false;
				} else {
					setSuccess(zipStatus, 'You\'re in ' + response); return false;
				}
			}
        } else {
			setFailure(userNameStatus, 'There was an error with your request'); return false;
        }
    }
}

addEvent(window, 'load', initializeSignup);
