var cRegExpPatternPIN   = "^[0-9]{4}$";
// TODO: this regexp doesn't match all TLDs, see http://www.regular-expressions.info/email.html
var cRegExpPatternEmail = "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+(?:[A-Z]{2}|com|org|net|gov|biz|info|name|aero|edu|mobi|jobs|museum)$";
var cRegExpPatternYEmail = "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(ymail|rocketmail)\.(?:[A-Z]{2}|com|org|net|gov|biz|info|name|aero|edu|mobi|jobs|museum)$";

var cErrMsgInvalidUserId = 'Mobile number must be 6 - 15 digits';
var cErrMsgConfirmPinMissing = 'PIN must be entered twice';
var cErrMsgPinMismatch = 'PIN entries must match';
var cErrMsgPinFormat = 'PIN must be 4 digits';
var cErrMsgEmail = 'Please enter a valid email address';
var cErrMsgEmailEmpty = "Email is required.";
var cErrMsgInviteNameEmailEmpty = "Please enter value's for friends name and email address.";

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };

// TODO: change name to matchesRegexp or similar, "check" is ambiguous
function checkRegExp(pRegExpPattern, pText)
{
  var lRegExp = new RegExp(pRegExpPattern, "i");
  return lRegExp.test(pText);
}

function customAlert(message)
{
  alert(message);
}

function reload_after_two_seconds()
{
  setTimeout('window.location.reload()', 2000);
}

// if there are multiple email address fields, provide a value for label to
// add it to the message returned when the address is invalid
function checkOneEmail(email, label)
{
  var lMessage = null;
  if (email != "")
  {
    if (!checkRegExp(cRegExpPatternEmail, email))
    {
      lMessage = cErrMsgEmail;
      if (label != null)
      {
        lMessage += " for '" + label + "'";
      }
    }
  }
  return lMessage;
}

// Validating email address
// Called from edit-maelstrom.jsp
function checkEmailAddressForInvite(async)
{
  var lMessage = null;

  var lCount = 0;
  var lNotEmpty = 0;
  var lLabels = document.getElementsByTagName("label");
  for (i = 0; i < lLabels.length; i++)
  {
    if (lLabels[i].className == "name")
    {
        lCount = lCount + 1;
        var emailElt = document.getElementById("email" + lCount);
        var nameElt = document.getElementById("name" + lCount);
        if (emailElt.value.trim().length > 0  && nameElt.value.trim().length > 0)
        {
            lNotEmpty = lNotEmpty + 1;
        }
        lMessage = checkOneEmail(emailElt.value, "Friend " + lCount + " E-mail");
        if (lMessage != null)
        {
            break;
        }
    }
  }
  if (lMessage != null)
  {
    customAlert(lMessage);
  }
  else
  {
    if (async == true)
    {
      inviteFriendsAsync();
    }
    else
    {
      if(!(lNotEmpty >=1))
      {
        customAlert(cErrMsgInviteNameEmailEmpty);
      }
      else
      {
        inviteFriends();
      }
    }
    if (lNotEmpty >= 1)
    {
      var lCon = document.getElementById('invite-container');
      if (lCon != null)
      {
        lCon.show();
      }
    }
  }

  return (lMessage == null);

}

function verifyChangeName()
{
  var lDisplayName = $('lightwindow_contents').childElements()[1].display_name.value;
  changeName();
  reload_after_two_seconds();
}

function verifyEmailChange(user)
{

  var lEmail1 = ($('lightwindow_contents').childElements()[1].newemail1.value);
  var lEmail2 = ($('lightwindow_contents').childElements()[1].newemail2.value);

  var lMessage1 = checkOneEmail(lEmail1, "New Email");
  var lMessage2 = checkOneEmail(lEmail2, "Confirm Email");

  if (lMessage1 != null)
  {
      customAlert(lMessage1);
  }
  else if (lMessage2 != null)
  {
      customAlert(lMessage2);
  }
  else
  {
      if (lEmail1 == lEmail2)
      {
          changeEmail(user);
          setTimeout('window.location.reload()', 2000);

      }
      else
      {
          alert("email addresses don't match");
      }
  }

}

