/**
 * Zutti site enhancement
 *
 * @author Jim Tunstall <jtunstall@doc-net.com>
 * @copyright Copyright &copy; 2009, Doctor Net Limited
 * @package Zutti
 */

// Global namespace
var Zutti = {};


// Module stack
Zutti.modules = (function () {
   // Queued modules
	var arr_modules = [];

	// Public methods
	return {
	   // Add module
		add: function (obj_module_initialise) {
			arr_modules[arr_modules.length] = obj_module_initialise;
		},

		// Run modules
		run: function () {
			for (var int_index in arr_modules) {
            arr_modules[int_index]();
         }
		}
	};
}());

Zutti.wmp_filtering = (function () {
   var arr_filter_groups = [],
   arr_filters_active = [],
   flt_price_filter_min = 0,
   flt_price_filter_max = 100,

   initialise = function () {
      detect_active_filters();
      replace_select_links('m');
      replace_select_links('id');
      replace_select_links('iv');
      replace_checkbox_links();
      replace_pagination_links();
   },
   detect_active_filters = function () {
      var obj_regex = new RegExp("[\\?&]filter=([^&#]*)");
      var arr_results = obj_regex.exec(window.location.search);
      var str_filter_active = '';
      if (arr_results !== null) {
         str_filter_active = arr_results[1];
      }
      if (str_filter_active.length > 0) {
         arr_filters = str_filter_active.split(',');
         var bol_done_ip = false;
         for (key in arr_filters) {
            if (key == 'ip' && bol_done_ip) {
               continue;
            }
            arr_filter_parts = arr_filters[key].split('-');
            Zutti.wmp_filtering.select_filter(arr_filter_parts[0], arr_filter_parts[1]);
            if (key == 'ip') {
               bol_done_ip = true;
            }
         }
      }
   },
   replace_checkbox_links = function (str_group_prefix) {
      $('#filter_group_' + str_group_prefix).each(function () {
         var str_href = $(this).attr('href');
         var str_regexp = new RegExp('\\?filter=pg-([0-9]+)');
         var arr_matches = str_regexp.exec(str_href);
         if(arr_matches.length > 0) {
            $(this).attr('href', '#');
            $(this).click(function() {
               _set_filter(str_group_prefix, arr_matches[1]);
               Zutti.wmp_filtering.refresh_results();
               return false;
            });
         }
      });
   },
   replace_select_links = function(str_group_prefix) {
      $('#filter_group_' + str_group_prefix).change(function () {
         if ($(this).val() == '') {
            _reset_filter(str_group_prefix);
            _reset_filter('pg');
         } else {
            var arr_parts = $(this).val().split('-');
            Zutti.wmp_filtering.set_filter(str_group_prefix, arr_parts[1]);
            _reset_filter('pg');
         }
         Zutti.wmp_filtering.refresh_results();
         return false;
      });
   },
   replace_pagination_links = function () {
      $('DIV.inventory_pagination P.pages A').each(function () {
         var str_href = $(this).attr('href');
         var str_regexp = new RegExp('\\?filter=pg-([0-9]+)');
         var arr_matches = str_regexp.exec(str_href);
         if(arr_matches.length > 0) {
            $(this).attr('href', '#');
            $(this).click(function() {
               _set_filter('pg', arr_matches[1]);
               Zutti.wmp_filtering.refresh_results();
               return false;
            });
         }
      });
   },
   _select_filter = function(str_group_id, str_option) {
      if(str_group_id == 'ip' || str_group_id == 'm' || str_group_id == 'id') {
         Zutti.wmp_filtering.set_filter(str_group_id, str_option);
      } else {
         arr_filters_active.push([str_group_id, str_option]);
      }
   },
   _refresh_results = function() {
      var str_url = window.location.pathname;
      var str_filter = '';
      for (int_i = 0, int_n = arr_filters_active.length; int_i < int_n; int_i++) {
         if (arr_filters_active[int_i][0] != '') {
            str_filter += arr_filters_active[int_i][0] + '-' + arr_filters_active[int_i][1] + ',';
         }
      }
      if (str_filter.length > 0) {
         window.location.href = str_url + '?filter=' + str_filter;
      } else {
         window.location.href = str_url;
      }
   },
   _reset_filter = function(str_group_id) {
      for (key in arr_filters_active) {
         if (arr_filters_active[key][0] == str_group_id) {
            arr_filters_active.splice(key, 1);
         }
      }
   },
   _set_filter = function(str_group_id, str_option) {
      var bol_added = false;
      for (key in arr_filters_active) {
         if (arr_filters_active[key][0] == str_group_id) {
            arr_filters_active[key][1] = str_option;
            bol_added = true;
            break;
         }
      }
      if (!bol_added) {
         arr_filters_active.push([str_group_id, str_option]);
      }
   };

   Zutti.modules.add(initialise);

   var obj_public = {
      refresh_results: function () {
         _refresh_results();
      },
	   select_filter: function(str_group_id, str_option) {
         _select_filter(str_group_id, str_option);
		},
		set_filter: function(str_group_id, str_option) {
		   _set_filter(str_group_id, str_option);
		}
   };

	return obj_public;
})();

