/**
 * login_register.js
 *
 * @author Tom
 * @author Aaron
 * @copyright Doctor Net Ltd 2009
 */

$(document).ready(function() {
   //$.ajaxHistory.initialize();

   $('#alt_del_address').click(function(){

      if($(this).attr('checked') == true) {
         $('#del_address').show();
      } else {
         $('#del_address').hide();
      }
   });


   /** Help & Exclamation hover */
   $('span.form_icon a').hover(function(){
      var obj_input = $(this).parent().prevAll('input');
      var offset = obj_input.offset();
      var int_top = offset.top;
      var int_left = offset.left;
      var int_width = obj_input.width()+6;
      // There are a couple of special cases
      switch (obj_input.attr('id')) {
         case 'issue_number':
            int_left += 130;
            int_width = 140;
            break;
         case 'cv2':
            int_top  = $('#expiry_year').offset().top;
            int_left += 130;
            int_width = 140;
            break;
      }

      $('#form_help_floater').css({'top' : int_top, 'left' : int_left, 'width' : int_width}).show();

      if($(this).parent().hasClass('error')) {
         $('#form_help_floater').html('<p align="center">'+obj_input.attr('err')+'</p>');
      } else {
         $('#form_help_floater').html('<p align="center">'+obj_input.attr('help')+'</p>');
      }


   }, function (){
      $('#form_help_floater').hide();
   });


   /** Terms and conditions link */
   $('#terms_link').click(function(){
      window.open("terms.html", "termsandconditions", "menubar=0,resizable=0,location=0,status=0,scrollbars=1,width=600,height=500");
      return false;
   });

   /** Show any field help */
   $('form input.has_help').each(function(){
      obj_input = $(this);
      if(obj_input.attr('help') != '') {
         obj_input.nextAll('span.form_icon.help').show();
      }
   });


   /** Customer type selection */
   $('#returning_customer').click(function(){
      $('#register_form').hide();
      $('#login_form').show();
      $('#flag_returning_customer').show();
      $('#flag_new_customer').hide();
      $('#login_email').focus();
   });
   $('#new_customer').click(function(){
      $('#login_form').hide();
      $('#register_form').show();
      $('#flag_new_customer').show();
      $('#flag_returning_customer').hide();
      $('#first_name').focus();
   });


   /** Register Form submission */
   // Note: dont listen to submit() as we need to call it at the end and we'd get stuck in an infinite loop
   //$('#register_form').submit(function(){
   $('#form_proceed').click(function() {
   	var bol_success = true;

   	// Required field checks
   	if($('#alt_del_address').attr('checked') == true) {
      	arr_inputs = $('#register_form input.required');
   	} else {
      	arr_inputs = $('#register_form input.required:not(#del_address input)');
   	}
      arr_inputs.each(function(){
         obj_input = $(this);
         if(obj_input.val() == '') {
            field_error(obj_input, 'This is a required field and cannot be blank - please fill it in.');
            bol_success = false;
         } else {
            field_ok(obj_input);
         }
      });


      // @TODO: del_address
      // $('#alt_del_address').attr('checked') == true

      // Password length
      if (String($('#password').val()).length < 6) {
         field_error($('#password'), 'Password must be at least 6 characters long');
         bol_success = false;         
      }

      // Password comparison
      if($('#password').val() != $('#confirm_password').val()) {
         field_error($('#confirm_password'), 'Passwords must match - please make sure they are the same');
         bol_success = false;
      }

      // Email comparison
      if($('#email').val() != $('#confirm_email').val()) {
         field_error($('#confirm_email'), 'Email addresses must match - please make sure they are the same');
         bol_success = false;
      }

      // Telephone format
      // Leave for now

      // Postcode format
      // Leave for now

      if (bol_success) {
         // AJAX email address check
         AjaxHandler.reset();
         AjaxHandler.set_url('/ajax-customer/search-email-address');
         AjaxHandler.add_data('email', $('#email').val());
         AjaxHandler.dispatch(function(obj_response) {
            // If we already have this email tell them to login
            if (parseInt($('customers_found', obj_response).text()) !== 0) {
               bol_success = false;
               $('#returning_customer').click();
               $('#login_failure_message').text('That email address has already been used to register an account. Please login using the form below.');
               // Fill in the email address and reset the rest of the form
               $('#login_email').val($('#email').val());
               $('#login_password').val('');
               field_ok($('#login_email'));
               field_ok($('#login_password'));
               $('#login_password').focus();
            }

            // Actually register the customer & continue
            if(bol_success) {
               /* (Now done as a POST)
            	// Move form on
            	$('#register_form, #new_returning_selection').hide();
            	$('#payment_form').show();
            	$('#card_number').focus();
            	$('#crumb2').addClass('active');
            	//$.ajaxHistory.update('#payment');
            	*/

            	$('#register_form').submit();
            }
         });
      }

      return false;
   });


   /** Payment Form submission */
   $('#payment_form').submit(function(){
      var bol_success = validate_required_fields($('#payment_form'));

      //$.ajaxHistory.update('#confirmation');

      return bol_success;
   });




   /** Logn submission **/
   $('#login_form').submit(function(){
      // Validate
      var bol_success = true;

      if($('#login_email').val() == '') {
         field_error($('#login_email'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         field_ok($('#login_email'));
      }

      if($('#login_password').val() == '') {
         field_error($('#login_password'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         field_ok($('#login_password'));
      }

	   /* (Now done as a POST)
   	// Move form on
   	$('#login_form, #new_returning_selection').hide();
   	$('#payment_form').show();
   	$('#card_number').focus();
   	$('#crumb2').addClass('active');
   	*/

      return bol_success;
   });

   /** Password request **/
   $('#password_request_form').submit(function() {
      // Validate
      var bol_success = true;

      if($('#password_request_acct_code_or_email').val() == '') {
         field_error($('#password_request_acct_code_or_email'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         field_ok($('#password_request_acct_code_or_email'));
      }

      return bol_success;
   });

   /** Change password form **/
   $('#change_password_form').submit(function() {
      var bol_success = validate_required_fields($('#change_password_form'));

      // Password comparison
      if($('#password').val() != $('#change_password').val()) {
         field_error($('#change_password'), 'Passwords must match - please make sure they are the same');
         bol_success = false;
      }

      return bol_success;
   });

   /**
    * Change ServiceCategory
    */
   $('#service_category_select').change(function() {
      var int_sc_id = $(this).val();
      AjaxHandler.reset();
      AjaxHandler.set_url('/ajax-basket/change-service-category');
      AjaxHandler.add_data('int_service_category_id', int_sc_id);
      AjaxHandler.dispatch(function(obj_response) {
         // Update prices
         $('#delivery_unit_price').html($('str_delivery', obj_response).text());
         $('#delivery_total_price').html($('str_delivery', obj_response).text());
         $('#basket_total_price').html($('str_display_price', obj_response).text());
      });
   });

   /**
    * Change delivery address
    */
   $('input[name="int_delivery_address_id"]').click(function() {
      var int_del_addr_id = $(this).val();
      AjaxHandler.reset();
      AjaxHandler.set_url('/ajax-basket/change-delivery-address');
      AjaxHandler.add_data('int_delivery_address_id', int_del_addr_id);
      AjaxHandler.dispatch(function(obj_response) {
         // Update ServiceCategories
         if ($('service_categories service_category', obj_response).length > 0) {
            $('#service_category_select').empty();
            $('service_categories service_category', obj_response).each(function() {
               $('#service_category_select').append('<option value="'+$('id', this).text()+'">'+$('description', this).text()+'</option>');
            });
         }

         // If the Basket details were sent back assume something's changed
         if ($('basket', obj_response).length > 0) {
            // Update ServiceCategory
            $('#service_category_select').val($('basket int_service_category_id', obj_response).text());

            // Update prices
            $('#delivery_unit_price').html($('basket str_delivery', obj_response).text());
            $('#delivery_total_price').html($('basket str_delivery', obj_response).text());
            $('#basket_total_price').html($('basket str_display_price', obj_response).text());
         }
      });
   });

   /**
    * Update delivery address
    */
   $('#update_delivery_address_form').submit(function() {
      var bol_success = validate_required_fields($('#update_delivery_address_form'));

      return bol_success;
   });

   /**
    * Update personal details
    */
   $('#update_personal_details_form').submit(function() {
      var bol_success = validate_required_fields($('#update_personal_details_form'));

      return bol_success;
   });
});

/**
 * Show a field error
 *
 * @param jQuery obj_input
 * @param String str_message
 */
function field_error(obj_input, str_message) {
   obj_input.parent('p').addClass('err');
   obj_input.attr('err', str_message);
}

/**
 * Clear a field error
 *
 * @param jQuery obj_input
 */
function field_ok(obj_input) {
   obj_input.parent('p').removeClass('err');
}

/**
 * Validate required fields of a form
 *
 * @param jQuery obj_form
 * @return Bool All fields valid?
 */
function validate_required_fields(obj_form) {
   var bol_success = true;
   $('input.required', obj_form).each(function(){
      obj_input = $(this);
      if(obj_input.val() == '') {
         field_error(obj_input, 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         field_ok(obj_input);
      }
   });

   return bol_success;
}