﻿

    //The Id of the most recently submitted form    
    var currentFormID = '';
    
    //controls that require validation
    var controlsToValidate = [];
    
	//controls that need to be submitted (all forms)
	var controlsToSubmit = [];
	
    //getActiveFields
    var getActiveMetaDataFields = [];
    
    //GetActive Urls, keyed by the id of the form
    var GetActiveURLs = [];
    function AddGetActiveURL(formId, url){
        GetActiveURLs[formId] = url;
    }
    
    //Get Active Domains, keyed by the id of the form
    var GetActiveDomains = [];
    function AddGetActiveDomain(formId, domain){
        GetActiveDomains[formId] = domain;
    }
    
    //Indicates a GetActive Form, keyed by the id of the form
    var GetActiveForm = [];
    function AddGetActiveForm(formID, isGetActiveForm){
        GetActiveForm[formID] = isGetActiveForm;
    }
        
	var GetActiveSources = [];
	function AddGetActiveSource(formId, source){
		GetActiveSources[formId] = source;
	}
		   
	//Add a redirect locations for submitted forms (redirect or thank you message) here.   
	var RedirectLocations = [];   
	function AddRedirectLocation(formId, action){
		RedirectLocations[formId] = action;
	}
		
    //Addresses to email form results to, keyed by the id of the form
    var EmailTo = [];
    function AddEmailToAddresses(formID, emailTo){
        EmailTo[formID] = htmlDecode(emailTo);
    }
        
    //Name of the form, keyed by the id of the form
    var FormName = [];
    function AddFormName(formID, name){
        FormName[formID] = name;
    }

    //Constructs a ValidationData object from the parameter list. The ValidationData object is then added to 
    //controlsToValidate
    function RegisterControlForValidation(clientId, fieldLabel, validationType, formID, parameters){
        var vdata  = new ValidationData();
        vdata.initialize(clientId, fieldLabel, validationType, formID, parameters);
        controlsToValidate.push(vdata);
    }
	
	function RegisterControlForSubmission(clientId, fieldLabel, formID, GetActiveField, GetActiveFieldName, FieldType, GroupId){
		var field = new SubmissionField();
		field.initialize(clientId, fieldLabel, formID, GetActiveField, GetActiveFieldName, FieldType, GroupId);
		controlsToSubmit.push(field);
	}
	    
    function RegisterGetActiveField(clientId, getActiveFieldName, formID){
        var gamd = new GetActiveMetaDataField();
        gamd.initialize(clientId, getActiveFieldName, formID);
        getActiveMetaDataFields.push(gamd);
    }
    
    //Submits the controlsToValidate array to our server side validator
    function SubmitForValidation(formID){
		currentFormID = formID;
        var domain = GetActiveDomains[formID];
        var url = GetActiveURLs[formID];
        var getActiveForm = GetActiveForm[formID];
        
        var controlToValidate_filtered = controlsToValidate.findAll(function(item, index){
            return item.FormID == formID;
        });
        		        
		GatherFieldValues(controlToValidate_filtered);
		controlToValidate_filtered.each(function(item, index){
		    item.Value = js_RemoveChar(item.Value);  
		}
		)
		var params = 'action=validateForm&FormID=' + currentFormID + '&fields=' + controlToValidate_filtered.toJSON();
        var validationRequest = new Ajax.Request(
            '/DisplayControls/FormValidator.aspx',
            {method:'post', parameters:params, onSuccess:HandleValidationResults
			 ,onFailure:HandleFailure, onException:HandleException });
    }
    
	
	function HandleFailure(exception){
	}
	
	
	function HandleException(arg1, arg2){
	}
    
    function HandleValidationResults(originalRequest){
        try{
        
         
          var validationResults = originalRequest.responseText.evalJSON();
		  var isFormValid = true;
        if(validationResults.each){
            validationResults.each(function(item, index){
                //locate the <span> tags
                var errorSpan = GetErrorSpanElement(item);
                if(!item.IsValid){
                    isFormValid = false
                    try{
                        if(errorSpan && errorSpan[0]){ 
							$(errorSpan[0].id).style.visibility = 'visible'; 
							$(errorSpan[0].id).style.display = 'block';
						}
                    }
                    catch(e){
                    //TODO:This should send off an email to developers _KM
						alert(e);
                    }
                } 
                else{
                    if(errorSpan && errorSpan[0]){
						$(errorSpan[0].id).style.visibility =  'hidden';
						$(errorSpan[0].id).style.display = 'none';
                }
            }
        });
        }
        if (isFormValid){
            //Submit to database & Get Active 
            //Get the values entered on screen
            GatherFieldValues(getActiveMetaDataFields);
			var fields = controlsToSubmit.findAll(function(item, index){
            return item.FormID == currentFormID;
			});
			
			GatherFieldValues(fields);
			
			var params = new Hash();
            params.set('action', "SUBMITFORMDATA");
			params.set('formID', currentFormID);
			params.set('formName', FormName[currentFormID]);
			params.set('getactiveform', GetActiveForm[currentFormID]);
			params.set('getActiveURL', GetActiveURLs[currentFormID]);
			params.set('getActiveSource', GetActiveSources[currentFormID]);
			params.set('domain',  GetActiveDomains[currentFormID]);
			params.set('emailTo', EmailTo[currentFormID]);
			params.set('fields',  fields.toJSON());
			
			var submitFormData = new Ajax.Request('/FormSubmissionHandler.ashx', 
			    {
				 method:'post', 
				 parameters:params,
				 onSuccess:HandleFormDataSubmissionResults,
				 onException:HandleSubmissionException,
				 onFailure:HandleSubmissionFailure
				}
			);
        }else{
            if (typeof ddequalcolumns!='undefined'){
                ddequalcolumns.setHeights("reset");
            }
        }
        
        
        }catch(e){
			alert(e);
        }
    }
    
    function HandleSubmissionException(requester, exception){
		var req = requester;
		var ex = exception;
		ShowErrorMessage();
	}
	
	function HandleSubmissionFailure(failure){
		var f =  failure;
		ClearFieldValues();
		ShowErrorMessage();
	}
		
    function HandleFormDataSubmissionResults(originalRequest){
		ClearFieldValues();
		//ShowThankYouMessage();
		TakePostSaveAction();			  
	}
    
	function ClearFieldValues(){
		controlsToSubmit.each(function(item, index){item.Value = undefined;});
	}
	
	function GetFields(validationResults){
		var results = '';
		validationResults.each(function(item, index){
			results += item.FieldLabel + '=' + item.Value + '_' + item.GetActiveField.toString() + '|';
		});
		return results;
	}
	
    //Locates and returns the span tag that matched the criteria specified by item
    function GetErrorSpanElement(validationData){
        var spanElements = document.getElementsByTagName('span');
        var errorSpan;
        try{
            errorSpan = $A(spanElements).findAll(function(spanItem, spanIndex){
			 if(spanItem.attributes['controltovalidate'] && spanItem.attributes['validationtype']){
                    return spanItem.attributes['controltovalidate'].value == validationData.ClientID && spanItem.attributes['validationtype'].value == validationData.ValidationType;
                }
            });
         }
         catch(e){
			alert(e);  
		  }
         
         return errorSpan;
    }
    
    
    //Gathers the values of the fields in the passed in collection, and sets those values in controlsToValidate
    function GatherFieldValues(fieldCollection){
          
		  fieldCollection.each(function(item, index){
            try{
                var type;
                var id = item.ClientID;
                
				var nodename = $(id).nodeName.toLowerCase();
                if (nodename == 'select' || nodename == 'textarea'){ type = nodename};
                if (nodename == 'input'){ type = $(id).attributes['type'].value};
                if (nodename == 'div'){type = 'choice';}
				
                if (type){
					        
				switch(type){
                        case 'text':
                            item.Value = encodeURIComponent(js_RemoveCarriageReturn(js_RemoveChar($(id).value)));
                            break;
                        case 'textarea':
                            item.Value = encodeURIComponent(js_RemoveCarriageReturn(js_RemoveChar($(id).value)));
                            break;
                        case 'select':
                            item.Value = $(id).options[$(id).selectedIndex].value;
                            break;
                        case 'choice':
						//Need to add a field that captures the values of the options
						//selected.
						
						  var elements = $A($(id).getElementsByTagName('input'));
                          elements.each(function(element, elementIndex){
							if (element.checked == true){
						        if (item.Value == '' || item.Value == undefined){
									item.Value = element.value;
								}else{
									item.Value += ',' + element.value;
								}
                            }
                          });
                          break;
                        case 'password':
                            item.Value = escape(js_RemoveChar($(id).value));
                            break;
                    }
                }                
              }catch(e){
                item.Value = '';
            }
        });
    }
    
    
    /******************************************************/
    function js_RemoveCarriageReturn(str)
    {
        return str.replace(/(\r\n|[\r\n])/g, " ");
    }
    function js_RemoveChar(str)
    {
        regExp = new RegExp("[\"]","g");
        //return str.replace(regExp,"\"""");
        return str.replace(regExp, "\\'");
    }
	
	function isEmpty(val)
	{
		if(val){
			return ((val===null) || val.length==0 || /^\s+$/.test(val));
		}else{
			return true;
		}
	}
	
	// Function to loop through an array swaping each item with the value from another array e.g swap HTML entities with Numericals
	function swapArrayVals(s,arr1,arr2)
	{
		if(this.isEmpty(s)) return "";
		var re;
		if(arr1 && arr2){
			//ShowDebug("in swapArrayVals arr1.length = " + arr1.length + " arr2.length = " + arr2.length)
			// array lengths must match
			if(arr1.length == arr2.length){
				for(var x=0,i=arr1.length;x<i;x++){
					re = new RegExp(arr1[x], 'g');
					s = s.replace(re,arr2[x]); //swap arr1 item with matching item from arr2	
				}
			}
		}
		return s;
	}	
	
	// Convert HTML entities into numerical entities
	function HTML2Numerical(s)
	{
		var arr1 = new Array('&nbsp;','&iexcl;','&cent;','&pound;','&curren;','&yen;','&brvbar;','&sect;','&uml;','&copy;','&ordf;','&laquo;','&not;','&shy;','&reg;','&macr;','&deg;','&plusmn;','&sup2;','&sup3;','&acute;','&micro;','&para;','&middot;','&cedil;','&sup1;','&ordm;','&raquo;','&frac14;','&frac12;','&frac34;','&iquest;','&agrave;','&aacute;','&acirc;','&atilde;','&Auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&Ouml;','&times;','&oslash;','&ugrave;','&uacute;','&ucirc;','&Uuml;','&yacute;','&thorn;','&szlig;','&agrave;','&aacute;','&acirc;','&atilde;','&auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&ouml;','&divide;','&oslash;','&ugrave;','&uacute;','&ucirc;','&uuml;','&yacute;','&thorn;','&yuml;','&quot;','&amp;','&lt;','&gt;','&oelig;','&oelig;','&scaron;','&scaron;','&yuml;','&circ;','&tilde;','&ensp;','&emsp;','&thinsp;','&zwnj;','&zwj;','&lrm;','&rlm;','&ndash;','&mdash;','&lsquo;','&rsquo;','&sbquo;','&ldquo;','&rdquo;','&bdquo;','&dagger;','&dagger;','&permil;','&lsaquo;','&rsaquo;','&euro;','&fnof;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigmaf;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&thetasym;','&upsih;','&piv;','&bull;','&hellip;','&prime;','&prime;','&oline;','&frasl;','&weierp;','&image;','&real;','&trade;','&alefsym;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&crarr;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&forall;','&part;','&exist;','&empty;','&nabla;','&isin;','&notin;','&ni;','&prod;','&sum;','&minus;','&lowast;','&radic;','&prop;','&infin;','&ang;','&and;','&or;','&cap;','&cup;','&int;','&there4;','&sim;','&cong;','&asymp;','&ne;','&equiv;','&le;','&ge;','&sub;','&sup;','&nsub;','&sube;','&supe;','&oplus;','&otimes;','&perp;','&sdot;','&lceil;','&rceil;','&lfloor;','&rfloor;','&lang;','&rang;','&loz;','&spades;','&clubs;','&hearts;','&diams;');
		var arr2 = new Array('&#160;','&#161;','&#162;','&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;','&#170;','&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;','&#179;','&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;','&#187;','&#188;','&#189;','&#190;','&#191;','&#192;','&#193;','&#194;','&#195;','&#196;','&#197;','&#198;','&#199;','&#200;','&#201;','&#202;','&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;','&#210;','&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;','&#219;','&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;','&#227;','&#228;','&#229;','&#230;','&#231;','&#232;','&#233;','&#234;','&#235;','&#236;','&#237;','&#238;','&#239;','&#240;','&#241;','&#242;','&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;','&#250;','&#251;','&#252;','&#253;','&#254;','&#255;','&#34;','&#38;','&#60;','&#62;','&#338;','&#339;','&#352;','&#353;','&#376;','&#710;','&#732;','&#8194;','&#8195;','&#8201;','&#8204;','&#8205;','&#8206;','&#8207;','&#8211;','&#8212;','&#8216;','&#8217;','&#8218;','&#8220;','&#8221;','&#8222;','&#8224;','&#8225;','&#8240;','&#8249;','&#8250;','&#8364;','&#402;','&#913;','&#914;','&#915;','&#916;','&#917;','&#918;','&#919;','&#920;','&#921;','&#922;','&#923;','&#924;','&#925;','&#926;','&#927;','&#928;','&#929;','&#931;','&#932;','&#933;','&#934;','&#935;','&#936;','&#937;','&#945;','&#946;','&#947;','&#948;','&#949;','&#950;','&#951;','&#952;','&#953;','&#954;','&#955;','&#956;','&#957;','&#958;','&#959;','&#960;','&#961;','&#962;','&#963;','&#964;','&#965;','&#966;','&#967;','&#968;','&#969;','&#977;','&#978;','&#982;','&#8226;','&#8230;','&#8242;','&#8243;','&#8254;','&#8260;','&#8472;','&#8465;','&#8476;','&#8482;','&#8501;','&#8592;','&#8593;','&#8594;','&#8595;','&#8596;','&#8629;','&#8656;','&#8657;','&#8658;','&#8659;','&#8660;','&#8704;','&#8706;','&#8707;','&#8709;','&#8711;','&#8712;','&#8713;','&#8715;','&#8719;','&#8721;','&#8722;','&#8727;','&#8730;','&#8733;','&#8734;','&#8736;','&#8743;','&#8744;','&#8745;','&#8746;','&#8747;','&#8756;','&#8764;','&#8773;','&#8776;','&#8800;','&#8801;','&#8804;','&#8805;','&#8834;','&#8835;','&#8836;','&#8838;','&#8839;','&#8853;','&#8855;','&#8869;','&#8901;','&#8968;','&#8969;','&#8970;','&#8971;','&#9001;','&#9002;','&#9674;','&#9824;','&#9827;','&#9829;','&#9830;');
		return this.swapArrayVals(s,arr1,arr2);
	}
	  
	// HTML Decode numerical and HTML entities back to original values
	function htmlDecode(s)
	{
		var c,m,d = s;
		
		if(this.isEmpty(d)) return "";

		// convert HTML entites back to numerical entites first
		d = this.HTML2Numerical(d);
		
		// look for numerical entities &#34;
		arr=d.match(/&#[0-9]{1,5};/g);
		
		// if no matches found in string then skip
		if(arr!=null){
			for(var x=0;x<arr.length;x++){
				m = arr[x];
				c = m.substring(2,m.length-1); //get numeric part which is refernce to unicode character
				// if its a valid number we can decode
				if(c >= -32768 && c <= 65535){
					// decode every single match within string
					d = d.replace(m, String.fromCharCode(c));
				}else{
					d = d.replace(m, ""); //invalid so replace with nada
				}
			}			
		}

		return d;
	}
    
    var ValidationData = Class.create();
    ValidationData.prototype = {
        initialize: function(clientID, fieldLabel, validationType, formID, parameters ){
            if (clientID){this.ClientID = clientID;}
			if (fieldLabel){this.FieldLabel = encodeURIComponent( js_RemoveChar(fieldLabel) );}
            if (validationType){this.ValidationType = validationType;}
            if (parameters){this.Parameters = parameters;}
            
			if (formID){this.FormID = formID;}
        },
         
        SetFieldValue : function(value){
            this.Value = js_RemoveChar(value);
        },
        
        ClientID : '',
        FormID : '',
        ValidationType : '',
        Value : '',
        IsValid : false,
        Parameters : '',
        ErrorMessage : '',
        GetActiveField : false,
		FieldLabel : ''
    }
	
	
	
	
	var SubmissionField = Class.create();
		SubmissionField.prototype = {
			initialize : function(clientID, fieldLabel, formID, getActiveField, getActiveFieldName, fieldType, groupId){
				if(clientID){this.ClientID = clientID;}
				if(fieldLabel){this.FieldLabel = encodeURIComponent(js_RemoveChar(fieldLabel));}
				if(formID){this.FormID = formID;}
				if(getActiveField){this.GetActiveField = getActiveField;}
				if(getActiveFieldName){this.GetActiveFieldName = getActiveFieldName;}
				if(fieldType) {this.FieldType = fieldType;}
				if(groupId) { this.GroupId = groupId;}
		},
	
		SetFieldValue : function(value){
			this.Value = js_RemoveChar(value);
		},
	
		ClientID: '',
		FormID : '',
		Value : '',
		GetActiveField : '',
		GetActiveFieldName : '',
		FieldType : '',
		GroupId : ''
	}
    /*******************************************************/
    
    var GetActiveMetaDataField = Class.create();
        GetActiveMetaDataField.prototype = {
            initialize: function(clientID, getActiveFieldName, formID){
            if(clientID){this.ClientID = clientID;}
            if(getActiveFieldName){this.GetActiveFieldName = getActiveFieldName;}
            
			if(formID){this.FormID = formID;}
        },
    
        SetFieldValue : function(value){
            this.Value = value;
        },
    
        ClientID: '',
        FormID: '',
        GetActiveFieldName: '',
        Value : ''
    }


