//on page load
addLoadListener(initAllEvents);

//pre-load error images
var incorrect_input = new Image();
incorrect_input.src = site_url + 'images/form_error.jpg';
var correct_input = new Image();
correct_input.src = site_url + 'images/form_confirm.jpg';

//form validation
function initAllEvents() {	
	//registration form
	var registerUsername = document.getElementById("username");
	attachEventListener(registerUsername, "change", registerUsernameValidate, false);		
	var registerPassword = document.getElementById("password");
	attachEventListener(registerPassword, "change", registerPasswordValidate, false);	
	var registerPassword2 = document.getElementById("password2");
	attachEventListener(registerPassword2, "change", registerPassword2Validate, false);	
	var registerEmail = document.getElementById("email");
	attachEventListener(registerEmail, "change", registerEmailValidate, false);	
	var registerSpam = document.getElementById("spam");
	attachEventListener(registerSpam, "change", registerSpamValidate, false);	
	var continueButton = document.getElementById("continue-button");
	attachEventListener(continueButton, "click", registerValidateAll, false);		
}

function displayFormConfirm(id) {
	var errorLoc = document.getElementById(id);
	var errorSpan = document.createElement("span");
	var errorMessage = document.createTextNode("OK");
	var errorDiv = id + "-error";
	errorSpan.appendChild(errorMessage);
	errorSpan.className = "form-confirm";
	errorSpan.setAttribute('id',errorDiv);
	var parent = errorLoc.parentNode;
	parent.insertBefore(errorSpan,errorLoc);
}

function displayFormError(id, error) {
	var errorLoc = document.getElementById(id);
	var errorSpan = document.createElement("span");
	var errorMessage = document.createTextNode(error);
	var errorDiv = id + "-error";
	errorSpan.appendChild(errorMessage);
	errorSpan.className = "form-error";
	errorSpan.setAttribute('id',errorDiv);
	var parent = errorLoc.parentNode;
	parent.insertBefore(errorSpan,errorLoc);
}

//register functions
function registerUsernameValidate() {
	var field = "username";
	var error = "Invalid username";
	var error_alphanum = "Letters and numbers only";
	removeElementById(field + "-error");
	var value = document.getElementById(field).value;
	if ((validateRequired(value)) && (validateLength(value, 6, 20))) {
		if (alphaNumericCheck(value)) {
			usernameAvailable(value);
		} else {
			displayFormError(field,error_alphanum);
		}
	} else {
		displayFormError(field,error);
	}
		
}

function registerEmailValidate() {
	var field = "email";
	var error = "Invalid email address";
	removeElementById(field + "-error");
	var value = document.getElementById(field).value;
	if ((validateEmail(value)) && (validateRequired(value)) && (validateLength(value, 1, 100))) {
		emailAvailable(value);
	} else {
		displayFormError(field,error);
	}
		
}

function registerSpamValidate() {
	var field = "spam";
	var error = "Must be a number";
	removeElementById(field + "-error");
	var value = document.getElementById(field).value;
	if ((validateRequired(value)) && (validateNumerical(value))) {
		displayFormConfirm(field);
		return true;
	} else {
		displayFormError(field,error);
		return false;
	}
		
}

function registerValidateAll() {
	
	var password = registerPasswordValidate();
	var password2 = registerPassword2Validate();
	var spam = 	registerSpamValidate();
	
	var username_field = "username";
	var username_error = "Invalid username";
	var username_check = 'n';	
	var username = document.getElementById(username_field).value;	
	
	if ((validateRequired(username)) && (validateLength(username, 6, 20))) {
		username_check = 'y';
	} else {
		removeElementById(username_field + "-error");
		displayFormError(username_field,username_error);
	}
	
	var email_field = "email";
	var email_error = "Invalid email address";
	var email_check = 'n';	
	var email = document.getElementById(email_field).value;
	
	if ((validateEmail(email)) && (validateRequired(email)) && (validateLength(email, 1, 100))) {
		email_check = 'y';
	} else {
		removeElementById(email_field + "-error");
		displayFormError(email_field,email_error);
	}			
	
	if ((email_check == 'y') && (username_check == 'y') && (password) && (password2) && (spam)) {		
		userAvailable(email, username);
	} 
		
}

