/*

 * jQuery selectbox plugin

 *

 * Copyright (c) 2007 Sadri Sahraoui (brainfault.com)

 * Licensed under the GPL license and MIT:

 *   http://www.opensource.org/licenses/GPL-license.php
 *   http://www.opensource.org/licenses/mit-license.php

 *

 * The code is inspired from Autocomplete plugin (http://www.dyve.net/jquery/?autocomplete)

 *

 * Revision: jQueryIdjQuery

 * Version: 0.5
 * 
 * Changelog :
 *  Version 0.5 
 *  - separate css style for current selected element and hover element which solve the highlight issue 
 *  Version 0.4
 *  - Fix width when the select is in a hidden div   @Pawel Maziarz
 *  - Add a unique id for generated li to avoid conflict with other selects and empty values @Pawel Maziarz

 */

jQuery.fn.extend({
	selectbox: function(options) {
		return this.each(function() {
			new jQuery.SelectBox(this, options);
		});
	}
});



/* pawel maziarz: work around for ie logging */

if (!window.console) {
	var console = {
		log: function(msg) { 
	 }
	}
}

/* */

jQuery.SelectBox = function(selectobj, options) {
	
	var browserIE6 = false;
	if (jQuery.browser.msie && jQuery.browser.version == 6) {
  	browserIE6 = true;
	}

	if (jQuery.browser.msie && jQuery.browser.version == 7) {
  	browserIE6 = true;
	}
	
	var opt = options || {};

	opt.inputClass = opt.inputClass || "selectbox";
	opt.containerClass = opt.containerClass || "selectbox-wrapper";
	opt.hoverClass = opt.hoverClass || "current";
	opt.currentClass = opt.selectedClass || "selected";
	opt.maxElements = opt.maxElements + 1 || 5;

	//opt.debug = opt.debug || false;

	var elm_id = selectobj.id;
	var active = -1;
	var inFocus = false;
	var hasfocus = 0;
	var itemCount = selectobj.length;
	var numberItems = itemCount;
	var itemPointer = 0;
	var listElementHeight = 31;

    //alert(document.getElementById('elm_id').offsetHeight);


	//jquery object for select element
	var select = jQuery(selectobj);

	// jquery container object
	var jQuerycontainer = setupContainer(opt);

	//jquery input object 
	var jQueryinput = setupInput(opt);
	
	// hide select and append newly created elements
	select.hide().before(jQueryinput).before(jQuerycontainer);


	init();
	
	jQueryinput
	.click(function(){
    if (!inFocus) {
		  jQuerycontainer.toggle();
		}
	})

	.focus(function(){
		if (jQuerycontainer.not(':visible')) {
			inFocus = true;
			jQuerycontainer.show();
	   }
	})

	.keydown(function(event) {	   
		switch(event.keyCode) {
			case 38: // up
				event.preventDefault();
				moveSelect(-1);
				break;
			case 40: // down
				event.preventDefault();
				moveSelect(1);
				break;
			//case 9:  // tab 
			case 13: // return
				event.preventDefault(); // seems not working in mac !
				jQuery('li.'+opt.hoverClass).trigger('click');
				break;
			case 27: //escape
			  hideMe();
			  break;
		}
	})

	.blur(function() {
		if (jQuerycontainer.is(':visible') && hasfocus > 0 ) {

		} else {
				hideMe();			
		}
	});
	
	function actionNext(){
		if((numberItems - itemPointer) >= 	opt.maxElements) {
			var oldValue =  parseInt(jQuery("#"+jQuerycontainer.attr('id') +" ul").css('top'));
			var newValue = oldValue - listElementHeight;
			jQuery("#"+jQuerycontainer.attr('id') +" ul").css('top', newValue +'px');
			itemPointer++;
			setupSelectbox();
		}
	}
	
	function actionPrev(){
		if (itemPointer > 0){
			itemPointer--;
			var oldValue =  parseInt(jQuery("#"+jQuerycontainer.attr('id') +" ul").css('top'));
			var newValue = oldValue + listElementHeight;
			jQuery("#"+jQuerycontainer.attr('id') +" ul").css('top', newValue +'px');
			setupSelectbox();
		}
	}
	
	function scrollItems(){
		var ul = document.createElement('ul');
	}
	
	function setupSelectbox(){
		if(itemPointer == 0)
			jQuery(".scrolltop").addClass('hide');
		else
			jQuery(".scrolltop").removeClass('hide');

		if((numberItems -  (opt.maxElements -1)) - itemPointer == 0)
			jQuery(".scrollbottom").addClass('hide');
		else
			jQuery(".scrollbottom").removeClass('hide');
	}

	function hideMe() {
		if(select)
		select.trigger('change');
		hasfocus = 0;
		jQuerycontainer.hide();
	}

	function init() {
		jQuerycontainer.append(getSelectOptions(jQueryinput.attr('id'))).hide();
		if(itemCount > opt.maxElements && !browserIE6){
			jQuerycontainer.height(opt.maxElements*listElementHeight);
			setScroll();
		}
		
		select.bind('change', function() {
			var selectedText = jQuery('#' + elm_id + ' option:selected').text();
			var inputText = jQueryinput.val();
			if(selectedText != inputText) {
				getSelectOptions(select);				
			}
		});
   }

	function setupContainer(options) {
		var container = document.createElement("div");
		jQuerycontainer = jQuery(container);
		jQuerycontainer.attr('id', elm_id+'_container');
		jQuerycontainer.addClass(options.containerClass);
		return jQuerycontainer;
	}

	function setupInput(options) {
		var input = document.createElement("input");
		var jQueryinput = jQuery(input);
		jQueryinput.attr("id", elm_id+"_input");
		jQueryinput.attr("type", "text");
		jQueryinput.addClass(options.inputClass);
		jQueryinput.attr("autocomplete", "off");
		jQueryinput.attr("readonly", "readonly");
		jQueryinput.attr("tabIndex", select.attr("tabindex"));
		return jQueryinput;	
	}

	function moveSelect(step) {
		var lis = jQuery("li", jQuerycontainer);
		if (!lis) return;
		active += step;
		if (active < 0) {
			active = 0;
		} else if (active >= lis.size()) {
			active = lis.size() - 1;
		}
		lis.removeClass(opt.hoverClass);
		jQuery(lis[active]).addClass(opt.hoverClass);
	}

	function setCurrent() {	
		var li = jQuery("li."+opt.currentClass, jQuerycontainer).get(0);
		var ar = (''+li.id).split('_');
		var el = ar[ar.length-1];
		select.val(el);
		jQueryinput.val(jQuery(li).html());
		return true;
	}

	// select value
	function getCurrentSelected() {
		return select.val();
	}

	// input value
	function getCurrentValue() {
		return jQueryinput.val();
	}

	function getSelectOptions(parentid) {
		var select_options = new Array();
		var ul = document.createElement('ul');
		ul.setAttribute('style', 'top:0;');


		select.children('option').each(function() {
			var li = document.createElement('li');
			li.setAttribute('id', parentid + '_' + jQuery(this).val());
			
			// set link if value is set and has "url:" prefix
			if(	jQuery(this).attr('value') != undefined && 
				jQuery(this).attr('value').length > 4 &&
				jQuery(this).attr('value').substring(0,4) == "url:") {
				li.innerHTML = '<a href="'+jQuery(this).attr('value').substring(4)+'" class="styledDropDownLink">'+jQuery(this).html()+"</a>";
				//li.innerHTML = "test";
			}
			else {
				li.innerHTML = '<a class="styledDropDownLink">' + jQuery(this).html() + '</a>';	
				//li.innerHTML = "test";
			}

			if (jQuery(this).is(':selected')) {
				jQueryinput.val(jQuery(this).html());
				jQuery(li).addClass(opt.currentClass);
			}
			ul.appendChild(li);
			jQuery(li)
			.mouseover(function(event) {
				hasfocus = 1;
				jQuery(event.target, jQuerycontainer).addClass(opt.hoverClass);
			})
			.mouseout(function(event) {
				hasfocus = -1;
				jQuery(event.target, jQuerycontainer).removeClass(opt.hoverClass);
			})
			.click(function(event) {
			  var fl = jQuery('li.'+opt.hoverClass, jQuerycontainer).get(0);
				jQuery('li.'+opt.currentClass).removeClass(opt.currentClass); 
				jQuery(this).addClass(opt.currentClass);
				setCurrent();
				hideMe();
				
				/*
				if(jQuery(this).hasClass('isLink')){
					tmpURL = jQuery(this).attr('onclick');
					self.location.href=tmpURL;
				}
				*/

			});

		});
		setupSelectbox();
		
		return ul;
	}
	
	function setScroll(){
		jQuery('#'+elm_id+'_container').prepend('<a class="scrolltop">Scroll top</a>');
		jQuery('#'+elm_id+'_container a.scrolltop')
		.mouseover(function(event) {
			hasfocus = 1;
		})
		.blur(function(event) {
			hasfocus = 1;
		})
		.click(function(event) {
			hasscrollfocus = 1;
		  actionPrev();
		});
		
	
		jQuery('#'+elm_id+'_container').append('<a class="scrollbottom">Scroll bottom</a>');
		jQuery('#'+elm_id+'_container a.scrollbottom')
		.mouseover(function(event) {
			hasfocus = 1;
		})
		.blur(function(event) {
			hasfocus = 1;
		})
		.click(function(event) {
		  actionNext();
		});
	}
};
