// variables
var saveReplacementObj = new Object();
var alphaArray = new Array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','num');

jQuery.expr[':'].startswith = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) == 0;
};

$.fn.banner = function(options) {
	return this.each(function() {
		
		var self = $(this);
		var opts = $.extend(true, {}, $.fn.banner.defaults, options);

		$('.prev_arrow', self).click(function(event) {
			if (self.hasClass('banner-working')) {
				event.stopImmediatePropagation();
				return false;
			}
			self.addClass('banner-working');
			self.unbind('mouseover');
			self.scrollable().stop();
		});
		
		$('.next_arrow', self).click(function(event) {
			if (self.hasClass('banner-working')) {
				event.stopImmediatePropagation();
				return false;
			}
			self.addClass('banner-working');
			self.unbind('mouseover');
			self.scrollable().stop();
		});


		self.scrollable(opts).circular().autoscroll({steps:opts.size,interval:opts.interval, autoplay: true});

		self.mouseover(function() {
			self.scrollable().pause();
		});
	});
};

$.fn.banner.defaults = {
	size: 1,
	interval: 5000,
	items: 'ul',
	item: 'li',
	prevPage: '.prev_arrow',
	nextPage: '.next_arrow',
	clickable: false,
	keyboard: false,
	onSeek: function(event, index) {
		var self = this.getRoot();
		self.removeClass('banner-working');
	}
};

