var signupPkg = 
{
   fnFieldID: "",
   lnFieldID: "",
   emailFieldID: "",
   confirmEmailFieldID: "",
   pwFieldID: "",
   confirmPwFieldID: "",
   agreeTermID: "",
   fnRequireMsg: "* Please enter your First Name",
   nameFormatMsg: "* Please enter English characters only",
   lnRequireMsg: "* Please enter your Last Name",
   emailRequireMsg: "* Please enter a valid Email Address",
   emailFormatMsg: "* Email format is not valid",
   confirmEmailMsg: "* The Email Addresses are not the same",
   pwRequireMsg: "* Please etner 6-25 characters (A-Z, a-z, 0-9 only)",
   confirmPwMsg: "* Please enter your password again",
   termsRequireMsg: "* You must agree to the Terms and Conditions"
};

// pkg should contain an array of all form field ID's
var Security =
{
   valuePkg: null,
   validateFirstNameField: function()
   {
      var pkg = this.valuePkg;
      //return this.validateEmptyField(pkg.fnFieldID, pkg.fnRequireMsg);
      return this.validateEmptyAndPatternField(pkg.fnFieldID, 
                                               pkg.fnRequireMsg,
                                               pkg.nameFormatMsg,
                                               /[A-Za-z]/);
   },
   validateLastNameField: function()
   {
      var pkg = this.valuePkg;
      //return this.validateEmptyField(pkg.lnFieldID, pkg.lnRequireMsg);
      return this.validateEmptyAndPatternField(pkg.lnFieldID, 
                                               pkg.lnRequireMsg,
                                               pkg.nameFormatMsg,
                                               /[A-Za-z]/);
   },
   validateEmailField: function()
   {
      var pkg = this.valuePkg;

      return this.validateEmptyAndPatternField(pkg.emailFieldID, 
                                               pkg.emailRequireMsg,
                                               pkg.emailFormatMsg,
                                               /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
                                               /*/^([a-z0-9]+)([._-]([a-z0-9]+))*@([a-z0-9]+)(([._-]([a-z0-9]+))*)[._-]([a-z0-9]{2,3})$/*/);
   },
   validateConfirmEmailField: function()
   {
      var pkg = this.valuePkg;

      return this.validateComparisonField(pkg.confirmEmailFieldID ,
                                          pkg.emailFieldID, 
                                          pkg.confirmEmailMsg);
   },
   validatePasswordField: function()
   {
      var pkg = this.valuePkg;
      var pw = $(pkg.pwFieldID);
      
      return this.validateEmptyAndPatternField(pkg.pwFieldID, 
                                               pkg.pwRequireMsg,
                                               pkg.pwRequireMsg,
                                               /[A-Za-z0-9]{6,25}/);
   },
   validateConfirmPasswordField: function()
   {
      var pkg = this.valuePkg;

      return this.validateComparisonField(pkg.confirmPwFieldID ,
                                          pkg.pwFieldID, 
                                          pkg.confirmPwMsg);
   },
   validateTermsConditionsField: function()
   {
      var pkg = this.valuePkg;
      var wrapper = $(pkg.agreeTermID); // wrapper element contains the checkbox
      var terms = wrapper.down(); // first child
      
      if(terms != null)
      {
         if(terms.checked) // agree to terms
         {
            this.UpdateInnerMessage(wrapper, "");
            return true;
         }
         else
         {
            this.UpdateInnerMessage(wrapper, pkg.termsRequireMsg);
            return false;
         }
      }
      
      return false;
   },
   validateEmptyField: function(nameID, message)
   {
      var n = $(nameID);
      var input = n.value;
      
      if(input.length == 0)
      {
         this.UpdateInnerMessage(n, message);
         return false;
      }
      
      this.UpdateInnerMessage(n, "");
      return true;
   },
   validateEmptyAndPatternField: function(nameID, emptyMsg, patternMsg, pattern)
   {
      var field = $(nameID);
      var input = field.value;
      
      var isFilled = this.validateEmptyField(nameID, emptyMsg);
      
      if(!isFilled) // return false if not empty
      {
         return isFilled;
      }
      else // check pattern if not empty
      {
         var matched = input.match(pattern);
         
         if(matched != null && matched.length > 0) // there's a match
         {
            // clear message & validate
            this.UpdateInnerMessage(field, ""); 
            return true;
         }
         else
         {
            this.UpdateInnerMessage(field, patternMsg);
            return false;
         }
      }
   },
   validateComparisonField: function(nameID, nameIDToCompare, confirmMsg)
   {
      var field = $(nameID);
      var input = field.value;
      var fieldToCompare = $(nameIDToCompare);
      var inputToCompare = fieldToCompare.value;

      if(field != null && fieldToCompare != null && input.length > 0 && input == inputToCompare)
      {
         this.UpdateInnerMessage(field, "");
         return true;
      }
      
      this.UpdateInnerMessage(field, confirmMsg);
      return false;
   },
   UpdateInnerMessage: function(field, message)
   {
       // always the first sibling
       field = $(field);
       var wrapper = field.next();
   
       if(wrapper != null)
       {
           wrapper.addClassName("on");
           
           // always the first child, show message
           var innerMsg = wrapper.down();
           if(innerMsg != null)
           {
              //if(innerMsg.innerHTML.length == 0 || message.length == 0)
                 innerMsg.update(message);
           }
       }
       
   },
   ResetFormFields: function()
   {
      var pkg = this.valuePkg;
      this.ClearFieldAndMsg(pkg.fnFieldID);
      this.ClearFieldAndMsg(pkg.lnFieldID);
      this.ClearFieldAndMsg(pkg.emailFieldID);
      this.ClearFieldAndMsg(pkg.confirmEmailFieldID);
      this.ClearFieldAndMsg(pkg.pwFieldID);
      this.ClearFieldAndMsg(pkg.confirmPwFieldID);
      this.ClearFieldAndMsg(pkg.agreeTermID);
      
      return false;
   },
   ClearFieldAndMsg: function(nameID)
   {
      var field = $(nameID);
      var valueProp = field.value;
      //alert(nameID + ":" + valueProp);
      
      if(Object.isUndefined(valueProp)) // wrapper has not value property
      {
         //field = field.down();
         var terms = field.down();
         terms.checked = false;
      }
      else
      {
         field.value = "";
      }
      
      this.UpdateInnerMessage(field, "");
   }
};

