var isEmailValid = false;
var isUsernameValid = false;

function navigate(direction){
	var activeStep = $$('#SignUpV2 div.activeStep').first();
	var allSteps = $$('#SignUpV2 div.signUpStep');

	if(activeStep == undefined){
		alert('No Active Step');
		return;
	}
	
	var pageid = activeStep.id.toArray().last();

	if(direction == "forward"){
		pageid++;
	}
	else if(direction == "backward"){
		pageid --;
	}
	else {}

	var nextStepID = "step" + pageid;
	
	navigateToPage(nextStepID);
}

function navigateToPage(pageid){
	var activeStep = $$('#SignUpV2 div.activeStep').first();
	var allSteps = $$('#SignUpV2 div.signUpStep');
	
	var nextStep = allSteps.find(function(s){
		return s.id == pageid;
	});

	allSteps.without(nextStep).invoke('hide');

	activeStep.removeClassName('activeStep');

	nextStep.removeClassName('deactiveStep');
	nextStep.addClassName('activeStep');
	nextStep.show();
}

function displayNextStep(){
	var isValid = validateStep();

	if(isValid){
		navigate("forward");
	}
}

function displayPreviousStep(){
	navigate("backward");
}

function validateStep(){
	var activeStep = $$('#SignUpV2 div.activeStep').first();

	var inputsFilter = '#' + activeStep.id + ' input';
	var selectsFilter = '#' + activeStep.id + ' select';

	var inputs = $$(inputsFilter);
	var selects = $$(selectsFilter);

	var validatedFields = new Array();
	
	inputs.each(function(i){
		var v = validateInput(i);
		validatedFields.push(v);
	});

	selects.each(function(s){
		var v = validateInput(s);
		validatedFields.push(v);
	});

	if(validatedFields.indexOf(false) > -1){
		return false;
	}

	return true;
}

function validateInput(input){
	if(input.value == undefined){
		setValidation(input.id, false);
		return false;
	}
	
	var isValid = true;
	
	Element.extend(input);
	
	var validationDisplayID = input.id + '_validation';
	var validationSourceFilter = '#' + validationDisplayID + ' input[title=' + input.id + ']';
	
	var validationSources = $$(validationSourceFilter);
	var validators = new Array();
	
	if(validationSources != undefined && validationSources.length > 0){
		validationSources.each(function(v){
			var data = v.value.evalJSON();
			validators.push(data);
		});
	}
	
	var tagName = input.tagName.toLowerCase();
	var isRequired = input.hasAttribute('Required') ? true : false;
	
	switch(tagName){
		case 'select':
			//it is not required, so it passes validation
			if(isRequired == false){
				isValid = true;
				setValidation(input.id, true, 'Required');
				return true;
			}
			else{
				removeValidationMessage(input.id, 'Required');
			}

			//nothing has been selected, fail the validation
			if(input.selectedIndex < 1){
				isValid = false;
				setValidation(input.id, false, 'Please select a state');
				return false;						
			}
			else{
				removeValidationMessage(input.id, 'Please select a state');
			}
			break;
		case 'input':
			var inputValue = input.value;
			var hasValue = (inputValue != undefined && !inputValue.empty());
			
			//value is required and it's not defined
			if(isRequired && !hasValue){
					isValid = false;
					setValidation(input.id, false, 'Required');
					return false;
			}else{
				removeValidationMessage(input.id, 'Required');
			}

			for(j = 0; j < validators.length; j++){
				var validator = validators[j];
				
				var errormsg = validator.errormessage;
				
				switch (validator.type){
					case 'regex':
						if(!isRequired && !hasValue){
							break;
						}
						
						var regexTest = new RegExp(validator.regex);
						var regexIsValid = regexTest.test(inputValue);
						
						setValidation(input.id, regexIsValid, errormsg);

						if(!regexIsValid){
							isValid = false;
							return false;
						}
						break;
					case 'field':
						var relatedField = $(validator.validationfield);
						var fieldIsValid = (relatedField != undefined && relatedField.value == inputValue);
						
						setValidation(input.id, fieldIsValid, errormsg);

						if(!fieldIsValid){
							isValid = false;
							return false;
						}

						break;
					case 'uniqueEmail':
						validateEmailAddress(input.id);
						
						setValidation(input.id, isEmailValid, errormsg);
						
						if(isEmailValid == false){
							isValid = false;
							return false;
						}
						
						break;
					case 'uniqueUsername':
					
						var username = $(input.id).value;
						
						if(username.length < 1){
							var emailSelect = $$('input[title="email"]').first();
							
							if(emailSelect != undefined){
								username = emailSelect.value;
							}
						}
						
						validateUsername(username);
						
						if(!isUsernameValid && username.length < 1){
							isUsernameValid = true;
						}
						
						setValidation(input.id, isUsernameValid, errormsg);
						
						if(isUsernameValid == false){
							isValid = false;
							return false;
						}
						
						break;
					default:
						break;
				}
			}
			break;
		default:
			break;
	}

	if(isValid == true){
		setValidation(input.id, true);
		return true;
	}
}

