﻿/*
*/

function Login(sender, args) {
    var txtIdCard = document.getElementById(masterPagePrefix + "txtIdCard");
    var txtPassword = document.getElementById(masterPagePrefix + "txtPassword");
    if (!txtIdCard || !txtPassword) {
        args.set_cancel(true);
        return false;
    }
    txtPassword = txtPassword.control;

    if (txtIdCard.value == "") {
        LoginMessage("Username cannot be blank!");
        args.set_cancel(true);
        return false;
    }
    
    if(txtPassword.get_value() == "") {
        LoginMessage("Password cannot be blank!");
        args.set_cancel(true);
        return false;
    }
    
    LoginMessage('Verifying. Please wait...');
    args.set_cancel(false);
    return true;
}

function Logout(sender, args) {
    if (!confirm("Are you sure you want to Log Out?")) {
        args.set_cancel(true);
        return false;
    }

    LogoutMessage('Logging out. Please wait...');
    args.set_cancel(false);
    return true;
}


/*
message areas

group by sections : login, forgot pass, etc.
another group for generic functions. eg: all msgareas pass the div id to the generic msg function
*/
function LoginMessage(msg)
{
	if (!msg) {
		msg = "";
	}
    var loginMessage = document.getElementById(masterPagePrefix + "loginMessage");
    if (loginMessage) {
        loginMessage.innerHTML = msg;
    }
}

function LogoutMessage(msg)
{
	if (!msg) {
		msg = "";
	}
    var logoutMessage = document.getElementById(masterPagePrefix + "logoutMessage");
    if (logoutMessage) {
        logoutMessage.innerHTML = msg;
    }
}

function Navigate(url) {
    /*
    menu navigation
    */

    switch (url) {
        case "Home":
            window.location = 'default.aspx';
            break;
        case "My Card":
            window.location = 'card.aspx';
            break;
        case "Shops":
            window.location = 'merchants.aspx';
            break;
        case "Register":
            ShowRegisterForm();
            break;
        default:
            //
    }
}

function HilightMenu(itemName) {
    /*
    itemName = text of menu item to hilight
    */

    var menu = document.getElementById("menu");
    var items = menu.getElementsByTagName("li");
    for (i = 0; i < items.length; i++) {

        // clear hilight css
        items[i].setAttribute("class", "");

        if (items[i].innerHTML.toLowerCase() == itemName.toLowerCase()) {
            // set hilight css
            items[i].setAttribute("class", "active");
        }
    }
}

function IsUserLoggedIn()
{
	/*
	login box visibility effectively indicates whether user is logged in.
		user not logged in : login box visible 
		user logged in : logout box visible 

	TODO: 
	not 100% accurate because session might have expired.
	make this a proper login check - ajax call to CheckLoginSession
	*/
	var loginBox = document.getElementById(masterPagePrefix + "loginBox");
	if (loginBox) {
		return false;
	}
	return true;
}

function RequiresLogin()
{
	if (!IsUserLoggedIn()) {
        alert("Please Log-In to access this feature");
        return true;
    }
    return false;
}

function FeatureNotAvailable() {
    var loginBox = document.getElementById(masterPagePrefix + "loginBox");
    if (loginBox) {
        alert("Please Log-In to access this feature");
        // cancel postback
        return false;
    }
    alert("This feature is not yet available");
    return false;
}










/**/

function ValidLoginIdCard(sender, args) {
    var val = sender.get_value();
    var validLabel = document.getElementById(masterPagePrefix + "loginMessage");

    // clean input
    val = val.toUpperCase();
    while (val.substring(0, 1) === "0") {
        val = val.substring(1);
    }
    val = StripSpecialChars(val);

    var regx = /^[0-9]{3,10}[a-z]$/i;
    if (!val.match(regx)) {
        validLabel.innerHTML = "not a valid ID Card number.";
        return false;
    }

    validLabel.innerHTML = "";

    // update textbox with cleaned up input
    sender.set_value(val);
    return true;
}

/*
validation
generic
*/
function ValidateEmpty(val) {
    if (!val || val == "" || val == null) {
        return false;
    }
    return true;
}
function ValidateSpecialChars(val) {
    // return bool on match
    // space, 
    var regx = /\s/;
    if (val.match(regx)) {
        return false;
    }
    return true;
}
function StripSpecialChars(val) {
    // returns string without the offending chars 
    // space - + _ ( )
    //
    // todo: match \d return only matches in string (filter non-digits)
    // note: we want to allow user to type in these chars
    var regx = /[\s_\(\)\-\+]/gi;
    var stripped = "";
    return val.replace(regx, stripped);
}
function ValidateLength(val, minLen) {
    if (val.length < minLen) {
        return false;
    }
    return true;
}
function ValidateDigits(val, len) {
    var regx = new RegExp("^[0-9]{" + len + "}$", "i");
    // /^[0-9]{len}$/;
    if (!val.match(regx)) {
        return false;
    }
    return true;
}







