$(document).ready(function(){
   $('head').append('<style> .greybox { background-color:#f2f2f2; }  </style>');

   prefillForm();
   
   remove_grey_class();

    $("form").each(function(i) {
        this.oldsubmitfunc = this.onsubmit;
        this.onsubmit = function () {
          if(this.oldsubmitfunc) {
            var ret = this.oldsubmitfunc();
            if(!ret) {
              return ret;
            }
          }
          return saveFormValuesToCookie();
        };
    });

   
   
    var form_id = getParamValue_new('form_id');
    var successUrl = getParamValue_new('successURL');
    var next_button = getParamValue_new('next');
    var prev_button = getParamValue_new('prev');
    var thanks = getParamValue_new('thanks');
    
    if (form_id) {
	    var leadformid_input=document.createElement('input');
      leadformid_input.id='leadform_id';
		leadformid_input.name='leadform_id';
		leadformid_input.type='hidden';
		leadformid_input.value = form_id;
		document.forms.contactUsForm.appendChild(leadformid_input);
	}
	
	if (successUrl) {
	  
	  //for backward compatibility, keep it
	  //as it appending child always, make it conditional, add only if it is not already there.
	  var elem = document.getElementById('successURL');
    if(!elem && $('#successURL').length==0 && $('input[name=successURL]').length==0) {
	    var successUrl_input=document.createElement('input');
      successUrl_input.id='successURL';
  		successUrl_input.name='successURL';
  		successUrl_input.type='hidden';
  		successUrl_input.value = successUrl;
  		document.forms.contactUsForm.appendChild(successUrl_input);
		}
	}

	if (next_button == 'true') {
	   document.getElementById('next_button').style.display = 'block';
	}
	if (prev_button == 'true') {
	   document.getElementById('prev_button').style.display = 'block';
	}
	
	if (thanks == 'true') {
	  if (document.getElementById('show_thanks')) {
		   document.getElementById('show_thanks').style.display = 'block';
		   var first_name = readEscapedCookie('firstName');
		   if(first_name) {
		     document.getElementById('thanks_first_name').innerHTML = first_name + '!';
		   } 
	   }
	}
});

function remove_grey_class() {

  $("input").focus(  function(){ 
   $(this).removeClass("greybox");
 }  );
  $("select").focus( function(){
   $(this).removeClass("greybox");
 } );

}


function getParamValue_new( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
	return "";
  else
	return results[1];
}

function readEscapedCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return unescapeCookieValue(c.substring(nameEQ.length,c.length));
	}
	return null;
}

function prefillForm(){
  if (document.cookie.length>0) {
    var formDataCookieValue = '';
    if(typeof JSON != 'undefined' && typeof JSON === 'object' && (formDataCookieValue = readEscapedCookie('sp_formdata')) && formDataCookieValue != '') {
      var formData = JSON.parse(formDataCookieValue);
      if(formData) {
        for(var name in formData) {
          setSelectedValues(name, formData[name]);
        }
      }
    }
    else {
      var cookieValueString = document.cookie;
      var cookiearray  = cookieValueString.split(";");
      for(var i=0; i<cookiearray.length; i++){
      
        var name = trim(cookiearray[i].split('=')[0]);
          if (cookiearray[i].split('=')[1]) {
          	var value = unescapeCookieValue(trim(cookiearray[i].split('=')[1]));//.replace('"','').replace('"','');
            setSelectedValues(name, value);
          }
      }
    }
  }
}

