var AMO = AMO || {};

$.extend( AMO, {

  init : function() {

    AMO.initInputs();

    // Anything with class link login will bring up popup
    $('.link-login').live( 'click', function(){

      var $pop;

      $.get('/login/login_popup', {}, function( json ) {

        if ( json.valid === 'yes' ){

            $pop  = $('<div >').popup({
              input : json.html,
              outerDiv : false,
              innerClass : 'login-popup'
          });

        } // if

        AMO.initInputs();
        AMO.initPopupInputs();

        $('#close-popup').click( function() {
          $pop.popup('destroy');
        });

      }); // get

      return false;

    }); // .click

  }, // init

  // Determines if font should be faded or white
  toggleStyling : function() {

    var $this = $(this),
        func  = ( this.value === $this.data('defaultVal') ) ? 'removeClass' : 'addClass';

    $this[ func ]('input-focus');

  }, // toggleStyling

  // Add custom inputs to site
  initInputs : function() {

    $('select').selectmenu();
    $('input').customInput();

  }, // initInputs

  // Check if password field or placeholder field should show after blurring placeholder field
  checkPassword : function() {

    if( this.value !== "" ) {
      return;
    }

    $(this).hide();
    $('#' + this.id + '-placeholder').show();

  }, // checkPassword

  // Check if password field or placeholder field should show after blurring placeholder field
  checkPlaceholder : function() {

    if( this.value !== "" ) {
      return;
    }

    $(this).hide();
    $('#' + this.id.replace('-placeholder',"")).show().focus();

  }, // checkPlaceholder

  // Initialize popup for signup/login
  initPopupInputs : function() {

    var $signup_form                   = $('#popup-signup-form'),
        $signup_first_name             = $('#signup-first-name'),
        $signup_last_name              = $('#signup-last-name'),
        $signup_email                  = $('#signup-email'),
        $signup_confirm_pw_placeholder = $('#signup-confirm-password-placeholder'),
        $signup_password_placeholder   = $('#signup_password-placeholder'),
        $signup_password               = $('#signup_password'),
        $signup_confirm_password       = $('#signup-confirm-password'),
        $signup_button_container       = $('#signup-button-container'),
        $login_form                    = $('#popup-login-form'),
        $login_password_placeholder    = $('#login-password-placeholder'),
        $login_password                = $('#login-password'),
        $login_email                   = $('#login-email'),
        $login_button_container        = $('#login-button-container'),
        check_fields                   = [ $signup_first_name, $signup_last_name, $signup_email ],
        check_field_placeholders       = [ $signup_confirm_pw_placeholder, $signup_password_placeholder ],
        check_pw_fields                = [ $signup_confirm_password, $signup_password ],
        
        // Clicking on the A will submit signup form
        fakeSignupSubmit = function() {
          $signup_form.trigger('submit');
        }, // fakeSignupSubmit
        
        // Hitting enter while focusing on A will submit signup or login form
        submitEnter = function( e )  {

          if ( e.keyCode === $.ui.keyCode.ENTER ) {
            $(this).trigger('click');
          }

        }, // submitEnter
        
        // Validation fail for signup form
        signupFailure = function() {

          // after the default values were stripped away, if there was an error because of blank field,
          // default value gets added back. Blur should not be triggered or error will go away
          $.each( check_fields, function( index, $field ) {

            if ( $field.val() === '' ) {
              $field.val( $field.data('defaultVal') );
            }

          }); // each check_fields

          // after the default values were stripped away,
          // if there was an error because of blank field,
          // hide the actual input and show placeholder
          $.each( check_pw_fields, function( index, $field ) {

            if ( $field.val() === '' ) {
              $field.hide();
              check_field_placeholders[index].show();
            }

          });

        }, // signupFailure
        
        // Validation success for signup form
        signupSuccess = function() {
        
          var params = $.fn.dirtyForm.getValues( $signup_form );
          
          $signup_button_container.hideButtons('Checking E-Mail...');

          $.ajax( '/signup/checkEmail', {

            type    : 'POST',
            data    : { email : $signup_email.val() }, // server expects email, not signup-email
            success : function( json ) {

              if ( !json || json.valid !== 'yes' ) {
              
                $signup_button_container.showButtons();
              
                // convert to right field name
                if ( json && json.errors && json.errors.email ) {
                
                  json.errors['signup-email'] = json.errors.email;
                  delete( json.errors.email );
                
                }

                 $.validationEngine.handleResponse( {
                  'data': json,
                  'form': $signup_form
                } );
                
                
                return;

              } // !json
              
              // remove prefixes for this form to match what server expects
              $.each( params, function( key, value ) {

                // replace dashes out of key
                var replacement = key.replace( /signup[_-]/g, '' );

                // if key is now different, set new key and delete old
                if ( replacement !== key ) {

                  params[ replacement ] = value;
                  delete( params[key] );

                }

              });
              
              // add more data to params
              $.extend( params, {
                heard_id : 0
              });

              $.legacyNormalize( params );
              
              $signup_button_container.hideButtons('Signing Up...');
              
              $.ajax( $signup_form.attr('action'), {

                type    : 'POST',
                data    : params,
                success : function( json ) {
                
                  var $pop;

                  if ( !json || json.valid !== 'yes' ) {
                  
                    $signup_button_container.showButtons();

                    $.validationEngine.handleResponse( {
                      'data': json,
                      'form': $signup_form
                    } );

                    return;

                  } // !json
                  
                  $.get('/login/signup_confirmation_popup', function( json ) {

                    if ( json.valid === 'yes' ){

                        $pop  = $('<div >').popup({
                          input : json.html,
                          outerDiv : false,
                          innerClass : 'login-popup'
                      });

                    } // if

                    $('#close-popup').click( function() {
                      $pop.popup('destroy');
                    });

                  }); // get

                } // success

              });

            } // success

          });


        }, // signupSuccess
        
        loginSuccess = function() {
        
          $login_button_container.hideButtons('Logging In...');
          
          var params = { loginEmail : $login_email.val() , loginPass : $login_password.val(), new_format : 1 };
        
          $.ajax( $login_form.attr('action'), {

            type    : 'POST',
            data    : params,
            success : function( json ) {
            
              var $pop;

              if ( !json || json.valid !== 'yes' ) {
              
                $login_button_container.showButtons();
                
                if ( json && json.errors && json.errors.form ) {

                  $login_form.showMessages([{
                    type:'error',message:json.errors.form
                  }], { fade : false });
                  
                  $messages_container = $login_form.find('.messages');
                  $messages_container.prepend( '<div class="formErrorArrow"><div class="line8">&nbsp;</div><div class="line7">&nbsp;</div><div class="line6">&nbsp;</div><div class="line5">&nbsp;</div><div class="line4">&nbsp;</div><div class="line3">&nbsp;</div><div class="line2">&nbsp;</div><div class="line1">&nbsp;</div></div>' );
                  
                  delete( json.errors.form );

                }

                $.validationEngine.handleResponse( {
                  'data': json,
                  'form': $login_form
                } );

                return;

              } // !json
              
              $.post('/_amo/_ajax/auth/signIn.php', params, function( json ) {

                window.location.href = '/checkout';

              }); // get

            }, // success
            
            error : function() { $login_button_container.showButtons(); }

          });
          
        }, // loginSuccess
        
        loginFailure = function() {
        
          if ( $login_email.val() === '' ) {
            $login_email.val( $login_email.data('defaultVal') );
          }
        
          if ( $login_password.val() === '' ) {
            $login_password.hide();
            $login_password_placeholder.show();
          }
        
        }, // loginFailure
        
        // Clicking on the A will submit login form
        fakeLoginSubmit = function() {
          $login_form.trigger('submit');
        }; // fakeLoginSubmit

    // default values
    $login_email.defaultValue('E-mail');
    $signup_first_name.defaultValue('First Name');
    $signup_last_name.defaultValue('Last Name');
    $signup_email.defaultValue('E-mail');
    $signup_confirm_pw_placeholder.defaultValue('Confirm Password');
    $login_password_placeholder.add( $signup_password_placeholder ).defaultValue('Password');

    // how to toggle elements (focus / blur)
    $('input[type=text],input[type=password]').bind('focus', AMO.toggleStyling ).bind('blur', AMO.toggleStyling );
    $('.form-text-placeholder').bind('focus.defaultValue', AMO.checkPlaceholder );
    $('.popup-password').bind('blur', AMO.checkPassword );

    // Make sure A tag functions like submit
    $('#login-button').bind( 'click', fakeLoginSubmit )
                       .bind( 'keydown', submitEnter );
               
    // Make sure A tag functions like submit
    $('#signup-button').bind( 'click', fakeSignupSubmit )
                       .bind( 'keydown', submitEnter );
                       
    $login_form.bind( 'submit', function() {
    
      $('.formError').remove();

      // show all inputs then hide placeholders
      // if user left field blank, validationEngine will know where to place error bubble
      $login_form.find('input').show();
      $login_form.find('.form-text-placeholder').hide();

      // don't let user accidentally submit garbage
      if ( $login_email.val() === $login_email.data('defaultVal') ) {
        $login_email.val('');
      }
    
    })
    .dirtyForm()
    .validationEngine({
    
      scrolling : false,
      success   : loginSuccess,
      failure   : loginFailure
    
    }); // login_form validationEngine

    $signup_form.bind( 'submit', function() {
    
      $('.formError').remove();

      // show all inputs then hide placeholders
      // if user left field blank, validationEngine will know where to place error bubble
      $signup_form.find('input').show();
      $signup_form.find('.form-text-placeholder').hide();

      // don't let user accidentally submit garbage
      $.each( check_fields, function( index, $field ) {

        if ( $field.val() === $field.data('defaultVal') ) {
          $field.val('');
        }

      }); // each check_fields
    
    })
    .dirtyForm()
    .validationEngine({

      scrolling : false,
      success   : signupSuccess,
      failure   : signupFailure

    }); // signup_form validationEngine

  } // initPopupInputs
});

$(document).ready(function() {
  AMO.init();
});
