/*
* jQuery select list plugin
* turns an li into a select input - writing to hidden input fields
* 
* @version  0.1
* @homepage ??
* @author   Boz Kay (http://www.boz.co.uk)
*
* Copyright (c) 2009 Boz Kay
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*/

(function($){

  $.fn.selectList = function(options){
    
    options = $.extend({
      formID: 'form',
      inputID: 'input',
      selectNumber: 1,
      hoverColor: '#686805',
      textColor: '#000000',
      preSelect: '',
      preSelectType: 'usePreSelect', // or useHiddenInput
      preSelectDisable: false,
      onSelected: function(){}
    }, options);
    
    
    var list = this;
    
    // style list
    list.addClass('selectList');
    
    if(options.selectNumber == 1) {
	    $('#'+options.formID).prepend($('<input type="hidden" />').attr('class',options.inputID).attr('name',options.inputID));
    }
    
    // make clickable
	list.children().css('cursor','pointer').hover(function() {
		$(this).css('color',options.hoverColor);
	}, function() {
		$(this).css('color',options.textColor);
	});

	list.children().click(function() {
		var allowSelect = true;
		if(options.selectNumber == 1) {
			list.children().removeClass('chosen');
		}
		if($(this).filter('.chosen').length == 1) {
			$(this).removeClass('chosen');
			listVal = $(this).attr('class');
	    	deselectLi(listVal);
			allowSelect = false;
		}
		if(list.children().filter('.chosen').length >= options.selectNumber) {
			alert('You cannot select more than '+options.selectNumber+' options');
			allowSelect = false;
		}

		if(allowSelect) {
			if($(this).filter('.chosen').length == 1) {
				alert('You already selected that one');
			} else {
				listVal = $(this).attr('class');
		    	selectLi(listVal);
		    }
		}
	});
    
    // if preselected choose options and disable if needed
	if(options.preSelectType == 'useHiddenInput') {
		if(options.selectNumber == 1) {
			val = $('#'+options.formID+' .'+options.inputID).val();
	    	$('#'+options.formID+' li.'+val).addClass('chosen');
		} else {
			$('#'+options.formID+' input.'+options.inputID).each(function() {
		    	val = $(this).val();
 		    	$('#'+options.formID+' li.'+val).addClass('chosen');
			});
		}
	} else if(options.preSelectType == 'usePreSelect') {
		if(options.preSelect) {
	    	val = $('#'+options.formID+' input.'+options.inputID).val(options.preSelect);
	    	$('#'+options.formID+' li.'+options.preSelect).addClass('chosen');
	    }
    }
	if(options.preSelectDisable == true && options.preSelect) {
		list.children().unbind();
	}
    
    function selectLi(val) {
    	$('#'+options.formID+' li.'+val).addClass('chosen');
    	if($.isFunction(options.onSelected)) {
	    	options.onSelected(val);
    	}
	    if(options.selectNumber == 1) {
	    	// single option
			$('#'+options.formID+' .'+options.inputID).val(val);
	    } else {
			// multiple options
			var alreadySet = false;
			$('#'+options.formID+' input.'+options.inputID).each(function() {
				if($(this).val() == val) {
					var alreadySet = true;
				}
			});
			if(alreadySet != true) {
				$('#'+options.formID).prepend($('<input type="hidden" />').attr('class',options.inputID).attr('name',options.inputID+'[]').val(val));
	    	}
	    }
    }

    function deselectLi(val) {
    	$('#'+options.formID+' li.'+val).removeClass('chosen');
		$('#'+options.formID+' input.'+options.inputID).each(function() {
			if($(this).val() == val) {
				$(this).remove();
			}
		});
    }
    
  };

})(jQuery);