// Ticker module
// Based on http://www.gcmingati.net/wordpress/wp-content/lab/jquery/newsticker/jq-liscroll/scrollanimate.html
Zutti.ticker = (function () {
   var $obj_strip, // ticker
   int_strip_width = 0, // ticker width
   int_transition_time = 0, // in ms
   int_container_width = 940, // mask
   int_velocity_divisor = 0.04, // higher increases speed, lower vice versa

   initialise = function () {
      $obj_strip = $('#ticker');
      measure_strip();
		$obj_strip.width(int_strip_width);
      int_transition_time = int_strip_width / int_velocity_divisor;
		reset();
   },
   // start strip animation
   begin = function () {
      $obj_strip.animate({marginLeft: -int_strip_width}, int_transition_time, "linear", reset);
   },
   // move ticker to initial position
   reset = function () {
      $obj_strip.css("marginLeft", int_container_width);
      begin();
   },
   // work out the strip width (from the items in it)
   measure_strip = function (){
      $obj_strip.find("li").each(function(int_i){
         int_strip_width += $(this, int_i).outerWidth(true);
		   int_strip_width += 15; // :kludge: sum of li widths doesn't equate to a single ul line  (:idea: pass true to outerWidth)
		});
   };

   Zutti.modules.add(initialise);

	return {};
}());

/* Zutti Styled Modal Pop-Up */
Zutti.modal_window = (function () {
   var obj_jquery_tools,
   str_overlay_div = '#overlay',
   str_content_id = '',
   hide = function () {
      $(str_overlay_div).hide();
   },
   obj_expose = {
      color: '#999',
      loadSpeed: 'fast',
      closeSpeed: 'fast',
      onBeforeClose: hide
   },
   initialise = function() {
      obj_jquery_tools = $(str_overlay_div).expose(obj_expose);
      $('a.modal_window').click(render);
      $('.close img').click(close);
   },
   render = function () {
      if (str_content_id.length == 0) {
         str_content_id = $(this).attr('id') + '_content';
      }
      $(str_overlay_div + ' .header .inner').empty();
      $(str_overlay_div + ' .body .inner').empty();
      if ($('#' + str_content_id).size() > 0) {
         obj_container_clone = $('#' + str_content_id).clone();
         // Need to update all DOM id's to be unique (we simply suffix with '_real' for now)
         $('*', obj_container_clone).each(function () {
            if ($(this).attr('id').length > 0) {
               $(this).attr('id', $(this).attr('id') + '_real');
            }
         })
         obj_container_clone.prependTo(str_overlay_div + ' .body .inner');
         $(str_overlay_div + ' .body .inner').children().each(function() {
            $(this).show();
         });
      }
      $(str_overlay_div + ' .body .inner > div > h3:first').appendTo(str_overlay_div + ' .header .inner');
      var int_top = $(window).scrollTop() + (($(window).height() - $(str_overlay_div).outerHeight()) / 2);
      var int_left = $(window).scrollLeft() + (($(window).width() - $(str_overlay_div).outerWidth()) / 2);
      $(str_overlay_div).css('top', int_top).css('left', int_left);
      obj_jquery_tools.expose().load();
      $(str_overlay_div).show();
      str_content_id = '';
      return false;
   },
   close = function () {
      obj_jquery_tools.expose().close();
   };

   Zutti.modules.add(initialise);

   var obj_public = {
	   show: function(str_new_content_id) {
	      str_content_id = str_new_content_id;
	      render();
		},
		hide: function() {
		   close();
		}
   }

	return obj_public;
}());

