////////////////////////////////////////////////////////////////////////////////
//      File: global.js                                                       //
//       Des: non template specific Javascript utility functions              //
//     Notes:                                                                 //
//      Bugs:                                                                 //
//      Todo:                                                                 //
////////////////////////////////////////////////////////////////////////////////
var FADE_DELAY  = 5;
var FADE_ID     = 0;
var currentFade = null;
var isModalDisplayed = false;
var facebookSession;

var clipArray = null;


function handleFacebookLoginButton()
{
   updateFacebookLoginStatus();
   updateFacebookButtonDisplay();

   //////////////////////////////////////////////////////////////
   // check to see if we were given the session, is so, use it //
   // and log the user in, if not, then return doing nothing   //
   //////////////////////////////////////////////////////////////
   var session = facebookSession;
   if(!session)
   {
      return;
   }

   ///////////////////////////////////////////////////
   // get the oauth toke from the facebook sessions //
   ///////////////////////////////////////////////////
   var oauthToken = session["accessToken"];
   console.log("oauthToken: " + oauthToken);

   ////////////////////////////////////////////////////////////////////////////////
   // use the accessToken to have the backend log the user in and refresh        //
   // thier sessions - and in doing so, setting thier member and session cookies //
   ////////////////////////////////////////////////////////////////////////////////
   submitSignInViaFacebookConnect(oauthToken);

}



function submitSignInViaFacebookConnect(oauthToken)
{
   var affiliateId = getAffiliateId();

   var postContent = "";
   postContent += "oauthToken=" + oauthToken;
   postContent += "&affiliateId=" + affiliateId;


   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.SignInMemberViaFacebookConnect", postContent, signInViaFacebookConnectResponse);

   return(false);
}


function signInViaFacebookConnectResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);

   if(rs['ok'])
   {
      ///////////////////////////////////////////////////////////////////////////
      // the user was able to connect, so now we just need to refresh the page //
      ///////////////////////////////////////////////////////////////////////////
      document.location.reload(true);
   }

   return(false);
}



function updateFacebookButtonDisplay()
{
   if(facebookSession)
   {
      hideFacebookLoginButton();
   }
   else
   {
      showFacebookLoginButton();
   }
}



function updateFacebookLoginStatus()
{
   FB.getLoginStatus
   (
      function(response) 
      {
         if (response.authResponse) 
         {
            facebookSession = response.authResponse;
         } 
         else 
         {
            facebookSession = null;
         } 
      }
   );
}


function hideFacebookLoginButton()
{
//   document.getElementById("gp_facebookLoginButton").style.display="none";
}



function showFacebookLoginButton()
{
   document.getElementById("gp_facebookLoginButton").style.display = "inline";
}



function issueAjaxPost(isAsync, serviceName, params, callbackFunction, isSecure)
{
   var url = (isSecure) ? getSecureSASEngineURL() : getSASEngineURL();
   url += "?" + getJSONSOFAParams(serviceName);

   if(params)
   {
      url += "&" + params
   }

   issueRequest("GET", isAsync, url, null, callbackFunction);
}


function getPageHeight()
{
   var db = document.body;
   var dde = document.documentElement;

   var docHeight = Math.max(db.scrollHeight, dde.scrollHeight, db.offsetHeight, dde.offsetHeight, db.clientHeight, dde.clientHeight)
   return(docHeight)
}


function getParamFromQueryString(paramName)
{
   var queryString = window.location.search.substring(1);

   var vars = queryString.split("&");
   for(var i=0; i<vars.length; i++)
   {
      var pair = vars[i].split("=");
      if(pair[0] == paramName)
      {
         return pair[1];
      }
   }

   return(null);
}


function ensureElementValue(elementId, message, errorContainerElementId, secondaryErrorContainerElementId)
{
   if(! document.getElementById(elementId).value)
   {
      if(message)
      {
         if(errorContainerElementId)
         {
            document.getElementById(errorContainerElementId).innerHTML = message;
            fadeIn(errorContainerElementId);

            if(secondaryErrorContainerElementId)
            {
               document.getElementById(secondaryErrorContainerElementId).innerHTML = message;
               fadeIn(secondaryErrorContainerElementId);
            }
         }
         else
         {
            alert(message);
         }
      }

      document.getElementById(elementId).focus();
      return(false);
   }

   return(true);
}


function checkForInt(e)
{
   e = (e) ? e : window.event;
   var charCode = (e.which) ? e.which : e.keyCode;

   return(charCode <= 31 || (charCode >= 48 && charCode <= 57));
}


function fadeOut(elementId)
{
   var element = document.getElementById(elementId);
   fade(elementId, ++FADE_ID, false, FADE_DELAY);
}


