;(function($){	

	// pixum, wrapped in an object
	if (typeof pixum === 'undefined') {
		var pixum = {};
	}

	// encapsulates plugin defaults
	pixum.defaults = {
		colorbox: {
			opacity: 0.6, 		// overlay opacity level (range 0 to 1)
			initialWidth: 200,	// initial width, prior to any content being loaded
			initialHeight: 140,	// initial height, prior to any content being loaded
			maxWidth: 1040		// maximum width for loaded content
		}
	};

	// core functionality available throughout the site
	pixum.core = {

		/**
		 * initialization
		 */
		initialize: function() {
			pixum.core.initializeDomElements();
			pixum.core.registerModalHandlers();
			pixum.core.registerLoginSliderHandlers();
			pixum.core.registerToCartHandler();
			pixum.core.registerMiniCartHandlers();
			pixum.core.registerInputPromptHandler();
			pixum.core.registerNewsletterRegistrationHandler();
			pixum.core.registerSearchAutocompleterHandler();
			pixum.core.registerSeoTabsHandler();
			pixum.core.registerPhoneSupportHoverHandler();
		},

		/**
		 * prevent double selections
		 */
		initializeDomElements: function() {
			$miniCart = $('#shoppingcartDiv');
			$miniCartToggle = $('#dropdownButton');
			$loginSlider = $('#loginSlotDiv');
			$phoneSupportTt = $('#phoneSupportBox');
		},

		/**
		 * register modal handlers
		 */
		registerModalHandlers: function() {
			$('body')
				.delegate('a.px-modal-inline', 'click', pixum.core.addModalInlineHandler)
				.delegate('a.px-modal-ajax', 'click', pixum.core.addModalAjaxHandler);
		},

		/**
		 * add modal inline handler
		 * href of link points to an inline element id
		 */
		addModalInlineHandler: function(e) {
			var $elem = $(this);
			if ($elem.attr('href') && $($elem.attr('href')).length > 0) {
				debug.log('element found, displaying '+$elem.attr('href')+' in modal');
				var options = {
					inline: true
				};
				$elem.colorbox($.extend({}, pixum.defaults.colorbox, options));
			} else {
				e.preventDefault();
			}
		},

		/**
		 * add modal ajax handler
		 * href of link points to an absolute url fetched by ajax
		 */
		addModalAjaxHandler: function(e) {
			var $elem = $(this);
			if ($elem.attr('href')) {
				var options = {};
				$elem.colorbox($.extend({}, pixum.defaults.colorbox, options));
				e.preventDefault();
			}
		},

		/**
		 * register login slider event handlers 
		 */
		registerLoginSliderHandlers: function() {
			$('.floating_closer', $loginSlider).live('click', pixum.core.loginSliderToggleHandler);
			$('#loginLink').click(pixum.core.loginSliderToggleHandler);
		},

		/**
		 * toggles login slider 
		 */
		loginSliderToggleHandler: function() {
			if ($loginSlider.is(':hidden') && !$miniCart.is(':hidden')) {
				$miniCartToggle.trigger('click');
			}
			$loginSlider.slideToggle();
			return false;
		},

		/**
		 * takes user to cart
		 */
		registerToCartHandler: function() {
			$('#toCartLink').click(function() {
				document.location.href = '/?act=cart'; 
			});
		},

		/**
		 * phone support hover effect
		 */
		registerPhoneSupportHoverHandler: function() {
			$('#phoneSupportLink').bind('mouseover mouseleave', function(e) {
				$phoneSupportTt.css({'visibility': e.type === 'mouseleave' ? 'hidden' : 'visible'}).stop(true, true).fadeTo(200, e.type === 'mouseleave' ? 0 : 1);
			});
		},

		/**
		 * register mini cart event handlers
		 */
		registerMiniCartHandlers: function() {
			$miniCartToggle.click(pixum.core.miniCartToggleHandler);
			$miniCart
				.find('.button.close').live('click', pixum.core.miniCartToggleHandler).end()
				.find('.button.tocart').live('click', pixum.core.miniCartToCartHandler).end()
				.find('.delproduct').live('click', pixum.core.miniCartDeleteProductHandler);
		},

		/**
		 * toggle minicart and reload by ajax when opening
		 */
		miniCartToggleHandler: function() {
			$miniCartToggle.toggleClass('dropdown_sel').toggleClass('dropdown');
			if ($miniCart.is(':hidden')) {
				$miniCart.load('/cart/cartSlot', function() { $miniCart.slideDown() });
			} else {
				$miniCart.slideUp();
			}
		},

		/**
		 * go to cart
		 */
		miniCartToCartHandler: function() {
			document.location.href = '/?act=cart';
		},

		/**
		 * ajax request to delete product from cart and refresh minicart,
		 * updates minicart info on success
		 */
		miniCartDeleteProductHandler: function() {
			$miniCart.load('/cart/cartSlot?p_id_del='+$(this).find('img').attr('class'), function() {
				$('#cart_mini_info').text($('#numberOfProducts').attr('class'));
			});
		},

		/**
		 * register inputprompt event handler
		 */
		registerInputPromptHandler: function() {
			$('input.inputprompt').live('focus blur', pixum.core.inputPromptHandler);
		},

		/**
		 * handle focus/blur on input prompts
		 */
		inputPromptHandler: function(event) {
			var $input = $(this);
			switch (event.type) {
				case 'focusin':
					$input.addClass('typing');
					if (!$input.hasClass('userinput')) {
						$input.data('default', $input.val()).val('');
					}
					break;
				case 'focusout':
					$input.removeClass('typing');
					if ($input.val().length === 0) {
						$input.val($input.data('default')).removeClass('userinput')
					} else {
						$input.addClass('userinput');
					}
					break;
			}
		},

		/**
		 * register newsletter registration event handlers
		 */
		registerNewsletterRegistrationHandler: function() {
			$('form.ajaxnlregister').live('submit', pixum.core.newsletterRegistrationHandler);
		},

		/**
		 * ajax newsletter registration
		 */
		newsletterRegistrationHandler: function() {
			var $updateElem = $('#'+$(this).find('input[type=hidden][name=update_element]').val());
			$.ajax({
				url: $(this).attr('action'),
				dataType: 'html',
				data: $(this).serialize(),
				type: 'POST',
				success: function(response) {
					$updateElem.html(response);
				}
			});
			return false;
		},

		/**
		 * autocomplete search
		 */
		registerSearchAutocompleterHandler: function() {
			$("#q_header, .service_search #q1, .service_search #q2").autocomplete({
				source: "/service/autocompleteSearch",
				minLength: 1,
				delay: 0.2
			});
		},

		/**
		 * enable seo tabs
		 */
		registerSeoTabsHandler: function() {
			$('#archiv_tabs').parent().tabs();
		}

	};

	// init on document ready
	$(pixum.core.initialize);

})(jQuery);