$(document).ready(function() {
	fieldTextReplace();
	$('#btn_mailing_list_signup').click(function() {
		ajaxNewsletterSignubeap();
	});
	
	searchChecklist({
		btn:'search_btn_licenses', 
		container:'search_checkbox_licenses', 
		btn_none:'search_btn_categories', 
		container_none:'search_checkbox_categories'
	});
	searchChecklist({
		btn:'search_btn_categories', 
		container:'search_checkbox_categories', 
		btn_none:'search_btn_licenses', 
		container_none:'search_checkbox_licenses'
	});
	// search licenses
	$('#form_sidebar_license .btn_apply').click(function(ev) {
		$('#form_sidebar_license').submit();
		ev.stopPropagation();
	});
	
	// external links
	$('a[rel=external]').attr('target', '_blank').removeAttr('rel');
	
	// handle product detail page cart save
	$('.details_content #form').submit(function(ev) {
		var $this = $(this);
		var action = $this.attr('action');
		action = action.replace('checkout/cart/save', 'ajax/add_to_cart');
    $this.trigger('will-submit');
		$.ajax({
			url: action,
			type: 'POST',
			data: $this.serialize(),
			dataType: 'html',
			success: function(data, status, xhr) {
				$('#messages').html(data);
				var $feedback = $('#messages').find('.feedback');
				setTimeout(function() {
					$feedback.fadeOut();
				}, 4000);
				// $this.find('input.item_quantity').val('');
				// reload header login form
				var url = $('#header_login_form').attr('action');
				url = url.replace('account/login', 'ajax/login');
				$('#header_account').load(url);
        $this.trigger('did-submit');
			}
		});
		return false;
	});
	
	// handle login form
	function header_login_form_events() {
		// handle click event of account tab
		$('#account_tab_login').click(function() {
			$('#header_login_container').toggle().find('input:first').focus();
			return false;
		});
		// handle click event of header login container
		$('#header_login_container').click(function(ev) {
			ev.stopPropagation();
		});
		// handle keypress event for login password
		$('#header_login_password, #header_login_email').keydown(function(ev) {
			// esc
			if (ev.which == 27) {
				$('#header_login_container').hide();
			}
			// enter
			if (ev.which == 13) {
				$('#header_login_form').submit();
			}
		});
		// ajax login
		$('#header_login_form').submit(function() {
			// get the action url
			var action = $(this).attr('action');
			action = action.replace('account/login', 'ajax/login');
			
			$.ajax({
				url: action,
				type: 'POST',
				data: {
					email: $('#header_login_email').val(),
					password: $('#header_login_password').val()
				},
				dataType: 'html',
				success: function(data, status, xhr) {
					$('#header_account').html(data);
					header_login_form_events();
				}
			});
			// stop event propagation
			return false;
		});

		// check if should open the container
		$('#header_login_container.db').show();
	}
	
	header_login_form_events();
	
	// the client requests to use the search field(s) as the first responder,
	// and clear the search field when the page is loaded
	$('#sidebar_search').focus().val('');
	$('#search_page_search_field').focus().val('');
	
	// IE support for menus
	$('#nav div').mouseenter(function() {
		$(this).children('ul.menu').addClass('menu_hover');
	}).mouseleave(function() {
		$(this).children('ul.menu').removeClass('menu_hover');
	});
	
	// JavaScript for category dropdown box checkboxes
	$('.search_checkbox_categories, .show_hide').each(function() {
		$(this).find('.filter a').click(function() {
			var self = $(this);
			var rel = self.attr('rel');
			$(rel).show().addClass('selected').siblings('.category_page').hide().removeClass('selected');
			self.addClass('selected').parent().siblings().find('a').removeClass('selected');
			return false;
		}).first().click();
	});

	// category pages must be sorted correctly
	$('.search_checkbox_categories .category_page').each(function() {
		var self = $(this);
		var items = self.find('.category_item');
		var order = new Array();
		
		function height(e) {
			return $(e).find('input[type=checkbox]').size();
		}
		
		// assign numbers
		items.each(function() {
			order.push($(this).clone(true));
		});
		
		// sort the items
		for (var first = 0; first < order.length - 1; first ++) {
			for (var second = first+1; second < order.length; second ++) {
				if (height(order[first]) < height(order[second])) {
					var t = order[first];
					order[first] = order[second];
					order[second] = t;
				}
			}
		}
		
		// re-append all items
		items.remove();
		$.each(order, function(index, element) {
			self.append(element);
		});
	});
	
	// clicking at a checkbox must behave correctly
	$('.search_checkbox_categories .category_page input[type=checkbox]').each(function() {
		var self = $(this);
		
		function disable_parent() {
			var self = $(this);
			self.parents('ul').first().each(function() {
				var checkbox = $(this).siblings('input[type=checkbox]');
				if ($(this).find('input[type=checkbox]:checked').size() !=
					$(this).find('input[type=checkbox]').size() &&
					checkbox.is(':checked')
				) {
					checkbox.attr('checked', '');
					disable_parent.apply(checkbox);
				}
			});
		}
		
		function disable_children() {
			var self = $(this);
			self.siblings('ul').find('input[type=checkbox]').attr('checked', '');
		}
		
		function enable_parent() {
			var self = $(this);
			self.parents('ul').first().each(function() {
				var checkbox = $(this).siblings('input[type=checkbox]');
				if ($(this).find('input[type=checkbox]:checked').size() ==
					$(this).find('input[type=checkbox]').size() &&
					checkbox.is(':not(:checked)')
				) {
					checkbox.attr('checked', 'checked');
					enable_parent.apply(checkbox);
				}
			});
		}
		
		function enable_children() {
			var self = $(this);
			self.siblings('ul').find('input[type=checkbox]').attr('checked', 'checked');
		}
		
		self.click(function() {
			if (self.is(':checked')) {
				enable_parent.apply(this);
        enable_children.apply(this);
			}
			else {
				disable_parent.apply(this);
				disable_children.apply(this);
			}
		});
	});

	$('.sort_license').one('mouseenter', function() {
		var self = $(this);
		var _semaphore = 0;
		
		$(document).keydown(function(event) {
			if (!self.data('enabled')) {
				return;
			}
			
			var keyword = self.data('keyword');
			var selected = self.data('selected') || self.find('li').first();
			var meta_key = false;
			var normal_key = false;
			
			// we need to use semaphore to track the last keyword
			if (_semaphore == 0) {
				keyword = '';
			}
			
			_semaphore ++;
			// console.log ('semphore up ' + _semaphore);
			
			// check the keycode
			if (event.which == 13 && selected) { // ENTER
				window.location.href = selected.find('a').attr('href');
			}
			else if (event.which == 32) { // SPACE
				if (keyword.substr(-1) != ' ') {
					keyword = keyword + ' ';
				}
				meta_key = true;
				normal_key = true;
			}
			else if (
				event.which >= 48 && event.which < 58 || // 0 -- 9
				event.which >= 65 && event.which < 91 || // A -- Z
				event.which >= 97 && event.which < 123) { // a -- z
				keyword = keyword + String.fromCharCode(event.which);
				normal_key = true;
			}
			else if (event.which == 38 ) { // UP
				if (selected.prev('li').size() > 0) {
					selected = selected.prev('li');
				}
				meta_key = true;
			}
			else if (event.which == 40 ) { // DOWN
				if (selected.next('li').size() > 0) {
					selected = selected.next('li');
				}
				meta_key = true;
			}
			else if (event.which == 35) { // END
				selected = selected.nextAll('li').last();
				meta_key = true;
			}
			else if (event.which == 36) { // HOME
				selected = selected.prevAll('li').last();
				meta_key = true;
			}
			else if (event.which == 33) { // PAGE UP
				for (var index = 0; index < 20; index ++) {
					if (selected.prev('li').size() > 0) {
						selected = selected.prev('li');
					}
				}
				meta_key = true;
			}
			else if (event.which == 34) { // PAGE DOWN
				for (var index = 0; index < 20; index ++) {
					if (selected.next('li').size() > 0) {
						selected = selected.next('li');
					}
				}
				meta_key = true;
			}
			else if (event.keyCode == 27) { // ESC
				keyword = '';
				selected.removeClass('selected');
				selected = null;
				meta_key = true;
			}
			else if (event.keyCode == 8) { // BACKSPACE
				keyword = keyword.substr(0, keyword.length - 1);
				meta_key = true;
			}
			
			if (!normal_key) {
				keyword = '';
			}

			if (keyword != '') {
				var found = self.find('.license_container').find('a').not(':first');
				var keys = keyword.split(' ');
				$.each(keys, function(index, element) {
					if (element == '') {
						return;
					}
					found = found.filter(':startswith(' + element + ')');
				});
				if (found.size() > 0) {
					found = found.first();
					var selected = found.parent();
				}
			}
			
			if (selected && selected.size() > 0) {
				selected.addClass('selected').siblings().removeClass('selected');
				var top = self.find('.license_container').scrollTop() - self.offset().top;
				var height = self.find('.license_container').height();
				self.find('.license_container').scrollTop(selected.offset().top + top - height / 2);
			}
			// console.log(keyword);
			// console.log(event);

			self.data('keyword', keyword);
			self.data('selected', selected);
			
			setTimeout(function() {
				_semaphore --;
				// console.log ('semphore down ' + _semaphore);
			}, 1000);
			
			return !meta_key;
		});
	}).mouseenter(function() {
		var self = $(this);
		$('#sidebar_search').blur();
		$(document).focus();
		self.data('keyword', '');
		self.data('selected', null);
		self.data('enabled', true);
	})
	.mouseleave(function() {
		var self = $(this);
		self.data('keyword', '');
		self.data('selected', null);
		self.data('enabled', false);
		self.find('li').removeClass('selected');
		// $(document).unbind('keydown');
	});
	
	$('.product_item').click(function() {
		window.location.href = $('a.image', this).attr('href');
	});
	
});