function fadeIn(elementId, opacityLimit)
{
   opacityLimit = (opacityLimit) ? opacityLimit : .75;

   var element = document.getElementById(elementId);
   element.style.visibility = "visible";
   setOpacity(element, 0);
   fade(elementId, ++FADE_ID, true, FADE_DELAY, opacityLimit);
}



function fade(elementId, fadeId, isFadeIn, delay, opacityLimit)
{
   var element = document.getElementById(elementId);
   var opacity = getOpacity(element);
   var doFade  = false;

   if(isFadeIn && opacity < opacityLimit)
   {
      doFade = true;
      opacity = opacity + .05;
   }
   else if(! isFadeIn)
   {
      if(opacity > 0)
      {
         doFade = true;
         opacity = opacity - .05;

         if(opacity < .075)
         {
            opacity = 0;
         }
      }
      else
      {
         element.style.visibility = "hidden";
      }
   }

   if(doFade)
   {
      setOpacity(element, opacity);

      if(currentFade)
      {
         clearTimeout(currentFade);
      }

      currentFade = setTimeout('fade("' + elementId + '",' + fadeId + ',' + isFadeIn + ',' + delay + ',' + opacityLimit + ')', delay);
   }
}



function getOpacity(element)
{
   var opacity = element.style.opacity;
   return(Number(opacity));
}



function setOpacity(element, opacity)
{
   if(element.filters)
   {
      element.style.filter='progid:DXImageTransform.Microsoft.Alpha(Opacity=' + (opacity * 100) + ')';
   }

   element.style.opacity = opacity;
}



function trim(str)
{
   return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}



function toggleElements(elementToShow, elementToHide)
{
   document.getElementById(elementToShow).style.display = "block";
   document.getElementById(elementToHide).style.display = "none";
}



function trimElementValue(element)
{
   element.value = trim(element.value);
}



function validateEmail(email)
{
   var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
   return(emailRegEx.test(email));
}



function validateDate(monthElement, dayElement, yearElement, errorFieldId)
{
   var month = monthElement.value;
   var day   = dayElement.value;
   var year  = yearElement.value;

   if(month == "")
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.validateBirthDate.month.error.text"];
      fadeIn(errorFieldId);
      monthElement.focus();
      return(false);
   }
   if(day == "")
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.validateBirthDate.day.error.text"];
      fadeIn(errorFieldId);
      dayElement.focus();
      return(false);
   }
   if(year == "")
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.validateBirthDate.year.error.text"];
      fadeIn(errorFieldId);
      yearElement.focus();
      return(false);
   }

   /////////////////////////
   // make sure real date //
   /////////////////////////
   var date = new Date(year, month, day);
   if(day != date.getDate() || month != date.getMonth() || year != date.getFullYear())
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.validateBirthDate.date.error.text"];
      fadeIn(errorFieldId);
      dayElement.focus();
      return(false);
   }

   return(true);
}


function getVoucher(code, voucherUuid, format)
{
   if(format && format == "image")
   {
      window.open("./sas.engineArtifact/voucher-" + code + ".png?template=services.RequestDispatcher&protocol=file&format=image&service=couponsite.GetVoucher&uuid="+voucherUuid+"&_noCache="+(new Date().getTime()));
   }
   else
   {
      window.open("./sas.engineArtifact/voucher-" + code + ".pdf?template=services.RequestDispatcher&protocol=file&service=couponsite.GetVoucher&uuid="+voucherUuid+"&_noCache="+(new Date().getTime()));
   }
}


function cleanValue(value)
{
   return(escape(value).replace(/\+/g, " "));
}


function displayForm(which, displayed, isModal)
{
   if(isModal && displayed)
   {
      if(! isModalDisplayed)
      {
         document.getElementById("modalDiv").style.height = getPageHeight() + "px";
         document.getElementById("modalDiv").style.weight = "100%";
         fadeIn("modalDiv");

         isModalDisplayed = true;
      }
   }
   else
   {
      fadeOut("modalDiv");
      isModalDisplayed = false;
   }

   document.getElementById(which + "Form").style.display = displayed ? "block" : "none";
}