function setValidationMessage(sourceID, isValid, errormsg){
	var filterMsgDisplay = sourceID + '_validationMessage';
	var validationMsgDiv = $(filterMsgDisplay);

	if(validationMsgDiv == undefined){
		return;
	}
	
	var displayObject = { 
		SourceName: sourceID,
		ErrorMessage: errormsg
	};
	
	var displayTemplate = new Template('<p title="#{ErrorMessage}">* #{ErrorMessage}</p>');
	var displayItem = displayTemplate.evaluate(displayObject);

	if(isValid){
		removeValidationMessage(sourceID, displayObject.ErrorMessage);
	}
	else{
		var msg = 0;
		validationMsgDiv.childElements().each(function(e){ if(e.title == displayObject.ErrorMessage) { msg = 1;} });
		
		if(msg < 1){
			validationMsgDiv.insert( {'bottom': displayItem});
			validationMsgDiv.show();
		}
	}
}

function removeValidationMessage(sourceID, errormsg){
	var filterMsgDisplay = sourceID + '_validationMessage';
	var validationMsgDiv = $(filterMsgDisplay);

	if(validationMsgDiv == undefined){
		return;
	}
	
	var displayObject = { 
		SourceName: sourceID,
		ErrorMessage: errormsg
	};
	
	var item = $$('#' + filterMsgDisplay + ' p[title="' + displayObject.ErrorMessage + '"]').first();
		
	if(item != undefined){
		item.remove();
	}
}

function setValidation(sourceID, isValid, errormsg){
	var filter = sourceID + '_validation';

	var validationDiv = $(filter);

	if(validationDiv == undefined){
		return;
	}

	var validClassName = 'valid';
	var invalidClassName = 'invalid';

	if(isValid){
		validationDiv.removeClassName(invalidClassName);
		validationDiv.addClassName(validClassName);
	}
	else{
		validationDiv.removeClassName(validClassName);
		validationDiv.addClassName(invalidClassName);
	}
	
	setValidationMessage(sourceID, isValid, errormsg);
}

function validateEmailAddress(inputid){
	
	var url = document.URL;
    var requestArgs = GSNContext.RequestArguments;
	var emailAddress = $(inputid).value;
	
	GSNServices.ProfileService.ValidateUserEmailAddress(url, requestArgs, emailAddress, handleEmailAddressVerification, handleEmailAddressVerification);
}

function handleEmailAddressVerification(response){
	
	var value = UnwrapResponse(response);
	var json = value.evalJSON();
	
	isEmailValid = json.isValid == 'true' ? true : false;
}

function validateUsername(username){
	var url = document.URL;
    var requestArgs = GSNContext.RequestArguments;

	GSNServices.ProfileService.ValidateUsername(url, requestArgs, username, handleUsernameVerification, handleUsernameVerification);
}

function handleUsernameVerification(response){
	
	var value = UnwrapResponse(response);
	var json = value.evalJSON();
	
	isUsernameValid = json.isValid == 'true' ? true : false;
	
	
}

function saveSignUp(){
	//GSNServices.ProfileService.SavePreferencesAsync('SignUpV2');
	
	var stepIsValid = validateStep();
	
	if(stepIsValid == true){
		document.forms[0].submit();
	}
}

function DisplaySavePreferencesResponse(response){
	var step = $$('#SignUpV2 div.signUpStep').last();
	
	if(step != undefined){
		navigateToPage(step.id);
	}
}