function verifyUserForm(service, username, password, rx)
{
  var lMessage = null;

  if (username == null || username.length == 0)
  {
    lMessage = 'Username is required';
  }
  else if (password == null || password.length == 0)
  {
    lMessage = 'Password is required';
  }

  if (lMessage == null)
  {
      if (username.trim().length == 0 || password.trim().length == 0)
      {
        lMessage = 'Please enter a valid username and password';
      }
  }

  if (lMessage == null)
  {
    if (rx != null)
    {
      if (!checkRegExp(rx, username))
      {
        // TODO: this message should come from the server
        lMessage = 'Please enter a valid username';
      }
    }
    else if (service != null && service == 'msn')
    {
      if (!checkRegExp(cRegExpPatternEmail, username))
      {
        lMessage = cErrMsgEmail;
      }
    }
    else if (service != null && service == 'yahoo')
    {
       //IF ITS NOT AN EMAIL WHICH WE ARE LOOKING FOR
       if (!checkRegExp(cRegExpPatternYEmail, username))
       {
         //THEN IT SHOULD BE JUST USERNAME
         if (checkRegExp(cRegExpPatternEmail, username))
         {
           lMessage = 'Please enter username or username@ymail/rocketmail.com';
         }

       }
    }
    else
    {
      if (checkRegExp(cRegExpPatternEmail, username))
      {
        lMessage = 'Please enter your username, not email address';
      }
    }
  }



  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function verifyUserId(userid)
{
  var cRegExpPatternPhoneNumber = "^[0-9]{6,15}$";
  return checkRegExp(cRegExpPatternPhoneNumber, userid);
}

function verifySignInForm(userid, pin)
{

  var lMessage = null;
  if (!verifyUserId(userid))
  {
    lMessage = cErrMsgInvalidUserId;
  }
  else if (!checkRegExp(cRegExpPatternPIN, pin))
  {
    lMessage = cErrMsgPinFormat;
  }

  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function verifySignUpForm(pForm)
{
  var lMessage = null;

  var lResult = verifySignInForm(pForm.userid.value, pForm.pin1.value);

  if (!lResult)
  {
    return false;
  }

  var lDisplayName = pForm.dname.value;


  if (lDisplayName.length < 3 || lDisplayName.length > 30)
  {
    lMessage = 'A display name of 3 to 30 characters is required';
  }
  else if (checkRegExp("^\\s+$", lDisplayName))
  {
    lMessage = 'Display name cannot be blank';
  }
  else if (isEmpty(pForm.pin2))
  {
    lMessage = cErrMsgConfirmPinMissing;
  }
  else if (pForm.pin1.value != pForm.pin2.value)
  {
    lMessage = cErrMsgPinMismatch;
  }
  else if (isEmpty(pForm.email))
  {
    lMessage = cErrMsgEmailEmpty;
  }
  else if (checkOneEmail(pForm.email.value, null))
  {
    lMessage = cErrMsgEmail;
  }
  else if (pForm.terms.checked == false)
  {
    lMessage = 'Terms & Conditions must be checked';
  }

  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function verifyRegisterForm(pForm)
{
  var lMessage = null;

  if (isEmpty(pForm.first_name))
  {
    lMessage = 'First name is required';
  }
  else if (isEmpty(pForm.last_name))
  {
    lMessage = 'Last name is required';
  }
  else if (!checkRegExp(cRegExpPatternEmail, pForm.email.value))
  {
    lMessage = cErrMsgEmail;
  }
  else if (isEmpty(pForm.j_captcha_response))
  {
    lMessage = 'Security code is required';
  }
  else if (pForm.terms.checked == false)
  {
    lMessage = 'Terms & Conditions must be checked';
  }

  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function isEmpty(field)
{
  if (field.value == null || field.value.length == 0)
  {
    return true;
  }
  return false;
}

function verifyFeedbackForm(pForm)
{
  var lMessage = null;

  if (!checkRegExp(cRegExpPatternEmail, pForm.email.value))
  {
    lMessage = cErrMsgEmail;
  }
  else if (isEmpty(pForm.subject))
  {
    lMessage = 'Subject is required';
  }
  else if (isEmpty(pForm.comments))
  {
    lMessage = 'Comments is required';
  }

  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function verifyChangePin(pPin1, pPin2)
{
  var lMessage = null;

  if (!checkRegExp(cRegExpPatternPIN, pPin1.value))
  {
    lMessage = cErrMsgPinFormat;
  }
  else if (isEmpty(pPin2))
  {
    lMessage = cErrMsgConfirmPinMissing;
  }
  else if (pPin1.value != pPin2.value)
  {
    lMessage = cErrMsgPinMismatch;
  }
  return lMessage;
}

function verifyChangePinForm()
{
  var lMessage = null;
  var lOldPin = $('lightwindow_contents').childElements()[1].pin0.value;
  if (!checkRegExp(cRegExpPatternPIN, lOldPin))
  {
   lMessage = 'Your old ' + cErrMsgPinFormat;
  }

  if (lMessage == null)
  {
      var lPin1 = $('lightwindow_contents').childElements()[1].pin1;
      var lPin2 = $('lightwindow_contents').childElements()[1].pin2;

    lMessage = verifyChangePin(lPin1, lPin2);
  }

  if (lMessage != null)
  {
    customAlert(lMessage);
  }

  return (lMessage == null);
}

function verifyAndSubmitChangePinForm()
{
  if (verifyChangePinForm())
  {
    changePin();
    reload_after_two_seconds();
  }
}

function changeAvatar()
{
  saveServiceOptions();
  reload_after_two_seconds();
}

function verifyAndSubmitResetPinForm()
{
  var lForm = document.getElementById('forgotpinform');
    var lPin1 = document.getElementById('pin1');
    var lPin2 = document.getElementById('pin2');

  var lMessage = verifyChangePin(lPin1, lPin2);

  if (lMessage != null)
  {
    customAlert(lMessage);
  }
  else
  {
    lForm.submit();
  }
}

function forgotPinStep1()
{
  var lForm = document.getElementById('forgotpinform');

  if (!verifyUserId(lForm.usernumber.value))
  {
    customAlert(cErrMsgInvalidUserId);
  }
  else
  {
    lForm.submit();
  }
}

function verifyAndSubmitSignUpForm() {
  var lForm = document.getElementById("signupform");
  if (verifySignUpForm(lForm))
  {
    setCookie("userid", lForm.userid.value, 3650);
    setCookie("country", lForm.country.value, 3650);
    lForm.submit();
  }
}

function verifyAndSubmitSignInForm() {
  var lForm = document.getElementById("login");
  if (verifySignInForm(lForm.user_number.value, lForm.pin.value))
  {
    setCookie("user_number", lForm.user_number.value, 3650);
    lForm.submit();
  }
}
// SignIn can be done from two different forms (Top of the Screen form and SignInScreen form)
function verifyAndSubmitSignInForm2() {
  var lForm = document.getElementById("signinform");
  if (verifySignInForm(lForm.user_number.value, lForm.pin.value))
  {
    setCookie("user_number", lForm.user_number.value, 3650);
    lForm.submit();
  }
}

function verifyAndSubmitUserForm(service, rx) {
  // TODO: unify these two names - service_details is used by wizard, service_options
  // by account - not sure why need getElementById for the latter
  var lForm = document.service_details || document.getElementById("service_options");
  if (verifyUserForm(service, lForm.username.value, lForm.password.value, rx))
  {
    addService(); //wizard.js
  }
}

function closeAccount()
{
  var lForm = document.getElementById("closeAccountForm");
  lForm.submit();
}

function verifyAndSubmitFeedbackForm() {
  var lForm = document.feedback;
  if (verifyFeedbackForm(lForm))
  {
    //truncate the comment if too large
    trim(lForm.comments, 8189);
    lForm.submit();
  }
}

function verifyAndSubmitRegisterForm() {
  var lForm = document.register;
  if (verifyRegisterForm(lForm))
  {
    lForm.submit();
  }
}

// populates the given form field with the value from the cookie if it exists
function populateField(field)
{
    var cookie_value = getCookie(field);
    if (cookie_value != null)
    {
        document.getElementById(field).value = cookie_value;
    }
}

// populates the form with values from cookies if they have been set
function populateForm(){
    populateField('mobile_number');
}

// updates the userid prefix when the country code selection changes
function selectCountry(field, country_code) {
    document.getElementById(field).value = country_code;
}

// checks that two pin text entry boxes contain the same value
function checkPin() {
  pin1 = document.getElementById('pin1').value;
  pin2 = document.getElementById('pin2').value;

  if(pin1.length == 0 && pin2.length == 0 )
  {
    document.getElementById('icon').style.display = 'none';
  }
  else if(!checkRegExp(cRegExpPatternPIN, pin1) || !checkRegExp(cRegExpPatternPIN, pin2) || pin1 != pin2) {
    document.getElementById('icon').style.display = 'inline';
    document.getElementById('pin_icon').src = '/v2/images/cross.png';
  } else {
    document.getElementById('pin_icon').src = '/v2/images/tick.png';
  }
}

// trims the given field to the given length
function trim(field, length){
  if (field.value.length > length)
  {
    field.value = field.value.substring(0, length);
    field.value = field.value + "...";
  }
}