function submitSignInForm(cityId, elementPrefix)
{
   var elementPrefix = (elementPrefix) ? elementPrefix : "signIn";

   if(! validateEmail(document.getElementById(elementPrefix + ".email").value))
   {
      document.getElementById(elementPrefix + ".ErrorMessge").innerHTML = messages["js.generic.signIn.invalidEmailAddress.error.text"];
      fadeIn(elementPrefix + ".ErrorMessge");
      document.getElementById(elementPrefix + ".email").select();
      return(false);
   }

   if(! ensureElementValue(elementPrefix + ".email",    messages["js.generic.signIn.emailAddress.error.text"], elementPrefix+".ErrorMessge")) { return(false); }
   if(! ensureElementValue(elementPrefix + ".password", messages["js.generic.signIn.password.error.text"],     elementPrefix+".ErrorMessge")) { return(false); }

   var postContent = "";
   postContent += "email="     + document.getElementById(elementPrefix + ".email").value;
   postContent += "&cityId="    + cityId;
   postContent += "&password=" + document.getElementById(elementPrefix + ".password").value;

   if(document.location.href.indexOf("https:") == -1)
   {
      postContent += "&service=couponsite.SignInMember";
      postContent += "&elementPrefix=" + elementPrefix;

      postViaSecureIFrame(postContent);
   }
   else
   {
      var isAsync = false;
      issueAjaxPost(isAsync, "couponsite.SignInMember", postContent, function(xmlHttp) { handleSignInResponse(xmlHttp, elementPrefix); } );     
   }

   return(false);
}


function postViaSecureIFrame(postContent)
{
   var url = document.location.href;

   /////////////////////////////
   // 'go up' two directories //
   /////////////////////////////
   url = url.substring(0, url.lastIndexOf("/"))
   url = url.substring(0, url.lastIndexOf("/"))
   url = url.substring(0, url.lastIndexOf("/"));

   //////////////////////
   // make sure secure //
   //////////////////////
   url = url.replace("http:", "https:");

   ///////////////////////////////
   // build the rest of the url //
   ///////////////////////////////
   url += "/util/secure.html?" + postContent;

   //////////////////////
   // go to secure url //
   //////////////////////
   document.getElementById("utilityFrame").src = url;
}


function handleSignInResponse(xmlHttp, elementPrefix)
{
   signInResponse(xmlHttp.responseText, elementPrefix);
}


function signInResponse(json, elementPrefix)
{
   var elementPrefix = (elementPrefix) ? elementPrefix : "signIn";

   var rs = parseJson(json)
   if(rs['ok'])
   {
      if(rs['message'])
      {
         document.getElementById(elementPrefix+".ErrorMessge").innerHTML = rs['message'];
         fadeIn(elementPrefix+".ErrorMessge");
      }
      else
      {
         document.location.href = window.location.href;
      }
   }
   else
   {
      document.getElementById(elementPrefix+".ErrorMessge").innerHTML = messages["js.generic.signIn.default.error.text"];
      fadeIn(elementPrefix+".ErrorMessge");
   }

   return(false);
}


function submitForgotPasswordForm(affiliateId)
{
   var elementPrefix = "signIn";

   if(! validateEmail(document.getElementById(elementPrefix + ".forgotPasswordEmail").value))
   {
      document.getElementById("forgotPasswordErrorMessge").innerHTML = messages["js.generic.forgotPassword.invalidEmail.error.text"];
      fadeIn("forgotPasswordErrorMessge");
      document.getElementById(elementPrefix + ".forgotPasswordEmail").select();
      return(false);
   }

   var postContent = "affiliateId=" + affiliateId;
   postContent += "&email=" + document.getElementById(elementPrefix + ".forgotPasswordEmail").value ;

   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.ForgotPassword", postContent, forgotPasswordResponse);

   return(false);
}


function forgotPasswordResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);
   if(rs['ok'])
   {
      if(rs['message'])
      {
         document.getElementById("forgotPasswordErrorMessge").innerHTML = rs['message'];
         fadeIn("forgotPasswordErrorMessge");
      }
      else
      {
         toggleElements("forgotPasswordSuccess", "forgotPasswordForm");
      }
   }
   else
   {
      document.getElementById("forgotPasswordErrorMessge").innerHTML = messages["js.generic.forgotPassword.default.error.text"];
      fadeIn("forgotPasswordErrorMessge");
   }

   return(false);
}


