var RG =
{
    isProcessing : false,
    loadingObj : 'ajax_working',
    formObj :    'register_form',
    validations : new Array(),
    validationClass : 'LV_validation_message',

    /*
     * set the form events
     * Check user name availibilty
     * Client side validation with Live validations
     */
    init : function()
    {
      this.loadingObj = $(this.loadingObj);
      this.formObj = $(this.formObj);

      this.setFormSubmitEvent();
      this.setUserNameEvent();

      this.setLiveValidatons();
    },

    /*
     * set Live validations on form fields
     */
    setLiveValidatons: function()
    {
      var firstname = new LiveValidation( "firstname", {onlyOnSubmit: true } );
      firstname.add(Validate.Presence,
              { failureMessage: "Please enter the first name" });
      firstname.add( Validate.Length, {maximum: 30 } );
      firstname.add( Validate.Format,
              { pattern: /^[a-zA-Z_0-9]*$/i, failureMessage: "Sorry, only A-Z, 0-9, or _" } );

      this.validations.push(firstname);

      var lastname = new LiveValidation( "lastname", {onlyOnSubmit: true } );
      lastname.add(Validate.Presence,
              { failureMessage: "Please enter the last name" });
      lastname.add( Validate.Length, {maximum: 30 } );
      lastname.add( Validate.Format,
              { pattern: /^[a-zA-Z_0-9]*$/i, failureMessage: "Sorry, only A-Z, 0-9, or _" } );

      this.validations.push(lastname);

      var username = new LiveValidation( "username", {onlyOnSubmit: true } );
      username.add(Validate.Presence,
              { failureMessage: "Please enter the username" });
      username.add( Validate.Length, { minimum: 3, maximum: 16 } );
      username.add( Validate.Format,
              { pattern: /^[a-zA-Z_0-9]*$/i, failureMessage: "Sorry, only A-Z, 0-9, or _" } );

      this.validations.push(username);

      var email = new LiveValidation('email', {onlyOnSubmit: true } );
      email.add(Validate.Presence,
              { failureMessage: "Please enter the email" });
      email.add( Validate.Email, { failureMessage: "This email address is invalid" } );
      email.add( Validate.Length, { minimum: 2, maximum: 100 } );

      this.validations.push(email);

      var pw = new LiveValidation('password', {onlyOnSubmit: true } );
      pw.add( Validate.Length, { minimum: 6, maximum: 200 } );
      pw.add(Validate.Presence,
              { failureMessage: "required" });

      this.validations.push(pw);

      var pw2 = new LiveValidation('confirm_password', {onlyOnSubmit: true });
      pw2.add(Validate.Presence,
              { failureMessage: "Please retype the password" });
      pw2.add( Validate.Confirmation, { match: 'password' } );

      this.validations.push(pw2);


      if($('card_num'))
      {

        /*var name_on_card = new LiveValidation( "name_on_card", {onlyOnSubmit: true } );
        name_on_card.add(Validate.Presence,
                { failureMessage: " Please enter the name on card" });

        this.validations.push(name_on_card);*/

        var card_num = new LiveValidation( "card_num", {onlyOnSubmit: true, insertAfterWhatNode: $($('card_num').parentNode).down("label") } );
        card_num.add(Validate.Presence,
                { failureMessage: " Please enter a valid card number" });
        card_num.add( Validate.Length, { is: 16 } );
        card_num.add( Validate.Format,
                { pattern: /^[0-9]*$/i, failureMessage: " Please enter a valid card number" } );

        this.validations.push(card_num);

        var year = new LiveValidation('year');
        year.add(Validate.Presence,
                { failureMessage: "Please enter the date" });

        this.validations.push(year);

      }


    },

    /*
     * Set event on username field for checking the availibity
     */
    setUserNameEvent : function()
    {
      var userNameObj = this.formObj.username;
      //userNameObj.value = "";
      $(userNameObj).observe("change", function(){ RG.validateUserName(this);});
    },

    /*
     * hadnling the form submissions
     */
    setFormSubmitEvent : function()
    {
      $(this.formObj).observe("submit", function(event){

        event.stop();
        if(LiveValidation.massValidate(RG.validations) && (!RG.isProcessing))
        {
          this.submit();
        }
      });
    },

    /*
     * Send AJAX request to check the  username availibilty
     * @param username field
     * @return JSON
     */
    validateUserName : function(field)
    {
      if($F(field))
      {
        var form = this.formObj;
        var url = form.action;
        var params = 'username='+field.value;
        this.isProcessing = true;
        this.isRequesting(true, field);
        field.disable();

        new Ajax.Updater('', url, {method: 'post', parameters: params, onComplete: function(request)
          {
              field.enable();
              RG.isProcessing = false;
              RG.isRequesting(false, field);
              var resp = request.responseText.evalJSON(true);
              RG.afterCheckUserName(field, resp);
          }
        });
      }
    },

    /*
     * envoke after the compeleting the AJAX request for checking the username
     */
    afterCheckUserName : function(field, response)
    {
      var text = response['text'];
      var str ;
      var classVal = "LV_invalid";
      if(response['error'] == 0)
      {
        classVal = "LV_valid";
      }
      str = '<span class="'+this.validationClass+'  '+classVal+'">'+text+'</span>';
      var errorEle = field.next(0);
      if($(errorEle))
      {
        errorEle = $(errorEle);
        if(errorEle.hasClassName(this.validationClass))
        {
          errorEle.remove();
        }
      }
      Element.insert(field, { after : str  });
    },

    /*
     * Show loading text, while AJAX request
     * Fade the updater
     * @param true/false
     * @param object which need to be faded while AJAX request
     */
    isRequesting : function(opt, obj) {
        var loadingEle = this.loadingObj;
        if (opt) {
            loadingEle.show();
            if (obj)
                obj.setOpacity(0.4);
        } else {
            loadingEle.hide();
            if (obj)
                obj.setOpacity(1);
        }
    }

}