Zutti.checkout = (function () {
   var int_selected_delivery_address_id,
   obj_next_function,
   initialise = function () {
      if ($('#checkout_delivery_form').size() > 0) {
         init_delivery();
      }
      if ($('#checkout_payment_form').size() > 0) {
         init_payment();
      }
   },
   init_delivery = function () {
      int_selected_delivery_address_id = $('#int_delivery_address_id').val();
      $('#delivery_addresss_id_' + int_selected_delivery_address_id).get(0).checked = true;

      $('#delivery_addresses INPUT.delivery_address_id').click(function () {
         int_selected_delivery_address_id = $(this).val();
         $('#int_delivery_address_id').val(int_selected_delivery_address_id);
      });

      obj_next_function = function () {
         if (int_selected_delivery_address_id == '' || int_selected_delivery_address_id < 1) {
            Zutti.modal_window.show('checkout_no_delivery_address_selected_content');
            return false;
         }
         $('#checkout_delivery_form').submit();
      };
   },
   init_payment = function () {
      obj_next_function = function () {
         $('#checkout_payment_form').submit();
      };
   };

   Zutti.modules.add(initialise);

   var obj_public = {
      next: function () {
         obj_next_function();
      },
      new_delivery_address: function () {
         Zutti.modal_window.show('checkout_enter_new_delivery_address_content');
      },
      submit_new_delivery_address: function () {
         AjaxHandler.reset();
         AjaxHandler.process_form($('#checkout_add_new_delivery_address_form_real'));

         AjaxHandler.dispatch(function(obj_response) {
            int_new_delivery_address_id = parseInt($('int_delivery_address_id', obj_response).text());
            str_delivery_address = $('str_delivery_address', obj_response).text();

            obj_new_delivery_address_row = $('#delivery_address_template').clone();
            obj_new_delivery_address_radio = $('INPUT', obj_new_delivery_address_row);
            obj_new_delivery_address_radio.attr('id', obj_new_delivery_address_radio.attr('id') + int_new_delivery_address_id);
            obj_new_delivery_address_radio.val(int_new_delivery_address_id);

            obj_new_delivery_address_radio.click(function () {
               int_selected_delivery_address_id = int_new_delivery_address_id;
               $('#int_delivery_address_id').val(int_new_delivery_address_id);
            });

            obj_new_delivery_address_row.append(str_delivery_address);
            obj_new_delivery_address_row.appendTo($('#delivery_addresses'));
            obj_new_delivery_address_row.show();
            obj_new_delivery_address_radio.click();
            Zutti.modal_window.hide();
         }, function(obj_response) {
            alert($('message', obj_response).text());
         });
      }
   };

   return obj_public;
}());