function submitForm(id)
{
	$('#'+id).submit();
}


function close_all() {
	$('#search_checkbox_licenses, #search_checkbox_categories, #search_checkbox_licenses_page, #search_checkbox_categories_page').addClass('dn');
	$('#search_btn_licenses_page, #search_btn_categories_page, #search_btn_licenses, #search_btn_categories')
		.css('background-position', 'top left')
		.find('span').css('background-position', 'top right');
}

function searchChecklist(params)
{
	var btn 			= '#'+params.btn;
	var container 		= '#'+params.container;
	var btn_none 		= '#'+params.btn_none;
	var container_none 	= '#'+params.container_none;
	
	$(btn).click(function(ev) {
		if($(container).hasClass('dn')){
			close_all();
			$(container).removeClass('dn');
			$(btn).css('background-position', '0 -27px');
			$(container_none).addClass('dn');
			$(btn_none).css('background-position', 'top left');
			// stop event propagation so parent elements won't track the click event
			ev.stopPropagation();
		}else{
			$(container).addClass('dn');
			$(btn).css('background-position', 'top left');
		}
	});
	$(container).click(function(ev) {
		// stop event propagation so parent elements won't track the click event
		ev.stopPropagation();
	});
	// when the document is clicked, close the search container
	$(document).click(function() {
		if (!$(container).hasClass('dn')) {
			$(btn).click();
		}
		$('#header_login_container').hide();
	});
	$(container+' .btn_select').click(function() {
		$(container+' input').attr({checked:'checked'});
	});
	$(container+' .btn_deselect').click(function() {
		$(container+' input').removeAttr('checked');
	});
	$('.btn_apply, .btn_close', container).click(function() {
		$(container).addClass('dn');
		$(btn).css('background-position', 'top left');
	});
}