/**/
        
        function Init(){
            //InitRegForm();          
        }
        
        var regFormFields = {
            /*control: validation state*/
            regStep1 : {
                txtRegIdCard: false,
                txtRegCardNum: false,
                txtRegPassword: false,
                txtRegConfirm: false
            },
            regStep2 : {
                //cmbRegSecretQ: true,
                txtRegSecretA: false
            },
            regStep3: {
                txtRegMobile: true,
                txtRegEmail: true
            }
		// add clear, reset, get control
        };
        
        var forgotFields = {
            txtForgotIdCard: false,
            txtForgotCardNum: false,
            txtForgotNewPass: false,
            txtForgotConfirm: false,
            txtForgotSecretA: false
        };
        
        var changePasswordFields = {
            txtChangePasswordNew: false,
            txtChangePasswordConfirm: false
            //txtChangePasswordIdCard: false
        };
        function CheckRegFormValid(stepId){
            var formValid = true;
            if(stepId == null){
                // assume entire form if no step page specified
                for(var step in regFormFields){
                    for(var field in regFormFields[step]){
                        if(regFormFields[step][field] == false){
                            formValid = false;
                            break;
                        }
                    }
                }
            }
            else{
                for(var field in regFormFields["regStep" + stepId]){
                    if(regFormFields["regStep" + stepId][field] == false){
                        formValid = false;
                        break;
                    }
                }
            }
            
            if(!formValid){
                alert("Please fill in ALL required fields and correct any input errors before proceeding.");
                return false;
            }
            return true;
        }
        function ChangePasswordSubmit(sender, args){
            for(var f in changePasswordFields){
                if(changePasswordFields[f] == false){
                    //isValid = false;
                    //break;
                    alert("Please check your input for missing or invalid data before submitting.");
                    args.set_cancel(true);
                    return false;
                }
            }
            if(!confirm("Are you sure you want to submit this information and change your password?")){
                args.set_cancel(true);
                return false;
            }

            var ctl00_ctl00_changePasswordServerMessagePanel = document.getElementById("ctl00_ctl00_changePasswordServerMessagePanel");
            ctl00_ctl00_changePasswordServerMessagePanel.style.color = "Red";
            ctl00_ctl00_changePasswordServerMessagePanel.innerHTML = "please wait...";
            args.set_cancel(false);
            return true;
        }
        function ForgotSubmit(sender, args){
            //var isValid = true;
            for(var f in forgotFields){
                if(forgotFields[f] == false){
                    //isValid = false;
                    //break;
                    alert("Please check your input for missing or invalid data before submitting.");
                    args.set_cancel(true);
                    return false;
                }
            }
            if(!confirm("Are you sure you want to submit this information and reset your password?")){
                args.set_cancel(true);
                return false;
            }

            var ctl00_ctl00_forgotServerMessagePanel = document.getElementById("ctl00_ctl00_forgotServerMessagePanel");
            if (ctl00_ctl00_forgotServerMessagePanel) {
                ctl00_ctl00_forgotServerMessagePanel.style.color = "Red";
                ctl00_ctl00_forgotServerMessagePanel.innerHTML = "please wait...";
            }
            args.set_cancel(false);
            return true;
        }
        
        function RegSubmit(sender, args){
            if(!CheckRegFormValid(null)){
                args.set_cancel(true);
                return false;
            }
			// TODO: replace with regFields literal functions
			var txtRegIdCard = document.getElementById(masterPagePrefix + "txtRegIdCard");
			//txtRegIdCard = txtRegIdCard.control ? txtRegIdCard.control : txtRegIdCard;
			if(!txtRegIdCard.control){ 
				txtRegIdCard = "";
			}
			else{
				txtRegIdCard = txtRegIdCard.control.get_value();
			}

			var txtRegCardNum = document.getElementById(masterPagePrefix + "txtRegCardNum");
			if(!txtRegCardNum.control){
				txtRegCardNum = "";
			}
			else{
				txtRegCardNum = txtRegCardNum.control.get_value();
			}

			var txtRegPassword = document.getElementById(masterPagePrefix + "txtRegPassword");
			if(!txtRegPassword.control){
				txtRegPassword = "";
			}
			else{
				// mask
				var len = txtRegPassword.control.get_value().length;
				txtRegPassword = "";
				for(i = 0; i < len; i++){
					txtRegPassword += "*";
				}
			}

			// ASP control
			var cmbRegSecretQ = document.getElementById(masterPagePrefix + "cmbRegSecretQ").value;

			var txtRegSecretA = document.getElementById(masterPagePrefix + "txtRegSecretA");
			if(!txtRegSecretA.control){
				txtRegSecretA = "";
			}
			else{
				txtRegSecretA = txtRegSecretA.control.get_value();
			}

			var txtRegMobile = document.getElementById(masterPagePrefix + "txtRegMobile");
			if(!txtRegMobile.control){
				txtRegMobile = "";
			}
			else{
				txtRegMobile = txtRegMobile.control.get_value();
			}
			txtRegMobile = (txtRegMobile == "") ? "N/A" : txtRegMobile;

			var txtRegEmail = document.getElementById(masterPagePrefix + "txtRegEmail");
			if(!txtRegEmail.control){
				txtRegEmail = "";
			}
			else{
				txtRegEmail = txtRegEmail.control.get_value();
			}
			txtRegEmail = (txtRegEmail == "") ? "N/A" : txtRegEmail;

            if(!confirm("Are you sure you want to submit the following information and register this account?"
						+ "\n"
						+ "\n\tID Card no.: [ " + txtRegIdCard + " ]"
						+ "\n\tCard no.: [ " + txtRegCardNum + " ]"
						+ "\n\tPassword: [ " + txtRegPassword + " ]"
						+ "\n\t_______________________________________________________"
						+ "\n"
						+ "\n\tSecret Q: [ " + cmbRegSecretQ + " ]"
						+ "\n\tSecret A: [ " + txtRegSecretA + " ]"
						+ "\n\t_______________________________________________________"
						+ "\n"
						+ "\n\tMobile Phone: [ " + txtRegMobile + " ]"
						+ "\n\tEmail Address: [ " + txtRegEmail + " ]"
						+ "\n"
						+ "\n"
						+ "(Click Cancel if you would like to go back and modify your data)"
						))
			{
                args.set_cancel(true);
                return false;
            }
            
            RegHideAll();
            var regStepConfirm = document.getElementById("regStepConfirm");
            regStepConfirm.style.display = "block"; 
            var regTitleText = document.getElementById("regTitleText");
            regTitleText.innerHTML = "Submit Data";
            var lblRegConfirm = document.getElementById(masterPagePrefix + "lblRegConfirm");
            lblRegConfirm.style.color = "Red";
            lblRegConfirm.innerHTML = "please wait...";
            args.set_cancel(false);
            return true;
        }
        
        function ClearRegForm(){
//            // get ref to fields to clear
//            var fields = {
//                txtRegIdCard: document.getElementById(masterPagePrefix + "txtRegIdCard"),
//                txtRegCardNum: document.getElementById(masterPagePrefix + "txtRegCardNum"),
//                txtRegPassword: document.getElementById(masterPagePrefix + "txtRegPassword"),
//                txtRegConfirm: document.getElementById(masterPagePrefix + "txtRegConfirm"),
//                txtRegSecretA: document.getElementById(masterPagePrefix + "txtRegSecretA"),
//                txtRegMobile: document.getElementById(masterPagePrefix + "txtRegMobile"),
//                txtRegEmail: document.getElementById(masterPagePrefix + "txtRegEmail")
//            };
//            // clear fields
//            for(var f in fields){
//               if(!fields[f]){ continue; }               
//               fields[f].control.set_value("");
//            }
            
            //clear all fields
            for(var step in regFormFields){
                for(var field in regFormFields[step]){
                    var elem = document.getElementById(masterPagePrefix + field);
                    elem = elem.control;
                    if(!elem){ continue; }
                    elem.set_value("");
                }
            }
            
            // clear message areas
            var regMessageArea1 = document.getElementById("regMessageArea1");
            regMessageArea1.innerHTML = "";
            var regMessageArea2 = document.getElementById("regMessageArea2");
            regMessageArea2.innerHTML = "";
            var regMessageArea3 = document.getElementById("regMessageArea3");
            regMessageArea3.innerHTML = "";
            
            // move these funcs to regFormFields
        }
        function ResetRegForm(){
            //reset valid status of fields
            for(var step in regFormFields){
                for(var field in regFormFields[step]){
                    if(step == "regStep3"){
                        // keep optionals valid
                        regFormFields[step][field] = true;
                        continue;
                    }
                    regFormFields[step][field] = false;
                }
            }
        }
        function InitRegForm(){
            
            // init reg form to step 1
            RegShowStep();
        }
        function InitForgotForm(){

                document.getElementById("validForgotIdCard").innerHTML = "";
                document.getElementById("validForgotCardNum").innerHTML = "";
                document.getElementById("validForgotSecretA").innerHTML = "";
                document.getElementById("validForgotPassword").innerHTML = "";
                document.getElementById("validForgotConfirm").innerHTML = "";
           
            
            // clear and reset fields
            for(var field in forgotFields){
               forgotFields[field] = false;
               var fieldControl = document.getElementById(masterPagePrefix + field);          
               fieldControl = fieldControl.control;
               if(!fieldControl){ continue; }
               fieldControl.set_value("");
            }
            // clear fields
            /*
            for(var f in fields){
               if(!fields[f]){ continue; }               
               fields[f].control.set_value("");
            }
            */

            var forgotMessageArea = document.getElementById("forgotMessageArea");
                forgotMessageArea.innerHTML = "";
                var ctl00_ctl00_forgotServerMessagePanel = document.getElementById("ctl00_ctl00_forgotServerMessagePanel");
                if (ctl00_ctl00_forgotServerMessagePanel) {
                ctl00_ctl00_forgotServerMessagePanel.style.color = "Red";
                ctl00_ctl00_forgotServerMessagePanel.innerHTML = "";
            }
        }
        function InitChangePasswordForm(){
           // clear validation labels
           

                //document.getElementById("validChangePasswordIdCard").innerHTML = "";
                document.getElementById("validChangePasswordNew").innerHTML = "";
                document.getElementById("validChangePasswordConfirm").innerHTML = "";
                
            // clear and reset fields
            for(var field in changePasswordFields){
               changePasswordFields[field] = false;
               var fieldControl = document.getElementById(masterPagePrefix + field);          
               fieldControl = fieldControl.control;
               if(!fieldControl){ continue; }
               fieldControl.set_value("");
            }
            
            var changePasswordMessageArea = document.getElementById("changePasswordMessageArea");
            changePasswordMessageArea.innerHTML = "";

            var ctl00_ctl00_changePasswordServerMessagePanel = document.getElementById("ctl00_ctl00_changePasswordServerMessagePanel");
            ctl00_ctl00_changePasswordServerMessagePanel.style.color = "Red";
            ctl00_ctl00_changePasswordServerMessagePanel.innerHTML = "";
            
            btn = document.getElementById(masterPagePrefix + "btnChangePasswordSubmit").control;
            btn.set_enabled(true);
        }
        function ShowChangePasswordForm(){
            InitChangePasswordForm();
            
            var popChangePass = document.getElementById("popChangePass");
            popChangePass.style.display = "block";
        }
        function ShowForgotForm(){
            InitForgotForm();
            btn = document.getElementById(masterPagePrefix + "btnForgotSubmit").control;
            btn.set_enabled(true);
            
            var forgotForm = document.getElementById("popForgotPass");
            forgotForm.style.display = "block";
        }
        function ShowRegisterForm(){
            ResetRegForm();
            ClearRegForm();
            InitRegForm();
            
            btn = document.getElementById(masterPagePrefix + "btnRegStep3Finish").control;
            btn.set_enabled(true);
            
            var registerForm = document.getElementById("registerForm");
            registerForm.style.display = "block";
        }
        
        function LostCardSubmit(sender, args){
            if(!confirm("Are you sure you want to report your card as lost?")){
                args.set_cancel(true);
                return false;
            }

            var ctl00_ctl00_litLostCardResponsePanel = document.getElementById("ctl00_ctl00_contentFloatingElement_litLostCardResponsePanel");
            ctl00_ctl00_litLostCardResponsePanel.style.color = "Red";    
            ctl00_ctl00_litLostCardResponsePanel.innerHTML = "please wait...";
            args.set_cancel(false);
            return true;
        }
        function ShowLostCardForm(){
            var popLostCard = document.getElementById("popLostCard");
            popLostCard.style.display = "block";
														 
            btnLostCardSubmit = document.getElementById("ctl00_contentFloatingElement_btnLostCardSubmit").control;
            btnLostCardSubmit.set_enabled(true);

            // cancel postback on link btn
            //return false;
        }
        function HideLostCardForm(){
            if(confirm("Are you sure you want to close the form?") == false){
                return;
            }
            var popLostCard = document.getElementById("popLostCard");
            popLostCard.style.display = "none";
        }
        
        function HideRegisterForm(){
            if(confirm("Are you sure you want to close the registration form?") == false){
                return;
            }
            var registerForm = document.getElementById("registerForm");
            registerForm.style.display = "none";
        }
        function HideForgotForm(){
            if(!confirm("Are you sure you want to close?")){
                return;
            }
            var forgotForm = document.getElementById("popForgotPass");
            forgotForm.style.display = "none";
            // moved to show, ofc
            // reset and clear for next use
           // InitForgotForm();
        }
        function HideChangePasswordForm(){
            if(!confirm("Are you sure you want to close?")){
                return;
            }
            var popChangePass = document.getElementById("popChangePass");
            popChangePass.style.display = "none";
        }
        
        function RegHideAll(){
            var regStepConfirm = document.getElementById("regStepConfirm");
            regStepConfirm.style.display = "none";
                
            var maxSteps = 5;
            for(i=1; i<=maxSteps; i++){
                var regStep = document.getElementById("regStep" + i);
                if(!regStep){ continue; }
                regStep.style.display = "none";
            }
        }
        
        function RegStep1to2(sender, args){
            if(!CheckRegFormValid(1)){
                //args.set_cancel(true);
                return false;
            }            
      
            RegHideAll();
            var stepId;
            var regTitleText = document.getElementById("regTitleText"); 
            stepId = "regStep2";
            regTitleText.innerHTML = "Step 2 of 3 : Lost Password Retrieval";                  
            var step = document.getElementById(stepId);
            if(!step){ return false; }
            step.style.display = "block";
                                
            //args.set_cancel(false);
            return true;
        }
        function RegStep2to1(sender, args){
        // dont valid for prev
//            if(!CheckRegFormValid(2)){
//                //args.set_cancel(true);
//                return false;
//            }            
      
            RegHideAll();
            var stepId;
            var regTitleText = document.getElementById("regTitleText"); 
                    stepId = "regStep1";
                    regTitleText.innerHTML = "Step 1 of 3 : Create a Password";                 
            var step = document.getElementById(stepId);
            if(!step){ return false; }
            step.style.display = "block";
                                
            //args.set_cancel(false);
            return true;
        }
        function RegStep2to3(sender, args){
            if(!CheckRegFormValid(2)){
                //args.set_cancel(true);
                return false;
            }            
      
            RegHideAll();
            var stepId;
            var regTitleText = document.getElementById("regTitleText"); 
                    stepId = "regStep3";
                    regTitleText.innerHTML = "Step 3 of 3 : Optional Information";               
            var step = document.getElementById(stepId);
            if(!step){ return false; }
            step.style.display = "block";
                                
            //args.set_cancel(false);
            return true;
        }
        function RegStep3to2(sender, args){
//            if(!CheckRegFormValid(3)){
//                //args.set_cancel(true);
//                return false;
//            }            
      
            RegHideAll();
            var stepId;
            var regTitleText = document.getElementById("regTitleText");
                    stepId = "regStep2";
                    regTitleText.innerHTML = "Step 2 of 3 : Lost Password Retrieval";               
            var step = document.getElementById(stepId);
            if(!step){ return false; }
            step.style.display = "block";
                                
            //args.set_cancel(false);
            return true;
        }
        