var usernameAvailableAJAX = new multiAJAX();

function usernameAvailable(username) {
	var url = site_url + "javascript/ajax/register_validate_username.php";	
	usernameAvailableAJAX.request.open("POST", url, true);	
	usernameAvailableAJAX.request.onreadystatechange = registerUsernameValidateOutput;	
	usernameAvailableAJAX.request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	usernameAvailableAJAX.request.send("username=" + escape(username));
}

var emailAvailableAJAX = new multiAJAX();

function emailAvailable(email) {
	var url = site_url + "javascript/ajax/register_validate_email.php";	
	emailAvailableAJAX.request.open("POST", url, true);	
	emailAvailableAJAX.request.onreadystatechange = registerEmailValidateOutput;	
	emailAvailableAJAX.request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	emailAvailableAJAX.request.send("email=" + escape(email));
}

var userAvailableAJAX = new multiAJAX();

function userAvailable(email, username) {
	var url = site_url + "javascript/ajax/register_validate.php";	
	userAvailableAJAX.request.open("POST", url, true);	
	userAvailableAJAX.request.onreadystatechange = registerUserValidateOutput;	
	userAvailableAJAX.request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	userAvailableAJAX.request.send("email=" + escape(email) + "&username=" + escape(username));
}

function registerUsernameValidateOutput() {
	if (usernameAvailableAJAX.request.readyState == 4) {
		if (usernameAvailableAJAX.request.status == 200) {
			var xmlDoc = usernameAvailableAJAX.request.responseXML;
			var field = 'username';						
			var valid = xmlDoc.getElementsByTagName("valid")[0].firstChild.nodeValue;			
			removeElementById(field + "-error");			
			if (valid =='y') {
				displayFormConfirm(field);														
			} else {				
				displayFormError(field, "Username is already taken");								
			}
		}
	}		
}

function registerEmailValidateOutput() {
	if (emailAvailableAJAX.request.readyState == 4) {
		if (emailAvailableAJAX.request.status == 200) {
			var xmlDoc = emailAvailableAJAX.request.responseXML;
			var field = 'email';						
			var valid = xmlDoc.getElementsByTagName("valid")[0].firstChild.nodeValue;			
			removeElementById(field + "-error");			
			if (valid =='y') {
				displayFormConfirm(field);															
			} else {				
				displayFormError(field, "Email already has an account");								
			}
		}
	}		
}

function registerUserValidateOutput() {
	if (userAvailableAJAX.request.readyState == 4) {
		if (userAvailableAJAX.request.status == 200) {
			var xmlDoc = userAvailableAJAX.request.responseXML;
			
			var username_field = 'username';						
			var username_valid = xmlDoc.getElementsByTagName("username")[0].firstChild.nodeValue;			
			removeElementById(username_field + "-error");			
			if (username_valid =='y') {
				displayFormConfirm(username_field);									
			} else {				
				displayFormError(username_field, "Username is already taken");								
			}
			
			var email_field = 'email';						
			var email_valid = xmlDoc.getElementsByTagName("email")[0].firstChild.nodeValue;			
			removeElementById(email_field + "-error");			
			if (email_valid =='y') {
				displayFormConfirm(email_field);									
			} else {				
				displayFormError(email_field, "Email already has an account");								
			}	
			
			if ((username_valid =='y') && (email_valid =='y')) {
				document.getElementById("register-form").submit();
			}
			
		}
	}		
}

function registerPasswordValidate() {
	var field = "password";
	var error = "Must be at least 6 characters";
	removeElementById(field + "-error");
	var value = document.getElementById(field).value;	
	if ((validateRequired(value)) && (validateLength(value, 6, 40))) {
		if (banned.inArray(value)) {
			displayFormError(field,"Password is too obvious");
			return false;
		} else {
			displayFormConfirm(field);
			return true;
		}
	} else {
		displayFormError(field,error);
		return false;
	}
}