function validateRegisterForm(elementPrefix, errorFieldId, secondaryErrorFieldId, bypassPasswordCheck)
{
   if(! ensureElementValue(elementPrefix + ".firstName",  messages["js.generic.register.firstName.error.text"], errorFieldId, secondaryErrorFieldId))     { return(false); }
   if(! ensureElementValue(elementPrefix + ".lastName",   messages["js.generic.register.firstName.error.text"], errorFieldId, secondaryErrorFieldId))      { return(false); }
   
   if(document.getElementById(elementPrefix + ".password") && ! bypassPasswordCheck)
   {
      if(! ensureElementValue(elementPrefix + ".password",  messages["js.generic.register.password.error.text"], errorFieldId, secondaryErrorFieldId))       { return(false); }
      if(document.getElementById(elementPrefix + ".password").value != document.getElementById(elementPrefix + ".passwordConfirm").value)
      {
         document.getElementById(errorFieldId).innerHTML = messages["js.generic.register.passwordsDoNotMatch.error.text"];
         fadeIn(errorFieldId);

         if(secondaryErrorFieldId)
         {
            document.getElementById(secondaryErrorFieldId).innerHTML = messages["js.generic.register.passwordsDoNotMatch.error.text"];
            fadeIn(secondaryErrorFieldId);
         }

         document.getElementById(elementPrefix + ".passwordConfirm").value = "";
         document.getElementById(elementPrefix + ".password").focus();
         document.getElementById(elementPrefix + ".password").select();
         return(false);
      }
   }

   if(! validateEmail(document.getElementById(elementPrefix + ".email").value))
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.register.invalidEmail.error.text"];
      fadeIn(errorFieldId);

      if(secondaryErrorFieldId)
      {
         document.getElementById(secondaryErrorFieldId).innerHTML = messages["js.generic.register.invalidEmail.error.text"];
         fadeIn(secondaryErrorFieldId);
      }

      document.getElementById(elementPrefix + ".email").focus();
      document.getElementById(elementPrefix + ".email").select();
      return(false);
   }
   
   if(document.getElementById(elementPrefix + ".email").value != document.getElementById(elementPrefix + ".emailConfirm").value)
   {
      document.getElementById(errorFieldId).innerHTML = messages["js.generic.register.emailsDoNotMatch.error.text"];
      fadeIn(errorFieldId);

      if(secondaryErrorFieldId)
      {
         document.getElementById(secondaryErrorFieldId).innerHTML = messages["js.generic.register.emailsDoNotMatch.error.text"];
         fadeIn(secondaryErrorFieldId);
      }

      document.getElementById(elementPrefix + ".email").focus();
      document.getElementById(elementPrefix + ".email").select();
      return(false);
   }

   if(! ensureElementValue(elementPrefix + ".gender",  messages["js.generic.register.gender.error.text"], errorFieldId, secondaryErrorFieldId)) { return(false); }

   return(true);
}


function submitRegisterForm(elementPrefix, defaultCityId, defaultAffiliateId, shouldCheckPolicyField, overrideCallbackFunction)
{
   if(validateRegisterForm(elementPrefix, "registerErrorMessage"))
   {
      if(shouldCheckPolicyField && ! document.getElementById("register.agreeCheckbox").checked)
      {
         document.getElementById("registerErrorMessage").innerHTML = messages["js.generic.register.agreeToTerms.error.text"];
         fadeIn("registerErrorMessage");
         return(false);
      }

      var postContent = "";
      postContent += "email="        + encodeURIComponent(document.getElementById(elementPrefix + ".email").value);
      postContent += "&password="    + document.getElementById(elementPrefix + ".password").value;
      postContent += "&firstName="   + document.getElementById(elementPrefix + ".firstName").value;
      postContent += "&lastName="    + document.getElementById(elementPrefix + ".lastName").value;
      postContent += "&cellNumber="  + document.getElementById(elementPrefix + ".cellNumber").value;
      postContent += "&gender="      + document.getElementById(elementPrefix + ".gender").value;
      postContent += "&birthMonth="  + document.getElementById(elementPrefix + ".birthMonth").value;
      postContent += "&birthDay="    + document.getElementById(elementPrefix + ".birthDay").value;
      postContent += "&birthYear="   + document.getElementById(elementPrefix + ".birthYear").value;

      if(defaultCityId)
      {
         postContent += "&defaultCityId=" + defaultCityId;
      }

      if(defaultAffiliateId)
      {
         postContent += "&defaultAffiliateId=" + defaultAffiliateId;
      }

      if(overrideCallbackFunction)
      {
         var isAsync = false;
         issueAjaxPost(isAsync, "couponsite.RegisterMember", postContent, overrideCallbackFunction);
      }
      else if(document.location.href.indexOf("https:") != -1)
      {
         var isAsync = false;
         issueAjaxPost(isAsync, "couponsite.RegisterMember", postContent, handleRegisterResponse);
      }
      else
      {
         postContent += "&service=couponsite.RegisterMember";
         postViaSecureIFrame(postContent);
      }
   }

   return(false);
}


function handleRegisterResponse(xmlHttp)
{
   registerResponse(xmlHttp.responseText);
}


function registerResponse(json)
{
   var rs = parseJson(json)
   if(rs['ok'])
   {
      if(rs['message'])
      {
         document.getElementById("registerErrorMessage").innerHTML = rs['message'];
         fadeIn("registerErrorMessage");
      }
      else
      {
         //////////////////////////////////////////////////////////////////////
         // reload current screen with preferences=true param (to display    //
         // the preferences popup), and the original query string after that //
         //////////////////////////////////////////////////////////////////////
         var queryString = window.location.search.substring(1);
         document.location.href = window.location.href.split("?")[0] + "?preferences=true&" + queryString;
      }
   }
   else
   {
      document.getElementById("registerErrorMessage").innerHTML = messages["js.generic.register.default.error.text"];
      fadeIn("registerErrorMessage");
   }
}


