(function( $ ){
	
	var onCloseTabHook = null;
	
	var settings = {
		visibleItems: 16
    };
	
	var methods = {
		init : function (options) {
			if ( options ) { 
				$.extend( settings, options );
			}
			
			return this.each(function(i, el){
		    	var _this = this;
		    	var $this = $(this);
		    	var $easySearchLevel0 = $('#easySearchLevel0');
		    	$easySearchLevel0.data('defaultLabel', $easySearchLevel0.children().first().html());
		    	var $easySearchLevel1 = $('#easySearchLevel1');
		    	$easySearchLevel1.data('defaultLabel', $easySearchLevel1.children().first().html());
		    	var $easySearchLevel2 = $('#easySearchLevel2');
		    	$easySearchLevel2.data('defaultLabel', $easySearchLevel2.children().first().html());
		    	var $easySearchOptions = $('#easySearchOptions');
		    	var $easySearchItems = $('#easySearchItems');
		    	var $easySearchItemsContainer = $('#easySearchItemsContainer');
		    	var $easySearchUpArrow = $('#easySearchUpArrow');
		    	var $easySearchDownArrow = $('#easySearchDownArrow');
		    	var level = null;
		    	var records = {};
		    	var itemHeight = 0;
		    	var minY = 0;
		    	
		    	$('a', this).each(function(i, el){
		    		var _el = $(el);
		    		$(el).bind('touchstart', function(evt){_el.addClass('hover')});
					$(el).bind('touchend', function(evt){_el.removeClass('hover')});
		    	});
		    	
		    	$easySearchUpArrow.click(function(evt){evt.preventDefault(); moveList(1);})
		    	$easySearchDownArrow.click(function(evt){evt.preventDefault(); moveList(-1);})
		    	
		    	function onOptionClick (id) {
		    		switch (level) {
			    		case 0:
			    			$easySearchLevel0.data('id', id);
			    			$easySearchLevel0.children().first().html(records[id] + ' collections');
			    			changeLevel(1);
			    			break;
			    		case 1:
			    			$easySearchLevel1.data('id', id);
			    			$easySearchLevel1.children().first().html(records[id]);
			    			changeLevel(2);
			    			break;
			    		case 2:
			    			window.location.href = id;
		    		}
		    	}
		    	
		    	function moveList (dir) {
		    		var nextY = $easySearchItems.position().top + itemHeight * dir;
		    		nextY = (nextY > 0) ? 0 : nextY;
		    		nextY = (nextY < minY) ? minY : nextY;
		    		$easySearchItems.css('top', nextY);
		    	}
		    	
		    	function redrawList () {
		    		$easySearchOptions.empty();
		    		$easySearchItems.empty();
		    		var l = 0;
    				$.each(records, function(k, v) {
    					l++;
    					var li = (level < 2) ? $('<li><a href="' + k + '">' + v + '</a></li>') : $('<li><a href="' + URL_COLLECTION + '/' + k + '">' + v + '</a></li>');
    					var option = (level < 2) ? $('<option></option>').val(k).html(v) : $('<option></option>').val(URL_COLLECTION + '/' + k).html(v);
    					$easySearchOptions.append(option);
    					if (Modernizr.touch && USER_AGENT == 'IPHONE'){
    			    		$easySearchItems.bind('click', function(evt){
    			    			evt.preventDefault();
    			    			$easySearchOptions.focus();
    			    		});
    			    	} else {
    			    		if (level < 2) {
    	    					li.children().first().click(function (evt) {
    	    						evt.preventDefault();
    	    						onOptionClick(Number($(evt.target).attr('href')));
    	    					});
        					}
    			    	}
    					
    					$easySearchItems.append(li);
    				});
    				itemHeight = $easySearchItems.children('li').children('a').outerHeight();
    				var containerH = itemHeight * settings.visibleItems;
    				minY = -1 * (l * itemHeight - containerH);
    				$easySearchItemsContainer.height(containerH);
    				$easySearchItems.css('top', 0);
    				$easySearchUpArrow.css('visibility', (l > settings.visibleItems) ? 'visible' : 'hidden');
    		    	$easySearchDownArrow.css('visibility', (l > settings.visibleItems) ? 'visible' : 'hidden');
    		    	$easySearchOptions.attr('selectedIndex', '0').children("option:selected").removeAttr("selected");
		    	}
		    	
		    	function setLevel () {
		    		switch (level) {
		    			case -1:
		    				$easySearchLevel0.removeClass('easySearchActiveLevel');
		    				$easySearchLevel0.children().first().html($easySearchLevel0.data('defaultLabel'));
			    			$easySearchLevel1.css('display', 'none');
			    			$easySearchLevel2.css('display', 'none');
			    			redrawList();
		    				break;
			    		case 0:
			    			$easySearchLevel0.addClass('easySearchActiveLevel');
			    			$easySearchLevel0.children().first().html($easySearchLevel0.data('defaultLabel'));
			    			$easySearchLevel1.removeClass('easySearchActiveLevel');
			    			$easySearchLevel2.removeClass('easySearchActiveLevel');
			    			$easySearchLevel1.css('display', 'none');
			    			$easySearchLevel2.css('display', 'none');
			    			redrawList();
		    				break;
			    		case 1:
			    			$easySearchLevel0.removeClass('easySearchActiveLevel');
			    			$easySearchLevel1.addClass('easySearchActiveLevel');
			    			$easySearchLevel1.children().first().html($easySearchLevel1.data('defaultLabel'));
			    			$easySearchLevel2.removeClass('easySearchActiveLevel');
			    			$easySearchLevel1.css('display', 'block');
			    			$easySearchLevel2.css('display', 'none');
			    			redrawList();
		    				break;
			    		case 2:
			    			$easySearchLevel0.removeClass('easySearchActiveLevel');
			    			$easySearchLevel1.removeClass('easySearchActiveLevel');
			    			$easySearchLevel2.addClass('easySearchActiveLevel');
			    			$easySearchLevel2.children().first().html($easySearchLevel2.data('defaultLabel'));
			    			$easySearchLevel1.css('display', 'block');
			    			$easySearchLevel2.css('display', 'block');
			    			redrawList();
			    			break;
		    		}
		    	};
		    	
		    	function changeLevel (n) {
		    		switch (n) {
		    			case -1:
		    				level = -1;
		    				records = {};
		    				setLevel();
		    				break;
		    			case 0:
		    				$.ajax({
								url: URL_EASY_SEARCH,
								dataType: 'json',
								data: null,
								success: function (data) {
									if (data.status == STATUS_OK) {
										level = 0;
										records = jQuery.extend({}, data.response);
										setLevel();
							        }
								}
							});
		    				break;
		    			case 1:
		    				$.ajax({
								url: URL_EASY_SEARCH + '/' + $easySearchLevel0.data('id'),
								dataType: 'json',
								data: null,
								success: function (data) {
									if (data.status == STATUS_OK) {
										level = 1;
										records = jQuery.extend({}, data.response);
										setLevel();
							        }
								}
							});
		    				break;
		    			case 2:
		    				$.ajax({
								url: URL_EASY_SEARCH + '/' + $easySearchLevel0.data('id') + '/' + $easySearchLevel1.data('id'),
								dataType: 'json',
								data: null,
								success: function (data) {
									if (data.status == STATUS_OK) {
										level = 2;
										records = jQuery.extend({}, data.response);
										setLevel();
							        }
								}
							});
		    				break;
		    		}
		    	};
		    	
		    	$easySearchOptions.change(function (evt) {
		    		$('option:selected', evt.target).each(function (i, el) {
		    			onOptionClick($(el).val());
		    		});
		    	});
		    	
		    	$('a', $easySearchLevel0).click(function(evt){
		    		evt.preventDefault();
		    		changeLevel(0);
		    	});
		    	
		    	$easySearchLevel1.click(function(evt){
		    		evt.preventDefault();
		    		changeLevel(1);
		    	});
		    	
		    	onCloseTabHook = changeLevel;
		    	changeLevel(-1);
		    });
		},
		
		onCloseTab : function () {
			onCloseTabHook(-1);
		}
	}
	
	$.fn.easySearch = function( method ) {
	    if ( methods[method] ) {
	    	return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	    	return methods.init.apply( this, arguments );
	    } else {
	        $.error( 'Method ' +  method + ' does not exist on jQuery.easySearch' );
	    }
	}	
})( jQuery );