function registerPassword2Validate() {
	var field = "password2";
	var error = "Passwords do not match";
	removeElementById(field + "-error");
	var value = document.getElementById(field).value;	
	var field2 = "password";
	var value2 = document.getElementById(field2).value;	
	if ((validateRequired(value)) && (validateLength(value, 6, 40)) && (validatePasswords(value,value2))) {
		displayFormConfirm(field);
		return true;
	} else {
		displayFormError(field,error);
		return false;
	}
}

//banned passwords based upon how Twitter does it
var banned = ["111111","11111111","112233","121212","123123","123456","1234567","12345678","131313","232323","654321","666666","696969","777777","7777777","8675309","987654","aaaaaa","abc123","abc123","abcdef","abgrtyu","access","access14","action","albert","alexis","amanda","amateur","andrea","andrew","angela","angels","animal","anthony","apollo","apples","arsenal","arthur","asdfgh","asdfgh","ashley","asshole","august","austin","badboy","bailey","banana","barney","baseball","batman","beaver","beavis","bigcock","bigdaddy","bigdick","bigdog","bigtits","birdie","bitches","biteme","blazer","blonde","blondes","blowjob","blowme","bond007","bonnie","booboo","booger","boomer","boston","brandon","brandy","braves","brazil","bronco","broncos","bulldog","buster","butter","butthead","calvin","camaro","cameron","canada","captain","carlos","carter","casper","charles","charlie","cheese","chelsea","chester","chicago","chicken","cocacola","coffee","college","compaq","computer","cookie","cooper","corvette","cowboy","cowboys","crystal","cumming","cumshot","dakota","dallas","daniel","danielle","debbie","dennis","diablo","diamond","doctor","doggie","dolphin","dolphins","donald","dragon","dreams","driver","eagle1","eagles","edward","einstein","erotic","extreme","falcon","fender","ferrari","firebird","fishing","florida","flower","flyers","football","forever","freddy","freedom","fucked","fucker","fucking","fuckme","fuckyou","gandalf","gateway","gators","gemini","george","giants","ginger","golden","golfer","gordon","gregory","guitar","gunner","hammer","hannah","hardcore","harley","heather","helpme","hentai","hockey","hooters","horney","hotdog","hunter","hunting","iceman","iloveyou","internet","iwantu","jackie","jackson","jaguar","jasmine","jasper","jennifer","jeremy","jessica","johnny","johnson","jordan","joseph","joshua","junior","justin","killer","knight","ladies","lakers","lauren","leather","legend","letmein","letmein","little","london","lovers","maddog","madison","maggie","magnum","marine","marlboro","martin","marvin","master","matrix","matthew","maverick","maxwell","melissa","member","mercedes","merlin","michael","michelle","mickey","midnight","miller","mistress","monica","monkey","monkey","monster","morgan","mother","mountain","muffin","murphy","mustang","naked","nascar","nathan","naughty","ncc1701","newyork","nicholas","nicole","nipple","nipples","oliver","orange","packers","panther","panties","parker","password","password","password1","password12","password123","patrick","peaches","peanut","pepper","phantom","phoenix","player","please","pookie","porsche","prince","princess","private","purple","pussies","qazwsx","qwerty","qwertyui","rabbit","rachel","racing","raiders","rainbow","ranger","rangers","rebecca","redskins","redsox","redwings","richard","robert","rocket","rosebud","runner","rush2112","russia","samantha","sammy","samson","sandra","saturn","scooby","scooter","scorpio","scorpion","secret","sexsex","shadow","shannon","shaved","sierra","silver","skippy","slayer","smokey","snoopy","soccer","sophie","spanky","sparky","spider","squirt","srinivas","startrek","starwars","steelers","steven","sticky","stupid","success","suckit","summer","sunshine","superman","surfer","swimming","sydney","taylor","tennis","teresa","tester","testing","theman","thomas","thunder","thx1138","tiffany","tigers","tigger","tomcat","topgun","toyota","travis","trouble","trustno1","tucker","turtle","twitter","united","vagina","victor","victoria","viking","voodoo","voyager","walter","warrior","welcome","whatever","william","willie","wilson","winner","winston","winter","wizard","xavier","xxxxxx","xxxxxxxx","yamaha","yankee","yankees","yellow","zxcvbn","zxcvbnm","zzzzzz"];