function submitSignOut()
{
   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.SignOutMember", null, signOutResponse);
}


function signOutResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);
   if(rs['ok'])
   {
      document.location.reload();
   }
   else
   {
      alert(messages["js.generic.signOut.default.error.text"]);
   }
}


function signUpForUpdates(affiliateId, cityId, prefix, ignoreResponse)
{
   if(! validateEmail(document.getElementById(prefix + ".dailyUpdatesEmail").value))
   {
      document.getElementById(prefix + ".dailyUpdatesEmail").select();
      document.getElementById(prefix + ".dailyUpdatesError").innerHTML = messages["js.generic.signUp.invalidEmail.error.text"];
      fadeIn(prefix + ".dailyUpdatesError");
      return;
   }

   var postContent = "";
   postContent += "cityId=" + cityId;

   if(affiliateId)
   {
      postContent += "&affiliateId=" + affiliateId;
   }

   postContent += "&email=" + encodeURIComponent(document.getElementById(prefix + ".dailyUpdatesEmail").value);

   var isAsync = true;
   if(ignoreResponse)
   {
      issueAjaxPost(isAsync, "couponsite.SignUpForUpdates", postContent, null);

      /////////////////////////////////////////////
      // If set, track the acquisition from ads  //
      /////////////////////////////////////////////
      if(typeof microsoftSiteId != "undefined" || typeof googleConversionId != "undefined") 
      {
         document.getElementById("utilityFrame").src = "ad_tracking.html";
      }
   }
   else
   {
      issueAjaxPost(isAsync, "couponsite.SignUpForUpdates", postContent, function(xmlHttp) { signUpForUpdatesResponse(xmlHttp, prefix) } );
   }

   return;
}


function signUpForUpdatesResponse(xmlHttp, prefix)
{
   var rs = parseJson(xmlHttp.responseText);
   if(rs['ok'])
   {
      if(rs['hadError'])
      {
         var message = (rs['message']) ? rs['message'] : messages["js.generic.signUp.default.error.text"];

         document.getElementById(prefix + ".dailyUpdatesEmail").select();
         document.getElementById(prefix + ".dailyUpdatesError").innerHTML = message;
         fadeIn(prefix + ".dailyUpdatesError");
      }
      else
      {
         if(document.getElementById(prefix + ".dailyUpdatesContainer"))
         {
            document.getElementById(prefix + ".dailyUpdatesContainer").innerHTML = messages["js.generic.signUp.thankYou.text"];
         }

         /////////////////////////////////////////////
         // If set, track the acquisition from ads  //
         /////////////////////////////////////////////
         if(typeof microsoftSiteId != "undefined" || typeof googleConversionId != "undefined") 
         {
            document.getElementById("utilityFrame").src = "ad_tracking.html";
         }
      }
   }
   else
   {
      if(document.getElementById(prefix + ".dailyUpdatesContainer"))
      {
         document.getElementById(prefix + ".dailyUpdatesContainer").innerHTML = messages["js.generic.signUp.default.error.text"];
      }
      else
      {
         alert(messages["js.generic.signUp.default.error.text"]);
      }
   }
}


function clearPopupErrors()
{
   toggleElements("forgotPasswordForm", "forgotPasswordSuccess");
   document.getElementById("signIn.ErrorMessge").innerHTML         = "";
   document.getElementById("forgotPasswordErrorMessge").innerHTML = "";
   document.getElementById("registerErrorMessage").innerHTML      = "";
}


function displaySignInForm(displayed)
{
   if(displayed && sessionData)
   {
      //////////////////////////////////////////////////////////////////////
      // avoid displaying the sign in form if we already have sessionData //
      //////////////////////////////////////////////////////////////////////
      return;
   }

   clearPopupErrors();

   var which = "signIn";

   if(displayed)
   {
      toggleElements('signInDiv','forgotPasswordDiv');
      toggleElements('signInDiv','registerDiv');
   }

   displayForm(which, displayed, true);
   document.getElementById("signIn.email").select();
}

function displayForgotPasswordForm(displayed)
{
   clearPopupErrors();

   var which = "forgotPassword";

   if(displayed)
   {
      toggleElements('forgotPasswordDiv', 'signInDiv');
      toggleElements('forgotPasswordDiv', 'registerDiv');
   }

   displayForm(which, displayed, true);
   document.getElementById("signIn.forgotPasswordEmail").select();
}

