var usernameIsValid = true;
var passwordIsValid = true;
var emailIsFree = true;

function validateForm(theform){
	var returnval=true; //by default, allow form submission
	
	for (i=0; i<theform.elements.length; i++){
		if (theform.elements[i].type=="text" || theform.elements[i].type=="password"){
		
			if (theform.elements[i].value==""){ //if empty field
				alert("Please make sure all fields are entered"); //alert error message
				returnval=false; //disallow form submission
				break; //end loop. No need to continue.
			}
			
			if(theform.elements[i].name=="username"){
				if(!usernameIsValid){
					alert("Your username is invalid.");
					returnval=false;
					break;
				}
			}
			
			if(theform.elements[i].name=="p1"){
				if(theform.p1.value != theform.p2.value){
					alert("Your new passwords do not match.");
					returnval=false; //disallow form submission
					break; //end loop. No need to continue.
				}
				if(!passwordIsValid){
					alert("Your password is too weak.");
					returnval=false;
					break;	
				}
			}
			
			if(theform.elements[i].name=="email"){
				if(!echeck(theform.elements[i].value)){
					alert("Your email address is invalid.");
					returnval=false;
					break;
				}
				if(!emailIsFree){
					alert("Your email address is is already registered.");
					returnval=false;
					break;			
				}
			}
			
		}
	}
	
	return returnval;
}

function echeck(str) {
	var at="@"
	var dot="."
	var lat=str.indexOf(at)
	var lstr=str.length
	var ldot=str.indexOf(dot)
	
	if (str.indexOf(at)==-1) return false;
	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) return false;
	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) return false;
	if (str.indexOf(at,(lat+1))!=-1) return false;
	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot) return false;
	if (str.indexOf(dot,(lat+2))==-1) return false;
	if (str.indexOf(" ")!=-1) return false

	return true					
}

function validateField(name, value){
	valid = false;
	if(name=="username"){
		if(isAlphanumeric(value)){
			valid = null;
			xmlhttpPost("action=isValidUsername&value=" + value,
		function() {
			if (self.xmlHttpReq.readyState == 4) {
				if(self.xmlHttpReq.responseText == 1) usernameIsValid = true;
				else usernameIsValid = false;

				validateFieldResponse(name, usernameIsValid);
			}
		});
		}
		else{
			valid = false;
			usernameIsValid = false;
		}
	}
	
	if(name=="email"){
		if(echeck(value)){
			valid = null;
			xmlhttpPost("action=isEmailFree&value=" + value,
		function() {
			if (self.xmlHttpReq.readyState == 4) {
				if(self.xmlHttpReq.responseText == 1) emailIsFree = true;
				else emailIsFree = false;
				
				validateFieldResponse(name, emailIsFree);
			}
		});
		}
		
		else {
			valid = false;
		}
	}
	
	if(name=="p1"){
		if(strongPassword(value) && (value != document.forms['f'].username.value)){
			passwordIsValid = true;
			valid = true;
		}
		else passwordIsValid = false;
		
		if(document.forms['f'].p2.value == "") validateFieldResponse("p2", null);
		else if(document.forms['f'].p2.value == value) validateFieldResponse("p2", true);
		else validateFieldResponse("p2", false);
	}
	
	if(name=="p2"){
		if(value == ""){
			document.getElementById(name).innerHTML = "";
			return false; // break prematurely
		}
		else if(document.forms['f'].p1.value == value) valid = true;
	}
	
	validateFieldResponse(name, valid);
}

function validateFieldResponse(name, valid){
	if(valid) document.getElementById(name).innerHTML = "<img style='vertical-align: bottom;' src='externals/tick.png'>";
	else if(valid != null) document.getElementById(name).innerHTML = "<img style='vertical-align: bottom;' src='externals/cross.png'>";
}

function xmlhttpPost(queryString, callback) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('GET', "ajax.php?" + queryString, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = callback;
    self.xmlHttpReq.send(null);
}

function strongPassword(passwd){
var letters;
var symbols;

if(passwd.length < 8) return false;

if (passwd.match(/[a-z]/)) letters = true;
if (passwd.match(/[A-Z]/)) letters = true;
if (passwd.match(/\d+/)) symbols = true;
if (passwd.match(/[>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/)) symbols = true;

if(letters && symbols) return true;
else return false;
}

function isAlphanumeric(string){
	var alphaExp = /^[0-9a-zA-Z]+$/;
	if(string.match(alphaExp)) return true;
	else return false;
}