function SignupValidation(pkg)
{
   Security.valuePkg = pkg;
   var passedFn = Security.validateFirstNameField();
   var passedLn = Security.validateLastNameField();
   var passedEmail = Security.validateEmailField();
   var passedConfirmEmail = Security.validateConfirmEmailField();
   var passedPw = Security.validatePasswordField();
   var passedConfirmPw = Security.validateConfirmPasswordField();
   var agreedTerms = Security.validateTermsConditionsField();

   return (passedFn && passedLn && passedEmail && 
           passedConfirmEmail && passedPw && passedConfirmPw && agreedTerms);
}

function ResetForm(pkg)
{
   Security.valuePkg = pkg;
   return Security.ResetFormFields();
}

//* functions for mini login effects
function MiniLoginMOver(loginCtrlID, ctrl)
{
   var loginCtrl = $(loginCtrlID);
   loginCtrl.setStyle({display:'block'});
}

function MiniLoginMOut(loginCtrlID, ctrl)
{
   var loginCtrl = $(loginCtrlID);
   loginCtrl.setStyle({display:'none'});
}

function InputSubmitKeyPressed(e, inputID)
{
   var keynum;
   var submit = $(inputID);
   // get keycode for different browser
   if(window.event) // IE
   {
      keynum = e.keyCode;
   }
   else if(e.which) // Netscape/Firefox/Opera
   {
      keynum = e.which;
   }
   
   if(keynum == 13) // enter key
   {
      submit.click();
   } 
}