function displayRegisterForm(displayed)
{
   clearPopupErrors();

   var which = "signIn";

   if(displayed)
   {
      toggleElements('registerDiv', 'signInDiv');
      toggleElements('registerDiv', 'forgotPasswordDiv');
   }

   displayForm(which, displayed, true);
   document.getElementById("register.firstName").select();
}


function displaySignUpForm(displayed)
{
   displayForm("signUp", displayed, true);
}


function displayPreferencesForm(displayed)
{
   displayForm("signIn", false, true);
   displayForm("preferences", displayed, true);
}


function displayShareWithFacebookForm(which, displayed)
{
   displayForm(which, displayed, true);
}


function register(cityId, affiliateId, shouldCheckPolicyField)
{
   submitRegisterForm('register', cityId, affiliateId, shouldCheckPolicyField);
   return(false);
}

function parseJson(jsonString)
{
   try
   {
      return(eval('(' + jsonString + ')'));
   }
   catch(e)
   {
      alert(messages["js.generic.json.default.error.text"]);
   }
}

var nearestCityByIpAddress="";
function getNearestCityByIpAddress()
{
   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.GetNearestCityByIpAddress", null, getNearestCityByIpAddressResponse);

   return(nearestCityByIpAddress);
}


function getNearestCityByIpAddressResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);
   nearestCityByIpAddress = rs;
}


function getJSONSOFAParams(service)
{
   return("template=services.RequestDispatcher&protocol=json&service=" + service);
}


function getSASEngineURL()
{
   return("./sas.engine");
}


function getSecureSASEngineURL()
{
   var secureUrl = window.location.href.replace(/([^\/])\/[^\/~].*$/, "$1") + "/sas.engine";

   if(secureUrl.indexOf("test.groupigg.com") != -1)
   {
      secureUrl = secureUrl.replace("sas.engine", "test/sas.engine");
   }

   return(secureUrl);
}


function submitPreferencesForm(form, prefix)
{
   var postContent = "&";

   for(var i=0; i<form.elements.length; i++)
   {
      if(form.elements[i].type == "checkbox")
      {
         postContent += "category" + form.elements[i].value + "=" + form.elements[i].checked + "&";
      }
   }

   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.UpdateMemberCategories", postContent, updateMemberCategoriesResponse);

   return(false);
}


function updateMemberCategoriesResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);
   if(! rs['ok'])
   {
      alert(messages["js.generic.updatingPreferences.default.error.text"]);
   }

   displayPreferencesForm(false);
   return(false);
}


function gatherEmail(affiliateId, cityId)
{
   if(! validateEmail(document.getElementById("popup.dailyUpdatesEmail").value))
   {
      document.getElementById("popup.dailyUpdatesEmail").select();
      document.getElementById("popup.dailyUpdatesError").innerHTML = messages["js.generic.gatherEmail.invalidEmail.error.text"];
      fadeIn("popup.dailyUpdatesError");
      return;
   }

   signUpForUpdates(affiliateId, cityId, "popup", true);
   displaySignUpForm(false);
}


function limitTextLength(elementId, statusElementId, limit)
{
   var element       = document.getElementById(elementId);
   var statusElement = document.getElementById(statusElementId);

   if(element.value.length > limit)
   {
      element.value = element.value.substring(0, limit);
   }
   else
   {
      statusElement.innerHTML = limit - element.value.length;
   }
}


function handleFacebookLikeEvent(isLike)
{
   var postContent = "dealId=" + getDealId();
   postContent += "&isLike=" + isLike;

   if(memberData)
   {
      postContent += "&memberId=" + memberData["id"];
   }

   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.HandleFacebookLikeEvent", postContent, handleFacebookLikeEventResponse);
}


function handleFacebookLikeEventResponse(xmlHttp)
{
   var rs = parseJson(xmlHttp.responseText);

   if(rs['ok'])
   {
      /////////////////////////////////////////////////////////
      // its possible no post fb event, so wrap in try/catch //
      /////////////////////////////////////////////////////////
      try
      {
         postFacebookLikeEvent();
      }
      catch(e)
      {
         // alert(e);
      }
   }
}



function loadDealsSold(dealId, elementToUpdate)
{
   var postContent = "&";
   postContent += "dealId=" + dealId;

   var isAsync = true;
   issueAjaxPost(isAsync, "couponsite.GetDealsSold", postContent, function(xmlHttp) { loadDealsSoldResponse(xmlHttp, elementToUpdate) });
}



function loadDealsSoldResponse(xmlHttp, elementToUpdate)
{
   var rs = parseJson(xmlHttp.responseText);
   if(rs['ok'])
   {
      /////////////////////////////////////////////////////////
      // its possible no post fb event, so wrap in try/catch //
      /////////////////////////////////////////////////////////
      try
      {
         document.getElementById(elementToUpdate).innerHTML = (rs['dealsSold']) ? rs['dealsSold'] : 0;
      }
      catch(e)
      {
         // alert(e);
      }
   }
}



