var ERROR_USERNAME             = 'Please enter a valid username. Only alphanumeric characters and underscore are allowed as username.';
var ERROR_EMAIL                = 'Invalid Email Address.';
var ERROR_PASS_MATCH           = 'Passwords are mismatched. Please enter same passwords in highlighted fields.';
var ERROR_PASS_LENGTH          = 'Please provide at least 5 characters for password.';
var ERROR_PASSWORD             = 'Please provide valid password.'; 
var MISSING_REQUIRED_FIELDS    = 'Please populate the highlighted field(s).';
var TOS_PRIVACY_POLICY_MESSAGE = "You must agree to Quizfarm.com’s Terms of Service and Privacy Policy to register."
var ERROR_DUPLICATE_USERNAME   = "The provided username is already in use. Please try a different username.";
var ERROR_DUPLICATE_EMAIL      = "The provided email address is already in use. Please try a different email address.";
var INVALID_BIRTHDAY           = "Invalid birthday.";

var DEFAULT_HIGHLIGHT_COLOR    = '#ff0000';
var DEFAULT_RESET_COLOR        = '#000000';
var userNameExists             = false;
var emailExists                = false;


RE_EMAIL        = new RegExp(/^[A-Za-z0-9](([_|\.|\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([_|\.|\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/);
RE_USERNAME     = new RegExp(/^[a-zA-Z0-9\_]+$/);
RE_PASSWORD     = new RegExp(/^[;:\-_=\+\|\/\?\^\&\!\.@\$£#\*\(\)%~<>\{\}\[\]a-zA-Z0-9]+$/);


function doFormSubmit()
{
   var frm = document.signup_form;
   
   if(!checkRequiredFields(frm))
   {
     if(validateFields(frm))
     {
        return true;
     }
     
     return false;
   }
   else
   {
      if($('message').innerHTML == '')
         $('message').innerHTML = MISSING_REQUIRED_FIELDS;
      return false;
   }   
}

function checkRequiredFields(frm)
{ 
   var flag = false;
   
   resetTableColumn('lbl_username');
   resetTableColumn('lbl_password');
   resetTableColumn('lbl_repassword');
   resetTableColumn('lbl_email');
   resetTableColumn('lbl_security_code');
   $('message').innerHTML = '';
   
   if(!frm.signup_username.value)
   {
      highlightTableColumn('lbl_username');
      flag = true;
   }
    
   if(!frm.signup_password.value)
   {
      highlightTableColumn('lbl_password');
      flag = true;
   }
   
   if(!frm.repassword.value)
   {
      highlightTableColumn('lbl_repassword');
      flag = true;
   }
    
   if(!frm.email.value)
   {
      highlightTableColumn('lbl_email');
      flag = true;
   }
   
   if(!frm.security_code.value)
   {
      highlightTableColumn('lbl_security_code');
      flag = true;
   }
   
   if(!flag && !$('tos_and_privacy_agreed').checked)
   {
      $('message').innerHTML = TOS_PRIVACY_POLICY_MESSAGE;
      flag = true;
   }
   
   return flag;
}

function validateFields(frm)
{
   if(userNameExists == true)
   {
      $('message').innerHTML = ERROR_DUPLICATE_USERNAME;
      return false;
   }
   if(emailExists == true)
   {
      $('message').innerHTML = ERROR_DUPLICATE_EMAIL;
      return false;
   }
   
   with(frm)
   {
      var checkpassword    = signup_password.value;
  
      if(!RE_PASSWORD.exec(checkpassword))
      { 
         highlightTableColumn('lbl_password');
         highlightTableColumn('lbl_repassword');
         $('message').innerHTML = ERROR_PASSWORD;
         return false; 
      }

      if (signup_username.value && !RE_USERNAME.exec(signup_username.value))
      {
         highlightTableColumn('lbl_username');
         $('message').innerHTML = ERROR_USERNAME;
         return false;
      }

      else if (!RE_EMAIL.exec(email.value) && email.value!='')
      {
         highlightTableColumn('lbl_email');
         $('message').innerHTML = ERROR_EMAIL;
         return false;
      }
      //else if(signup_password.value.length < 5)
      //{
      //   highlightTableColumn('lbl_password');
      //   $('message').innerHTML = ERROR_PASS_LENGTH;
      //   return false;
      //}
      else if(signup_password.value != repassword.value)
      {
         highlightTableColumn('lbl_password');
         highlightTableColumn('lbl_repassword');
         $('message').innerHTML = ERROR_PASS_MATCH;
         return false;
      }
      
      else if(!validateDate(frm))
      {
         highlightTableColumn('lbl_birthday');
         
         $('message').innerHTML = INVALID_BIRTHDAY;
         return false;
      }
   }
   
   return true;
}

function resetTableColumn(thisID, resetColor)
{
  if (!resetColor)
  {
      resetColor = DEFAULT_RESET_COLOR;
  }

  thisElement                  = document.getElementById(thisID);
  
  thisElement.style.color      = resetColor;
  thisElement.style.fontWeight = "normal";
}

function highlightTableColumn(id, highColor)
{
   if (!highColor)
       highColor = DEFAULT_HIGHLIGHT_COLOR;

   thisElement                  = document.getElementById(id);
   thisElement.style.color      = highColor;
   thisElement.style.fontWeight = "bold";
}

function checkDuplicateUserName()
{
    var username    = document.signup_form.signup_username.value.trim();
    
    if(username)
    {
       if(!RE_USERNAME.exec(username))
       {
          $('checkname').innerHTML =  "<img src= /view/common/images/error.gif>";
          return false;
       }
       
       if(username.length == 0)
       {
          return false;
       }
       
       var url     = '';
       var pars    ='cmd=check_username&name=' + escape(username);
       
       var myAjax  = new Ajax.Request(url, {
                                            method:  'get', 
                                            asynchronous: false,
                                            parameters: pars, 
                                            onComplete: duplicateUserNameResponse});
   }   
}

function checkDuplicateEmail()
{
   var email    = document.signup_form.email.value.trim();
   
   if(email)
   {
      if(!RE_EMAIL.exec(email))
      {
         $('checkemail').innerHTML =  "<img src= /view/common/images/error.gif>";
         return false;
      }
      if(email.length == 0)
      {
         return false;     
      }
      
      var url     = '';
      var pars    ='cmd=check_email&email=' + escape(email);
      
      var myAjax  = new Ajax.Request(url, {
                                          method:  'get', 
                                          asynchronous: false,
                                          parameters: pars, 
                                          onComplete: duplicateEmailResponse
                                          }
                                    );
   }
}

function duplicateUserNameResponse(serverResponse)
{
   var rowObj = $('checkname');

   if(serverResponse.responseText == 'yes')
   {
     userNameExists   = true;
     rowObj.innerHTML = "<img src= /view/common/images/error.gif>";
   }

   else
   {
     userNameExists   = false;
     rowObj.innerHTML =  "<img src= /view/common/images/ok.gif>";
   }
}

function duplicateEmailResponse(serverResponse)
{
   var rowObj = $('checkemail');
   
   if(serverResponse.responseText == 'yes')
   {
      emailExists = true;
      rowObj.innerHTML =  "<img src= /view/common/images/error.gif>";
   }
   else
   {
      emailExists      = false;
      rowObj.innerHTML = "<img src= /view/common/images/ok.gif>";;
   }
}

function loadSecurityImage()
{
   var url    = '/run.php/Signup'
   var pars   = "cmd=load_image"
   var myAjax = new Ajax.Request(
      url,
      {
         method     : 'post',
         parameters : pars ,
         onComplete : handleSecurityImageResponse
      });   
}

function handleSecurityImageResponse(originalRequest)
{
   var imageValue           = originalRequest.responseText;
   $('security_image').src  = imageValue;
   $('security_code').value = '';
}

String.prototype.trim = function()
{
  return this.replace(/^\s+|\s+$/g, '');
}

function validateDate(frm)
{
   var day   = frm.birth_day.options[frm.birth_day.selectedIndex].value;
   var month = frm.birth_month.options[frm.birth_month.selectedIndex].value;
   var year  = frm.birth_year.options[frm.birth_year.selectedIndex].value;
   
   if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
   {
      return false;
   }
   if (month == 2)
   {
      var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));

      if (day > 29 || (day == 29 && !isleap))
      {
         return false;
      }
   }

   return true;   
}