function searchChecklistModified(params)
{
	var btn 			= '#'+params.btn;
	var container 		= '#'+params.container;
	var btn_none 		= '#'+params.btn_none;
	var container_none 	= '#'+params.container_none;
	
	$(btn).click(function(ev) {
		if($(container).hasClass('dn')){
			close_all();
			$(container).removeClass('dn');
			$(btn).css('background-position', 'left bottom');
			$(btn).find('span').css('background-position', 'right bottom');
			$(container_none).addClass('dn');
			$(btn_none).css('background-position', 'top left');
			$(btn_none).find('span').css('background-position', 'top right');
			// stop event propagation so parent elements won't track the click event
			ev.stopPropagation();
		}else{
			$(container).addClass('dn');
			$(btn).css('background-position', 'top left');
			$(btn).find('span').css('background-position', 'top right');
		}
	});
	$(container).click(function(ev) {
		// stop event propagation so parent elements won't track the click event
		ev.stopPropagation();
	});
	// when the document is clicked, close the search container
	$(document).click(function() {
		if (!$(container).hasClass('dn')) {
			$(btn).click();
		}
		$('#header_login_container').hide();
	});
	$(container+' .btn_select').click(function() {
		$(container+' input').attr({checked:'checked'});
	});
	$(container+' .btn_deselect').click(function() {
		$(container+' input').removeAttr('checked');
	});
	$('.btn_apply, .btn_close', container).click(function() {
		$(container).addClass('dn');
		$(btn).css('background-position', 'top left');
		$(btn).find('span').css('background-position', 'top right');
	});
}

function ajaxNewsletterSignup()
{
	$('#ml_loader_small').fadeIn(0).removeClass('dn');
	var params = {email_address:$('#ml_email_address').val(),action:'save'};

	var error = function (XMLHTTPRequestObj, statusText) {
		$('#ml_loader_small').addClass('dn');
		$('#signup_message').html('An error occurred');
	};
	var success = function (theData, statusText) {
		// alert(theData);
		$('#ml_loader_small').fadeOut(500,function(){
			$(this).addClass('dn');
		});
		if(theData == 'invalid'){
			$('#ml_heading').html('Please enter a valid email address');
		}else if(theData == 'exists'){
			$('#ml_heading').html('Your email address is already registered');
		}else{
			$('#ml_heading').html('Success! Thank you for joining');
			$('#ml_email_address').val(saveReplacementObj['ml_email_address']);
			fieldTextReplace();
		}
		setTimeout(function() {
			$('#ml_heading').html('Join Our Mailing List');
		}, 3000);
	};
	var url = $('#ml_base_path').val()+"ajax/mailing_list";
	$.ajax({error:error, success:success, url:url, type:"POST", data:params});
}

function fieldTextReplace()
{
	$('.jquery_text_replace').each(function(){
		var reference = $(this).attr('id');
		saveReplacementObj[reference] = null;
		$(this).focus(function(){
			if(saveReplacementObj[reference] == null){
				saveReplacementObj[reference] = $(this).val();
				$(this).val('');
			}
		});
		$(this).blur(function(){
			if(saveReplacementObj[reference] != null && $(this).val() == ''){
				$(this).val(saveReplacementObj[reference]);
				saveReplacementObj[reference] = null;
			}
		});
	});
}

function showLicense(id){
	for (var i=0; i < alphaArray.length; i++) {
		$('#license_cat_'+alphaArray[i]).addClass('dn');
	};
	$('#'+id).removeClass('dn');
}

function showLicensePage(id){
	for (var i=0; i < alphaArray.length; i++) {
		$('#license_cat_page_'+alphaArray[i]).addClass('dn');
	};
	$('#'+id).removeClass('dn');
}

function search(searchTerm, page){
	var sLicenseArray = new Array();
	var sCategoryArray = new Array();
	var searchString = '';
	
	if(searchTerm == ''){
		return false;
	}
	
	// if TRUE use the page criteria
	if(page != null && page == true){
		$('#search_checkbox_licenses_page input:checkbox:checked').each(function(i) {
			sLicenseArray.push($(this).val());
		});	
		$('#search_checkbox_categories_page input:checkbox:checked').each(function(i) {
			sCategoryArray.push($(this).val());
		});
	}else{
		$('#search_checkbox_licenses input:checkbox:checked').each(function(i) {
			sLicenseArray.push($(this).val());
		});
		$('#search_checkbox_categories input:checkbox:checked').each(function(i) {
			sCategoryArray.push($(this).val());
		});
	}
	if(sLicenseArray.length > 0){
		searchString += '/license/'+sLicenseArray.join(',');
	}
	if(sCategoryArray.length > 0){
		searchString += '/category/'+sCategoryArray.join(',');
	}
	
	window.location = 'search/'+escape(searchTerm.replace(' ', '+'))+searchString;
}