function removeChildNodes(element)
{
   ///////////////////////////////////////////////////
   // removed child nodes from advanced query table //
   ///////////////////////////////////////////////////
   while(element.childNodes.length > 0)
   {
      element.removeChild(element.childNodes[0]);
   }
}


function appendNewChild(parent, elementName, attributes, innerHTML)
{
   var child = document.createElement(elementName);

   if(attributes)
   {
      for(var i in attributes)
      {
         if(attributes[i] instanceof Function)
         {
            child[i] = attributes[i];
         }
         if(attributes[i] instanceof Object)
         {
            for(var j in attributes[i])
            {
               child[i][j] = attributes[i][j];
            }
         }
         else
         {
            child[i] = attributes[i];
         }
      }
   }

   if(innerHTML)
   {
      child.innerHTML = innerHTML;
   }

   parent.appendChild(child);

   return(child);
}




function getCookie(name)
{
   var nameEQ = name + "=";
   var cookieArray = document.cookie.split(';');

   for(var i=0; i<cookieArray.length; i++)
   {
      var cookie = cookieArray[i];
      while(cookie.charAt(0)==' ')
      {
         cookie = cookie.substring(1, cookie.length);
      }

      if(cookie.indexOf(nameEQ) == 0)
      {
         return(cookie.substring(nameEQ.length, cookie.length));
      }
   }

   return(null);
}



function setCookie(name, value, expiredays, path)
{
   var expireDate = new Date();
   if(expiredays != null)
   {
      expireDate.setDate(expireDate.getDate() + expiredays);
   }
   document.cookie = name + "=" + escape(value) + ( expiredays == null ? "" : (";expires=" + expireDate.toGMTString()) ) + ( path == null ? "" : (";path=" + path));;
}



var zeroClipboardMoviePath = "../../swf/ZeroClipboard.swf";

function registerClipboard(sourceElement, buttonElement)
{
   if(clipArray == null)
   {
      clipArray = new Array();
      ZeroClipboard.setMoviePath(zeroClipboardMoviePath);
   }

   var clip = new ZeroClipboard.Client();

   clip.setText('');
   clip.addEventListener('mouseDown', function(){
       var source = document.getElementById(sourceElement);
       clip.setText(source.value);
   });

   clip.glue(buttonElement);

   clipArray[clipArray.length] = clip;
}


function startOpenInviter(prefix)
{
   fadeOut(prefix + ".ErrorMessage");
   fadeOut(prefix + ".SentMessage");

   var provider;
   if      (document.getElementById(prefix + ".gmail").checked)   { provider = "gmail";   }
   else if (document.getElementById(prefix + ".yahoo").checked)   { provider = "yahoo";   }
   else if (document.getElementById(prefix + ".hotmail").checked) { provider = "hotmail"; }
   else if (document.getElementById(prefix + ".aol").checked)     { provider = "aol";     }
   else
   {
      document.getElementById(prefix + ".ErrorMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.mustSelectProivder"];
      fadeIn(prefix + ".ErrorMessage");
      return;
   }

   var email = document.getElementById(prefix + ".email").value;
   if(! email)
   {
      document.getElementById(prefix + ".ErrorMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.mustEnterEmail"]
      fadeIn(prefix + ".ErrorMessage");
      return;
   }

   var password = document.getElementById(prefix + ".password").value;
   if(! password)
   {
      document.getElementById(prefix + ".ErrorMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.mustEnterPassword"]
      fadeIn(prefix + ".ErrorMessage");
      return;
   }

   var isAsync= true;
   var url = "../../openinviter/loadAddresses.php?provider=" + provider + "&email=" + email + "&password=" + password;
   issueRequest("GET", isAsync, url, null, function(xmlHttp) { receiveOpenInviterResponse(xmlHttp, prefix);} );
}


function restartOpenInviter(prefix)
{
   fadeOut(prefix + ".ErrorMessage");
   fadeOut(prefix + ".SentMessage");

   document.getElementById(prefix + ".confirmForm").style.display = "none";
   document.getElementById(prefix + ".startForm").style.display = "block";

   document.getElementById(prefix + ".gmail").checked   = false;
   document.getElementById(prefix + ".yahoo").checked   = false;
   document.getElementById(prefix + ".hotmail").checked = false;
   document.getElementById(prefix + ".aol").checked     = false;
   document.getElementById(prefix + ".email").value     = "";
   document.getElementById(prefix + ".password").value  = "";
}