//        function RegStep(sender, args){
////            console.warn(sender);
////            console.warn(sender.get_id());
////            console.warn(sender.id);
////            console.warn(args);

////            if(!CheckRegFormValid(null)){
////                args.set_cancel(true);
////                return false;
////            }
//            
//            if(!RegShowStep(sender.get_id())){
//                args.set_cancel(true);
//                return false;
//            }
//            args.set_cancel(false);
//            return true;
//        }
        
        function RegShowStep(buttonId){        
            RegHideAll();
            var stepId;
            var regTitleText = document.getElementById("regTitleText");
            switch(buttonId){
                case masterPagePrefix + "btnRegStep2Prev":
                    stepId = "regStep1";
                    regTitleText.innerHTML = "Step 1 of 3 : Create a Password";
                    break;
                    
                case masterPagePrefix + "btnRegStep2Next":
                    stepId = "regStep3";
                    regTitleText.innerHTML = "Step 3 of 3 : Optional Information";
                    break;
            
                case masterPagePrefix + "btnRegStep3Prev":
                case masterPagePrefix + "btnRegStep1Next":
                    stepId = "regStep2";
                    regTitleText.innerHTML = "Step 2 of 3 : Lost Password Retrieval";
                    break;
            
                case masterPagePrefix + "btnRegStep3Finish":
                    if(!confirm("Are you sure you want to submit this information and register this account?")){
                        return false;
                    }                    
                    break;
                    
                default:
                    stepId = "regStep1";
                    regTitleText.innerHTML = "Step 1 of 3 : Create a Password";
                    break;
            }
            var step = document.getElementById(stepId);
            if(!step){ return false; }
            step.style.display = "block";
//          args.set_cancel(true);
            return false;
        }
        
        function RegMessage(step, msg){        
            var regMessageArea = document.getElementById("regMessageArea" + step);
            regMessageArea.innerHTML = msg;
        }
        
        function ForgotMessage(msg){        
            var forgotMessageArea = document.getElementById("forgotMessageArea");
            forgotMessageArea.innerHTML = msg;
        }
        
        function ChangePasswordMessage(msg){        
            var changePasswordMessage = document.getElementById("changePasswordMessageArea");
            changePasswordMessage.innerHTML = msg;
        }
        
        
        /*
        validation
        reg step 1
        */
		/*
        function RegValidateIdCard(sender, args){
			// determine label from sender.
			// by naming convention, or by x? child from parent?
			return ValidateIdCard(sender, "regValidIdCard");
		}
        function ValidateIdCard(sender, validLabel){

		there is also the valid state setting...
		*/
        function RegValidateIdCard(sender, args){
            var val = sender.get_value();
            var label = document.getElementById("regValidIdCard");
            
            // clean input
            val = val.toUpperCase();
			while(val.substring(0,1) === "0"){
				val = val.substring(1);
			}
//            // strip any leading zeros
//            var c = val.length;
//            //for(var i = 0; i < val.length; i++){
//            for(var i = 0; i < c; i++){
//               console.warn("loop: " + c);
//               console.warn(val);
//                if(val.substring(0,1) == 0){
//                   val = val.substring(1);
//				   //
//                  // c--; // string is now shorter. keep index within bounds
//				  // i = 0; // removed leading char, restart string from 0
//				  //
//                }
//                else{
//                  break;
//                }
//            }
            
            val = StripSpecialChars(val);
            
            //var regx = /^[0-9]{6,7}[m, g, x]$/i;
             var regx = /^[0-9]{3,10}[a-z]$/i;
            if(!val.match(regx)){      
                label.innerHTML = "not a valid ID Card Number.";
                regFormFields.regStep1.txtRegIdCard = false;
                return false;
            }  
            
            label.innerHTML = "";
            regFormFields.regStep1.txtRegIdCard = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        function RegValidateCardNum(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("regValidCardNum");
            
            val = StripSpecialChars(val);
            
            var cardLen = 16;
            if(!ValidateDigits(val, cardLen)){      
                validLabel.innerHTML = "must be 16 digits";
                regFormFields.regStep1.txtRegCardNum = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            regFormFields.regStep1.txtRegCardNum = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        function RegValidatePassword(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("regValidPassword");
        
            var minLen = 6;
            if(!ValidateLength(val, minLen)){  
                validLabel.innerHTML = "must be at least " + minLen + " characters";
                regFormFields.regStep1.txtRegPassword = false;
                return false;
            }
            
            // empty
            if(!ValidateEmpty(val)){      
                validLabel.innerHTML = "cannot be empty";
                regFormFields.regStep1.txtRegPassword = false;
                return false;
            }

            // alpha-num
            if (!IsAlphaNum(val)) {
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                regFormFields.regStep1.txtRegPassword = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            regFormFields.regStep1.txtRegPassword = true;            
            
            // check also confirmPass as this may not match anymore after editing newPass
            var txtRegConfirm = document.getElementById(masterPagePrefix + "txtRegConfirm");
            txtRegConfirm = txtRegConfirm.control;
            if(txtRegConfirm){
                RegValidateConfirm(txtRegConfirm.get_value());
            }
            
            return true;
        }
        function CallRegValidateConfirm(sender, args){
            var val = sender.get_value();
            return RegValidateConfirm(val);
        }            
        function RegValidateConfirm(val){
            var validLabel = document.getElementById("regValidConfirm");
            var pass = document.getElementById(masterPagePrefix + "txtRegPassword");            
            if(!pass){ return false; }
            pass = pass.control.get_value();
            
            if(val != pass){  
                validLabel.innerHTML = "passwords do not match";
                regFormFields.regStep1.txtRegConfirm = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            regFormFields.regStep1.txtRegConfirm = true;
            return true;
        }
        
        function RegValidateMobile(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("regValidMobile");
            
            if(val == ""){
                // accept empty for optional
                validLabel.innerHTML = "";
                regFormFields.regStep3.txtRegMobile = true;
                return true;
            }
            
            val = StripSpecialChars(val);
               
            if(val != "" && !ValidateDigits(val, 8)){  
                validLabel.innerHTML = "8 digits, no spaces.";
                regFormFields.regStep3.txtRegMobile = false;
                return false;
            }

            // alpha-num
            if (!IsAlphaNum(val)) {
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                regFormFields.regStep3.txtRegMobile = false;
                return false;
            }
            validLabel.innerHTML = "";
            regFormFields.regStep3.txtRegMobile = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        function RegValidateEmail(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("regValidEmail");
            
            
            if(val == ""){
                // accept empty for optional
                validLabel.innerHTML = "";
                regFormFields.regStep3.txtRegEmail = true;
                return true;
            }
                          
            if(val != "" && !validateEmail(val)){  
                validLabel.innerHTML = "not a valid email.";
                regFormFields.regStep3.txtRegEmail = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            regFormFields.regStep3.txtRegEmail = true;
            return true;
        }
        function validateEmail(email) { 
            var re = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i;
            return re.test(email);
        } 
        
        function RegValidateSecretA(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("regValidSecretA");

            // alpha-num
            if (!IsAlphaNumSpace(val)) {
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                regFormFields.regStep2.txtRegSecretA = false;
                return false;
            }
            
            if(!ValidateLength(val, 6)){  
                validLabel.innerHTML = "minimum 6 characters";
                regFormFields.regStep2.txtRegSecretA = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            regFormFields.regStep2.txtRegSecretA = true;
            return true;
        }
        
        /*
        validation
        forgot pass
        
        TODO - most of these are like reg valid
          txtForgotIdCard: false,
            txtForgotCardNum: false,
            txtForgotNewPass: false,
            txtForgotConfirm: false,
            txtForgotSecretA: false
        */
		/*
        function ValidForgotIdCard(sender, args){
			// determine label from sender.
			// by naming convention, or by x? child from parent?
			return ValidateIdCard(sender, "validForgotIdCard");
		}
		*/
        function ValidLoginIdCard(sender, args){
            var val = sender.get_value();
           var validLabel = document.getElementById(masterPagePrefix + "loginMessage");
            
            // clean input
            val = val.toUpperCase();
			while(val.substring(0,1) === "0"){
				val = val.substring(1);
			}
            val = StripSpecialChars(val);
            
            var regx = /^[0-9]{3,10}[a-z]$/i;
            if(!val.match(regx)){      
                validLabel.innerHTML = "not a valid ID Card number.";
                return false;
            }  
            
            validLabel.innerHTML = "";
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
		}
        function ValidForgotIdCard(sender, args){
            var val = sender.get_value();
           var validLabel = document.getElementById("validForgotIdCard");
            
            // clean input
            val = val.toUpperCase();
			while(val.substring(0,1) === "0"){
				val = val.substring(1);
			}
            val = StripSpecialChars(val);
            
            var regx = /^[0-9]{3,10}[a-z]$/i;
            if(!val.match(regx)){      
                validLabel.innerHTML = "not a valid ID Card number.";
                forgotFields.txtForgotIdCard = false;
                return false;
            }  
            
            validLabel.innerHTML = "";
            forgotFields.txtForgotIdCard = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        function ValidForgotCardNum(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("validForgotCardNum");
            
            val = StripSpecialChars(val);
            
            var cardLen = 16;
            if(!ValidateDigits(val, cardLen)){      
                validLabel.innerHTML = "must be 16 digits";
                forgotFields.txtForgotCardNum = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            forgotFields.txtForgotCardNum = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        
        function CharsRemaining(fixedLen, val, validLabel){
           /*
           print number of remaining chars for a valid input
           */
           
           // get label. return if not found.
            validLabel = document.getElementById(validLabel);
            if(!validLabel){ return false; }
            
            // omit special chars from count.
            // this does not take into account non-digits. 
            // that will be marked as invalid later onBlur.
            val = StripSpecialChars(val);
            
            if(val.length == fixedLen){ 
                // length matches
                validLabel.innerHTML = "";
                return true; 
            } 
            if(val.length < fixedLen){
                // more required
                validLabel.innerHTML = fixedLen + " characters (" + (fixedLen - val.length) + " more)";
            }
            else{
                // limit exceeded
                validLabel.innerHTML = fixedLen + " characters (remove " + (val.length - fixedLen) + " characters)";
            }
            return true;
        } 
        
        function MinCharsRemaining(minLen, val, validLabel){
           /*
           print number of remaining chars for a valid input
           */
           
           // get label. return if not found.
            validLabel = document.getElementById(validLabel);
            if(!validLabel){ return false; }
            
            // omit special chars from count.
            // this does not take into account non-digits. 
            // that will be marked as invalid later onBlur.
            val = StripSpecialChars(val);
            
            if(val.length < minLen){
                // more required
                validLabel.innerHTML = "minimum " + minLen + " characters (" + (minLen - val.length) + " more required)";
                return true; 
            }    
                    
            validLabel.innerHTML = "";
            return true; 
        } 
        /**/      
        function ForgotCardNumRemaining(sender) {
            var val = sender.value;
            var fixedLen = 16;
            var validLabel = "validForgotCardNum";
            CharsRemaining(fixedLen, val, validLabel);
        }
        function ForgotPasswordRemaining(sender) {
            var val = sender.value;
            var minLen = 6;
            var validLabel = "validForgotPassword";
            MinCharsRemaining(minLen, val, validLabel);
        }
        function ForgotConfirmRemaining(sender) {
            var val = sender.value;
            var minLen = 6; 
            // get len of txtpass
            var txtForgotNewPass = document.getElementById(masterPagePrefix + "txtForgotNewPass");
            txtForgotNewPass = txtForgotNewPass.control;
            if(txtForgotNewPass){
                // set if there is some value newPass
                if(txtForgotNewPass.get_value().length > 0){
                    minLen = txtForgotNewPass.get_value().length;
                }
            }
            var validLabel = "validForgotConfirm";
            MinCharsRemaining(minLen, val, validLabel);
        }
        function ForgotSecretARemaining(sender) {
            var val = sender.value;
            var minLen = 6;
            var validLabel = "validForgotSecretA";
            MinCharsRemaining(minLen, val, validLabel);
        }
        /**/        
        function ChangePasswordRemaining(sender) {
            var val = sender.value;
            var minLen = 6;
            var validLabel = "validChangePasswordNew";
            MinCharsRemaining(minLen, val, validLabel);
        }
        function ChangeConfirmRemaining(sender) {
            var val = sender.value;
            var minLen = 6; 
            // get len of txtpass
            var txtForgotNewPass = document.getElementById(masterPagePrefix + "txtChangePasswordNew");
            txtForgotNewPass = txtForgotNewPass.control;
            if(txtForgotNewPass){
                // set if there is some value newPass
                if(txtForgotNewPass.get_value().length > 0){
                    minLen = txtForgotNewPass.get_value().length;
                }
            }
            var validLabel = "validChangePasswordConfirm";
            MinCharsRemaining(minLen, val, validLabel);
        }
        /**/       
        function RegCardNumRemaining(sender) {
            var val = sender.value;
            var fixedLen = 16;
            var validLabel = "regValidCardNum";
            CharsRemaining(fixedLen, val, validLabel);
        }
        function RegPasswordRemaining(sender) {
            var val = sender.value;
            var minLen = 6;
            var validLabel = "regValidPassword";
            MinCharsRemaining(minLen, val, validLabel);
        }
        function RegConfirmRemaining(sender) {
            var val = sender.value;
            var minLen = 6; 
            // get len of txtpass
            var txtForgotNewPass = document.getElementById(masterPagePrefix + "txtRegPassword");
            txtForgotNewPass = txtForgotNewPass.control;
            if(txtForgotNewPass){
                // set if there is some value newPass
                if(txtForgotNewPass.get_value().length > 0){
                    minLen = txtForgotNewPass.get_value().length;
                }
            }
            var validLabel = "regValidConfirm";
            MinCharsRemaining(minLen, val, validLabel);
        }        
        function RegSecretARemaining(sender) {
            var val = sender.value;
            var minLen = 6;
            var validLabel = "validForgotSecretA";
            MinCharsRemaining(minLen, val, validLabel);
        }     
        function RegMobileRemaining(sender) {
            var val = sender.value;
            var fixedLen = 8;
            var validLabel = "regValidMobile";
            CharsRemaining(fixedLen, val, validLabel);
        }
        /**/
        
        
        
        
        
        function ValidForgotPassword(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("validForgotPassword");
        
            var minLen = 6;
            if(!ValidateLength(val, minLen)){  
                validLabel.innerHTML = "must be at least " + minLen + " characters";
                forgotFields.txtForgotNewPass = false;
                return false;
            }
            
            // empty
            if(!ValidateEmpty(val)){      
                validLabel.innerHTML = "cannot be empty";
                forgotFields.txtForgotNewPass = false;
                return false;
            }

            // alpha-num
            if (!IsAlphaNum(val)) {
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                forgotFields.txtForgotNewPass = false;
                return false;
            }
            
            // special chars
            if(!ValidateSpecialChars(val)){  
                validLabel.innerHTML = "cannot contain spaces";
                forgotFields.txtForgotNewPass = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            forgotFields.txtForgotNewPass = true;
            
            // check also confirmPass as this may not match anymore after editing newPass
            var txtForgotConfirm = document.getElementById(masterPagePrefix + "txtForgotConfirm");
            txtForgotConfirm = txtForgotConfirm.control;
            if(txtForgotConfirm){
                ValidForgotConfirm(txtForgotConfirm.get_value());
            }
            
            return true;
        }
        function CallValidForgotConfirm(sender, args){
            var val = sender.get_value();
            return ValidForgotConfirm(val);
        }
        function ValidForgotConfirm(val){
            // separate function so it can be called from forgotNewPass as well
            var validLabel = document.getElementById("validForgotConfirm");
            var pass = document.getElementById(masterPagePrefix + "txtForgotNewPass");            
            if(!pass){ return false; }
            pass = pass.control.get_value();
                      
            if(val != pass){  
                validLabel.innerHTML = "passwords do not match";
                forgotFields.txtForgotConfirm = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            forgotFields.txtForgotConfirm = true;
            return true;
        }
        function ValidForgotSecretA(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("validForgotSecretA");

            // alpha-num
            if (!IsAlphaNumSpace(val)) {
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                forgotFields.txtForgotSecretA = false;
                return false;
            }
            
            if(!ValidateLength(val, 6)){  
                validLabel.innerHTML = "minimum 6 characters";
                forgotFields.txtForgotSecretA = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            forgotFields.txtForgotSecretA = true;
            return true;
        }
        
        
        
        
        /*
        validation change pass
        */
        function ValidChangePasswordIdCard(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("validChangePasswordIdCard");
            
            // clean input
            val = val.toUpperCase();
            // strip any leading zeros
            var c = val.length;
            //for(var i = 0; i < val.length; i++){
            for(var i = 0; i < c; i++){
                if(val.substring(0,1) == 0){
                   val = val.substring(1);
                  // c--; // update loop count
                }
                else{
                  break;
                }
            }
            
            var regx = /^[0-9]{3,10}[a-z]$/i;
            if(!val.match(regx)){      
                validLabel.innerHTML = "not a valid ID Card number.";
                changePasswordFields.txtChangePasswordIdCard = false;
                return false;
            }  
            
            validLabel.innerHTML = "";
            changePasswordFields.txtChangePasswordIdCard = true;
            
            // update textbox with cleaned up input
            sender.set_value(val);            
            return true;
        }
        
        function ValidChangePasswordNew(sender, args){
            var val = sender.get_value();
            var validLabel = document.getElementById("validChangePasswordNew");
        
            var minLen = 6;
            if(!ValidateLength(val, minLen)){  
                validLabel.innerHTML = "must be at least " + minLen + " characters";
                changePasswordFields.txtChangePasswordNew = false;
                return false;
            }
            
            // empty
            if(!ValidateEmpty(val)){      
                validLabel.innerHTML = "cannot be empty";
                changePasswordFields.txtChangePasswordNew = false;
                return false;
            }            
            // alpha-num
            if(!IsAlphaNum(val)){  
                validLabel.innerHTML = "use only letters and numbers (alphanumeric)";
                changePasswordFields.txtChangePasswordNew = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            changePasswordFields.txtChangePasswordNew = true;
            
            // check also confirmPass as this may not match anymore after editing newPass
            var txtChangePasswordConfirm = document.getElementById(masterPagePrefix + "txtChangePasswordConfirm");
            txtChangePasswordConfirm = txtChangePasswordConfirm.control;
            if(txtChangePasswordConfirm){
                ValidChangePasswordConfirm(txtChangePasswordConfirm.get_value());
            }
            
            return true;
        }
        function CallValidChangePasswordConfirm(sender, args){
            var val = sender.get_value();
            return ValidChangePasswordConfirm(val);
        }            
        function ValidChangePasswordConfirm(val){
            var validLabel = document.getElementById("validChangePasswordConfirm");
            var pass = document.getElementById(masterPagePrefix + "txtChangePasswordNew");            
            if(!pass){ return false; }
            pass = pass.control.get_value();
          
            // special chars
            if(val != pass){  
                validLabel.innerHTML = "passwords do not match";
                changePasswordFields.txtChangePasswordConfirm = false;
                return false;
            }
            
            validLabel.innerHTML = "";
            changePasswordFields.txtChangePasswordConfirm = true;
            return true;
        }
        
        /*
        clear validation messages
        */
        function ClearValidationMessage(id){
            var validMessage = document.getElementById(id);
            validMessage.innerHTML = "";
        }
        /*-----------------
        forgot
        -----------------*/
        function ClearValidForgotPassword(){
            ClearValidationMessage("validForgotPassword");
            // clear confirm too            
            ClearValidationMessage("validForgotConfirm");
        }
        function ClearValidForgotConfirm(){
            //ClearValidationMessage("validForgotConfirm");
            // clear pass too            
            ClearValidationMessage("validForgotPassword");
        }
        function ClearValidForgotSecretA(){
            ClearValidationMessage("validForgotSecretA");
        }
        function ClearValidForgotCardNum(){
            ClearValidationMessage("validForgotCardNum");
        }
        function ClearValidForgotIdCard(){
            ClearValidationMessage("validForgotIdCard");
        }
       
        /*-----------------
        Change
        -----------------*/
        function ClearValidChangePassword(){
            ClearValidationMessage("validChangePasswordNew");
            // clear confirm too            
            ClearValidationMessage("validChangePasswordConfirm");
        }
        function ClearValidChangeConfirm(){
            ClearValidationMessage("validChangePasswordConfirm");
        }
        /*-----------------
        Register
        -----------------*/
        function ClearValidRegisterPassword(){
            ClearValidationMessage("regValidPassword");
            // clear confirm too            
            ClearValidationMessage("regValidConfirm");
        }
        function ClearValidRegisterConfirm(){
            ClearValidationMessage("regValidConfirm");
        }
        function ClearValidRegisterCardNum(){
            ClearValidationMessage("regValidCardNum");
        }
        function ClearValidRegisterIdCard(){
            ClearValidationMessage("regValidIdCard");
        }        
        function ClearValidRegisterSecretA(){
            ClearValidationMessage("regValidSecretA");
        }      
        function ClearValidRegisterMobile(){
            ClearValidationMessage("regValidMobile");
        }      
        function ClearValidRegisterEmail(){
            ClearValidationMessage("regValidEmail");
        }
        
       
        
        /*
        validation
        generic
        */
        function ValidateEmpty(val){
            if(!val || val == "" || val == null){
                return false;
            }
            return true;
        }
        function IsAlphaNum(val) {
            // NO spaces
            var regx = /^[a-z0-9]+$/i;
            if (val.match(regx)) {
                return true;
            }
            return false;
        }
        function IsAlphaNumSpace(val) {
            // inc spaces
            var regx = /^[a-z0-9\s]+$/i;
            if (val.match(regx)) {
                return true;
            }
            return false;
        }
        function ValidateSpecialChars(val){
            // return bool on match
            // space, 
            var regx = /\s/;
            if(val.match(regx)){
                return false;
            }
            return true;
        }
        function StripSpecialChars(val){
            // returns string without the offending chars 
            // space - + _ ( )
            //
            // todo: match \d return only matches in string (filter non-digits)
            // note: we want to allow user to type in these chars
            var regx = /[\s_\(\)\-\+]/gi;
            var stripped = "";
            return val.replace(regx, stripped);
        }
        function ValidateLength(val, minLen){
            if(val.length < minLen){
                return false;
            }
            return true;
        }
        function ValidateDigits(val, len){
            var regx = new RegExp("^[0-9]{" + len + "}$","i");
            // /^[0-9]{len}$/;
            if(!val.match(regx)){
                return false;
            }
            return true;
        }
        
        function onResponseEnd(sender, args) {

        }
        