/* Miscellaneous helper functions */
Zutti.misc = (function () {
   var str_search_text_id = '#quick_search_text',
   str_email_signup_id = '#emc_subscribe_email',
   str_default_email_signup_text = '',
   str_default_search_text = '',
   frm_quick_search = '#quick_search',
   web_login_mode = 'login',

   initialise = function () {
      str_default_email_signup_text = $(str_email_signup_id).val();
      str_default_search_text = $(str_search_text_id).val();

      $(str_search_text_id).focus(search_focus);
      $('#quick_search_sales_audience_select').change(function () {
         var obj_dom_select = $(this).get(0);
         $('#quick_search_sales_audience').val(obj_dom_select.options[obj_dom_select.selectedIndex].value);
      });
      
 

      $(str_email_signup_id).focus(email_signup_focus);
      $(str_search_text_id).blur(search_blur);
      $(str_email_signup_id).blur(email_signup_blur);

      $(frm_quick_search).submit(search_submit);

      if ($('#web_login_form').size() > 0) {
         $('#int_action_type_id-1').click(function () {
            web_login_mode = 'registration';
            $('#str_password').prev('.label').hide();
            $('#str_password').next('UL.errors').hide();
            $('#str_password').hide();
            $('#web_login_form').attr('action', '/registration');
         });
         $('#int_action_type_id-2').click(function () {
            web_login_mode = 'login';
            $('#str_password').prev('.label').show();
            $('#str_password').next('UL.errors').show();
            $('#str_password').show();
            $('#web_login_form').attr('action', '/login');
         });
      }

      $('#inventory_filter #brand_filter').change(function(){
         $('#inventory_filter #size_filter').val(-1);
         $('#inventory_filter').submit();
      });

      $('#inventory_filter #filter_group_m').change(function(){
         //$('#inventory_filter #size_filter').val(-1);
         $('#inventory_filter').submit();
      });

      $('#inventory_filter #style_filter').change(function(){
         $('#inventory_filter').submit();
      });

      $('#inventory_filter #size_filter').change(function(){
         $('#inventory_filter').submit();
      });

      $('#inventory_filter #sale_items_filter').change(function(){
         $('#inventory_filter').submit();
      });

      $('#inventory_filter #department_filter').change(function(){
         $('#inventory_filter').submit();
      });

      $('#brand_info #brand_filter').change(function () {
         var obj_brand_select = $(this).get(0);
         var str_brand_name = obj_brand_select.options[obj_brand_select.selectedIndex].text;
         var str_brand_id = obj_brand_select.options[obj_brand_select.selectedIndex].value;
         window.location.href = '/' + $('#str_current_sales_audience').val() + '/brand/' + str_brand_name + '/' + str_brand_id;
      });
   },

   // clear search box text on click
   search_focus = function () {
      if(str_default_search_text === this.value) {
         this.value = '';
      }
   },

   // clear email campaigner box text on click
   email_signup_focus = function () {
      if(str_default_email_signup_text === this.value) {
         this.value = '';
      }
   },

   search_blur = function () {
      if(this.value == '') {
         this.value = str_default_search_text;
      }
   },

   email_signup_blur = function () {
      if(this.value == '') {
         this.value = str_default_email_signup_text;
      }
   };

   search_submit = function () {
      if ($('#quick_search_sales_audience').val().length == 0) {
         alert('Please select either MEN/WOMEN to search in.')
         return false;
      }

      if ($(str_search_text_id).val() == 'search') {
         return false;
      }

      str_window_location = '/' + $('#quick_search_sales_audience').val() + '/search/' + $(str_search_text_id).val();
      window.location.href = str_window_location;
      return false;
   };

   Zutti.modules.add(initialise);

   var obj_public = {
      login: function () {
         var str_login_form_id = '#login_form';
         var str_register_form_id = '#register_form';
         
         if ($(str_login_form_id).is(':visible')) {
            $(str_login_form_id + ' #login_proceed').click();
         } else if ($(str_register_form_id).is(':visible')) {
            $(str_register_form_id + ' #form_proceed').click(); 
         } else {
            window.location.href = '/registration';
         }
         
         return false;
      },
      payment: function() {
         var str_payment_form_id = '#payment_form';
         $(str_payment_form_id).submit();
      }
   };

	return obj_public;
}());

// Enhance brand filter on brand page
Zutti.brand_filter = (function() {
   var str_select = '#brand_info select',
   initialise = function() {
      $(str_select).change(change);
   },
   change = function () {
      window.location.href = $(this).val();
   };

   Zutti.modules.add(initialise);

   var obj_public = {
      val: function (str_active_url) {    
         $(str_select).val(str_active_url);
      }
   };
   
	return obj_public;
}());

// generic image hover functionality
Zutti.hovers = (function() {
   var initialise = function() {
      $('.hover_link').hover(hover_on, hover_off);
   },
   hover_on = function() {
      $('img', this).toggleClass('hidden');
   },
   hover_off = function () {
      $('img', this).toggleClass('hidden');
   };

   Zutti.modules.add(initialise);

	return {};
}());

// JQuery DOM ready,
$(document).ready(function () {
   // Run modules
   Zutti.modules.run();

   if ($('#frm_emc_subscribe').size() > 0) {
      // We have a newsletter signup form on the page
      $('#emc_subscribe_submit', $(this)).click(function () {
         // :todo: email validation
         AjaxHandler.process_form($('#frm_emc_subscribe').get(0));
         AjaxHandler.dispatch(function () {
            alert('You have successfully been signed up to the ZuttiCo Newsletter.');
         }, function() {
            alert('You could not be signed up to the ZuttiCo Newsletter at this time. Please try again.');
         });
         return false;
      });
   }

   // Add to basket click
   $('.add a').click(function(){
      var str_href = $(this).attr('href');
      if(str_href.length == 0) {
         Zutti.modal_window.show('basket_add_options_content');
         $('UL.variation').css('border', '1px solid #FF0000');
         return false;
      }
   });
});