function receiveOpenInviterResponse(xmlHttp, prefix)
{
   var rs = parseJson(xmlHttp.responseText);
   if(rs && rs['contacts'])
   {
      document.getElementById(prefix + ".ErrorMessage").innerHTML = "";
      document.getElementById(prefix + ".confirmForm").style.display = "block";
      document.getElementById(prefix + ".startForm").style.display = "none";
      openInviterContacts = rs['contacts'];

      var contactsDiv = document.getElementById(prefix + ".contactsDiv");
      contactsDiv.innerHTML = "";
      for(var i=0; i<rs['contacts'].length; i++)
      {
         contactsDiv.innerHTML += "<input type=checkbox checked id=" + prefix + ".contact." + i + ">" + rs['contacts'][i]['name'] + " &lt;" + rs['contacts'][i]['email'] + "&gt;<br />";
      }
   }
   else
   {
      openInviterContacts = null;

      if(rs && rs['error'])
      {
         document.getElementById(prefix + ".ErrorMessage").innerHTML = rs['error'];
         fadeIn(prefix + ".ErrorMessage");
      }
      else
      {
         document.getElementById(prefix + ".ErrorMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.unknownError"]
         fadeIn(prefix + ".ErrorMessage");
      }
   }
}


function finishOpenInviter(prefix, service)
{
   fadeOut(prefix + ".ErrorMessage");
   fadeOut(prefix + ".SentMessage");

   var recipientEmails    = "";
   var recipientNames     = "";
   var nonRecipientEmails = "";
   var nonRecipientNames  = "";

   for(var i=0; i<openInviterContacts.length; i++)
   {
      var checked = document.getElementById(prefix + ".contact." + i).checked;
      var email   = openInviterContacts[i]['email'];
      var name    = openInviterContacts[i]['name'];

      if(checked)
      {
         recipientEmails += "," + encodeURIComponent(email.replace(",",""));
         recipientNames  += "," + encodeURIComponent(name.replace(",",""));
      }
      else
      {
         nonRecipientEmails += "," + encodeURIComponent(email.replace(",",""));
         nonRecipientNames  += "," + encodeURIComponent(name.replace(",",""));
      }
   }

   if(recipientEmails.length    > 0) { recipientEmails    = recipientEmails.substring(1);    }
   if(recipientNames.length     > 0) { recipientNames     = recipientNames.substring(1);     }
   if(nonRecipientEmails.length > 0) { nonRecipientEmails = nonRecipientEmails.substring(1); }
   if(nonRecipientNames.length  > 0) { nonRecipientNames  = nonRecipientNames.substring(1);  }

   var postContent = "";
   postContent += "&recipientEmails="    + recipientEmails;
   postContent += "&recipientNames="     + recipientNames;
   postContent += "&nonRecipientEmails=" + nonRecipientEmails;
   postContent += "&nonRecipientNames="  + nonRecipientNames;

   try
   {
      postContent += "&orderUuid=" + orderUuid;
      postContent += "&dealId="    + getDealId();
   }
   catch(e) { }

   try
   {
      postContent += "&affiliateId=" + getAffiliateId();
   }
   catch(e) { }

   var isAsync = true;
   issueAjaxPost(isAsync, service, postContent, function(xmlHttp) { finishOpenInviterResponse(xmlHttp, prefix); } );
}


function finishOpenInviterResponse(xmlHttp, prefix)
{
   var rs = parseJson(xmlHttp.responseText);

   if(rs && rs['ok'])
   {
      restartOpenInviter(prefix);

      document.getElementById(prefix + ".SentMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.emailsSent"];
      fadeIn(prefix + ".SentMessage");
   }
   else
   {
      document.getElementById(prefix + ".ErrorMessage").innerHTML = messages["js.site.city.affiliate.page.buy.shareViaOpenInviter.errorSending"];
      fadeIn(prefix + ".ErrorMessage");
   }
}



function recordMemberNewsletterSubscriptionClicked(mnsId)
{
   var postContent = "";
   postContent += "mnsId=" + mnsId
   postContent += "&dealId=" + getDealId();

   var isAsync = false;
   issueAjaxPost(isAsync, "couponsite.RecordMemberNewsletterMessageClicked", postContent, recordMemberNewsletterSubscriptionClickedResponse);

   return(false);
}



function recordMemberNewsletterSubscriptionClickedResponse(xmlHttp)
{
   /////////////////////////////////////////////////
   // nothing to do with this response either way //
   /////////////////////////////////////////////////
}



function getShareDealURL(dealId)
{
   ///////////////////////////////////
   // first check for member cookie //
   ///////////////////////////////////
   if(! memberData || ! memberData["uuid"])
   {
      alert("Member data not found, try logging out and logging back in.");
      return(null);
   }

   var shareURL = document.location.href.substring(0, document.location.href.lastIndexOf("/")) + "/deal-" + dealId + ".html?mid=" + memberData["uuid"];
   return(shareURL);
}