function saveFormValuesToCookie() {
    //some forim fields, we dont need to save, they are control field and always will be hidden. we dont set hidden fields
    var dontSaveFormFields = ["form_name", "successURLQueryString", "successURL", "saveUser", "saveLead", "saveExtraInfo", "leadsource", "startLeadSession", "isRecoLeadForm", "relayUserId", "relayLeadId", "lead_version_id", "relayIntentToken", "Submit"];
    var formElems = document.forms[0].elements;
    if(typeof JSON != 'undefined' && typeof JSON === 'object') {
        var formData = {};
        var formDataCookieName = 'sp_formdata';
        var formDataCookieValue = readEscapedCookie(formDataCookieName);
        if(formDataCookieValue && formDataCookieValue!='') {
            formData = JSON.parse(formDataCookieValue);
        }
    }
    for (var i=0; i<formElems.length; i++) {
        var paramName = trim(formElems[i].name);
        if($.inArray( paramName, dontSaveFormFields) !== -1) 
            continue;
        var paramValue = Array();
        var lastTwoChar = paramName.substring(paramName.length-2);
        if(lastTwoChar=='[]') {
            paramName = paramName.substring(0, paramName.length-2);
        }
        if(formElems[i].type == 'radio' || formElems[i].type == 'checkbox') {
            if(formElems[i].checked) {
              paramValue.push(trim(formElems[i].value));
            }
        }
        else if(formElems[i].type == 'select-multiple' && formElems[i].options!=null) {
            for(var j=0;j<formElems[i].options.length;j++) {
                if(formElems[i].options[j].selected) {
                    var tempValue = trim(formElems[i].options[j].value);
                    if($.inArray( tempValue, paramValue) === -1) {
                        paramValue.push(tempValue);
                    }
                }
            }
        }
        else {
            paramValue.push(trim(formElems[i].value));
        }

        var oldParamValue = null;
        if(typeof JSON != 'undefined' && typeof JSON === 'object') {
            oldParamValue = formData[paramName];
        }
        else {
            var oldParamValueStr = readEscapedCookie(paramName);
            if(oldParamValueStr && oldParamValueStr!='') {
                oldParamValue = oldParamValueStr.split('~');
            }
        }
        if(oldParamValue) {
            //just ensure old param value is an array [for old cookies value, not necessary as new cookie data will always be an array]
            if(!$.isArray(oldParamValue)) {
                var temp = oldParamValue;
                oldParamValue = Array();
                oldParamValue.push(temp);
            }
        }
        else {
            oldParamValue = Array();
        }

        var newParamValue = oldParamValue;
        if(paramValue && paramValue.length>0) {
            for(var kk=0;kk<paramValue.length;kk++) {
                if(paramValue[kk]!= '') {
                    var paramValueIndex = $.inArray( paramValue[kk], newParamValue);
                    if(paramValueIndex !== -1) {
                        newParamValue.splice(paramValueIndex, 1);
                    }
                    newParamValue.push(paramValue[kk]);
                }
            }
        }

        if(newParamValue.length>0) {
            if(typeof JSON != 'undefined' && typeof JSON === 'object') {
                formData[paramName] = newParamValue;
            }
            else {
                setEscapedCookie(paramName, newParamValue.join('~'), 0);
            }
        }
    }
    if(typeof JSON != 'undefined' && typeof JSON === 'object') {
      var formDataJsonStr = JSON.stringify(formData);
      setEscapedCookie(formDataCookieName, formDataJsonStr, 0);
    }
    return true;
}

function get_cookie_domain() {
  var url = document.location.toString();
  var domain = url.match(/:\/\/(.[^/]+)/)[1];
  var domainArr = domain.split('.');
  var count = domainArr.length;
  if(count > 1) {
    if(count > 2) {
      domain = domainArr[count-2] + '.' + domainArr[count-1];
    }
    domain = '.' + domain;
  }
  else {
    //for localhost, no need to set domain
    domain = null;
  }
  return domain;
}

function setEscapedCookie( name, value, expires, path, domain, secure ) {
    var today = new Date();
    var expires_date = 0;
    today.setTime( today.getTime() );
    if (expires)
    {
        expires = expires * 1000 * 60 * 60 * 1;
        expires_date = new Date( today.getTime() + (expires) );
    }
    
    if(!domain) {
      domain = get_cookie_domain(); //default domain, only root domain
    }

    document.cookie = name + "=" +escapeCookieValue( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + ";path=/" +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
}


function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

function setSelectedValues(attribName, attribValue){
    var elem = document.getElementsByName(attribName)[0];
    if(!elem) {
        attribName = attribName+'[]';
        elem = document.getElementsByName(attribName)[0];
    }

    if(!attribValue || attribValue=='')
        return;

    var attribValues = null;
    if($.isArray(attribValue) ) {
        attribValues = attribValue;
    }
    else {
        attribValues = attribValue.split("~");
    }
    if(attribValues.length==0)
        return;    

    if(elem != undefined) {
        var multiElems = document.getElementsByName(attribName);
        if(elem.type == 'select-multiple') {
            for (var i=0; i<elem.options.length; i++){
                if($.inArray( elem.options[i].value, attribValues) !== -1 ) {
                    elem.options[i].selected=true;
                    addGreyClassToElem(elem);
                }
            }
            $(elem).trigger("change");
        }
       else if(elem.type == 'select-one') {
            //as only one select can be selected, we'll use the one, which was most recently set
            var optionIndex = -1;
            var valIndex = -1;
            for (var i=0; i<elem.options.length; i++){
                var tempIndex = $.inArray( elem.options[i].value, attribValues);
                if(tempIndex !== -1) {
                    if(tempIndex > valIndex) {
                        valIndex = tempIndex;
                        optionIndex = i;
                    }
                }
            }
            if(optionIndex > -1 && optionIndex < elem.options.length) {
                elem.options[optionIndex].selected=true;
                addGreyClassToElem(elem);
                $(elem).trigger("change");
            }
        }        
        else if(elem.type == 'text' || elem.type == 'textarea') {
            //only one value can be set, so use most recent one.
            elem.value = attribValues[attribValues.length-1];
            addGreyClassToElem(elem);
        }
        else if(elem.type == 'checkbox') {
            for (var j=0; j<multiElems.length ; j++){
                if($.inArray( multiElems[j].value, attribValues) !== -1) {
                    multiElems[j].checked = true;
                    addGreyClassToElem(multiElems[j]);
                }
            }
        }
       else if(elem.type == 'radio') {
            //as only one radio can be selected, we'll use the one, which was most recently set
            var radioIndex = -1;
            var valIndex = -1;
            for (var j=0; j<multiElems.length ; j++){
                var tempIndex = $.inArray( multiElems[j].value, attribValues);
                if(tempIndex !== -1) {
                    if(tempIndex > valIndex) {
                        valIndex = tempIndex;
                        radioIndex = j;
                    }
                }
            }
            if(radioIndex > -1 && radioIndex < multiElems.length) {
                multiElems[radioIndex].checked = true;
                addGreyClassToElem(multiElems[radioIndex]);
            }
        }
        else if(elem.type == 'hidden') {
            if(attribName == 'verified_mobiles_list') {
              elem.value = attribValue;
            }
        }        
    }
}

function addGreyClassToElem(elem) {
    if(elem) {
        $(elem).addClass("greybox");
    }
}

function escapeCookieValue(value) {
    return URLEncoderEncode(value);
}

function unescapeCookieValue(value) {
    return URLDecoderDecode(value);
}

//tomcat won't allow cookies conataining ()<>@,;:\\\"[]?={} \t
//escape encode everything except @*/+ so @ is causing problem
//encodeURIComponent encode everythihng ~!*()' so ()' is causing problem
//use j2ee URLEncoder.encode like implementation 
function URLEncoderEncode(value) {
    return encodeURIComponent(value).replace(/~/g,'%7E').replace(/!/g,'%21').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\'/g,'%27');
}

function URLDecoderDecode(value) {
    return decodeURIComponent(value.replace(/%7E/g,'~').replace(/%21/g,'!').replace(/%28/g,'(').replace(/%29/g,')').replace(/%27/g,'\''));
}