
var stationDetails = new Object( {
	// these information will be loaded dynamically and cached in this object 
});
(function($){
    $.fn.selectBox = function(options) {
        return this.each(function(){
            /*config loading / preset definition*/
            var entries = options && typeof(options.entries) != 'undefined' ? options.entries : "8";
            var moBgColor = options && typeof(options.moBgColor) != 'undefined' ? options.moBgColor : "#F5F7FB";
            var moFgColor = options && typeof(options.moFgColor) != 'undefined' ? options.moFgColor : "#FF9800";
            var showDetails = options && typeof(options.showDetails) != 'undefined' ? options.showDetails :false;
            var checkCBR = options && typeof(options.checkCBR) != 'undefined' ? options.checkCBR : "#etacountry";
	
            var xSelect = $(this);
            xSelect.hide();
			xSelect.wrap('<div class="select_replace" style="width:279px"></div>'); //use this as new "parent"
   		  
			//xSelect.show();
            xSelect = xSelect.parent();
            xSelect.append( '<div class="display" style="width:254px;"></div><div class="options" style="display:none;overflow:hidden;position:absolute;z-index:100;"><ul></ul></div>' );
			if(showDetails) {
				xSelect.append('<div class="stationDetails" style="display:none;"></div>')
			}
            xSelect.find( '.display' ).text( xSelect.find('option:selected').text())
            var xOptions = xSelect.find( 'div.options' );
            
	
       
			/*the multiplicatior 25 has to be set analogue to the LI line-height from CSS*/
            xOptions.css({ "height": (entries * 25 ), width: xSelect.width() });

            xSelect.click( function(e){
				//
				if( $(this).find('div.options:hidden').length )
				{
					$('div.options:visible').hide();
					
					xOptions.html(''); //empty
					xOptions.html(
						$(this).find('select').html() 
					);
					// this iframe is needed. #hack #ie6
					// xOptions.append('<!-- [if lte IE 6.5]><iframe></iframe><![endif] -->');
					// convert OPTION to LI tags

					xOptions.find('option').each(function(){
						if($(this).attr('value') != "")
						{
							$(this).replaceWith(
								'<li ccode="' + $(this).attr('value') + '" fc="'+ ($(this).text()).toLowerCase().slice(0,1) +'">' + $(this).text() + '</li>'
							);
						} else
						{
							$(this).replaceWith("<strong>" + $(this).text() + "</strong>")
						}
						
					});

					if(showDetails) {
					// add ul for correct DOM
						xOptions.wrapInner('<ul></ul>');
					}
					// THEN convert optgroups to strongs + uls
 					xOptions.find('optgroup').each(function(){
						$(this).replaceWith(
							"<strong>" + $(this).attr('label') + "</strong>" + 
							'<ul>' + $(this).html() + '</ul>'
						)
					}); 
					
					// this div is needed. #hack #ie6
					xOptions.wrapInner('<div class="ieFix" style="overflow:auto;height:'+ (entries*25)  +'px;position:relative;"></div>');
	
					/*
					 *	hide list entries that are not part of CBR-Rentals
					 */
					var dd_id = '#' + ($(this).find('select').attr('id'));
					if( dd_id  != checkCBR && dd_id.indexOf('location') > 0 && gUSCAcrossBorderAllowed == true )
					{
					
						_cbr = ( $(checkCBR).val().substr(0,2) ).toUpperCase();
											
						if( _cbr in dropOffSelectCo )
						{ // do it this way to avoid glitches by the :not(s) selector
							xOptions.find('li').hide();
							xOptions.find('li[ccode^="' + _cbr + '"]').show();
						}
					}
					
					// this iframe is needed. #hack #ie6
					if ( $.browser.msie &&  $.browser.version < 7 ) {
						xOptions.append('<iframe></iframe>');
					}
					
					xOptions.show();
					/* mark active entry and scroll to it */
					xFindNode = xOptions.find('li:contains(' + xSelect.find('.display').text()+ ')')
					xOptions.find('div').scrollTop(0)
					off = xFindNode.offset();
					if ( off.top != 0 ){
						xTop = xOptions.find('div').offset();
	                    	xOptions.find('div').scrollTop(  off.top - xTop.top );
					}
					xFindNode.css({
						backgroundColor: moBgColor,
						color: moFgColor
					});
					
					$.fn.selectBox.openOptions(e);
					
				} else
				{
					xOptions.hide();
				}

				/* */
				
				$(this).find('div.options:visible li').mouseover(function(){
					$(this).siblings().trigger('mouseout')
					$(this).css({ backgroundColor:moBgColor, color:moFgColor })
					
					/*show details-div*/
					xStationDetails = $(this).parents('div.select_replace').find('div.stationDetails')
					
					xStationDetails.css({
						display: 'block',
						position: "absolute",
						width: xOptions.width(),
						backgroundColor:'#fff',
						'float':'right',
						marginLeft: ( xOptions.width() ),
						zIndex:1000
					});
					
					xStationDetails.html( 
						stationDetails[$(this).attr('ccode')]
					)
				});
				$(this).find('div.options li').mouseout(function(){
					$(this).css({ backgroundColor:"", color:"" })
					$(this).parents('div.select_replace').find('div.stationDetails').hide()
					
				});

				$(this).parents().find( 'div.options li' ).mousedown(function(){
					var xText = $(this).text();
					var xVal = $(this).attr('ccode');
					$(this).parents('div').prev('div.display:eq(0)').text( xText );
					
//					$(this).parents('div').prevAll('select').val(xVal).trigger('change');

					$(this).parents('div.select_replace').find('select option[value="'+xVal+'"]').attr("selected", "selected");
					
					$(this).parents('div.select_replace').find('select').val(xVal).trigger('change');
					
					// check for CBR-Countries
					if( xVal in dropOffSelectCo )
					{
						$('#ettcountry_ro').show();
						$('#ettcountry_ro a').trigger('click');
					}
					$(this).parents('div.select_replace').find('div.stationDetails').hide()
					$('div.options:visible').hide();
				});
            });

           
        });
	};
    
	$.fn.selectBox.createDropDowns = function(_select)
	{
		
	}
	$.fn.selectBox.scrollToEntry = function()
	{
	}
    
	$.fn.selectBox.openOptions = function(e)
	{
		$.fn.selectBox.bindKeys();
		$(document).mouseup(close)
		 
	}
	
	$.fn.selectBox.closeOptions = function()
	{
		$(document).unbind('keydown');
	}

	$.fn.selectBox.closeDetails = function()
	{
	}
	
	$.fn.selectBox.bindKeys = function(e){
	
		$(document).keydown(function(e){
			/*
			 *	The keydown-event needs to be unbound before binding it to avoid double 
			 *	bindings of the same event which causes strange behaviours on keysearching
			 *	the entries of the options.
			*/
			
			var xOptions = $('div.options:visible');

				
			if( !xOptions.length ){
				return;
			}
			var xUl = xOptions.find( 'ul' )
			var xFirst = xUl.firstChild;
			var xLast = xUl.lastChild;
			
			var evtobj = window.event ? event : e //distinguish between IE's explicit event object (window.event) and Firefox's implicit.
			var key = evtobj.charCode ? evtobj.charCode : evtobj.keyCode;
		
			if( key >= 48 && key <= 122 ) // is a alphabetical character
			{
				var a=String.fromCharCode(key).toLowerCase();
//				try{console.log(key + "|" + a)}catch(e){}
				xFindNode = $('div.options:visible li[fc=' + a + ']:first');

				xFindNode.trigger('mouseover').siblings().trigger('mouseout');
				xOptions.scrollTop(0);
				xOptions.find('div').scrollTop(0)
				var xo = xFindNode.offset();
//				try{console.log("xo.top: " + xo.top)}catch(e){}
//				try{console.log("xTop.top: " + xTop.top)}catch(e){}
				
				xOptions.find('div').scrollTop(  (xo.top) - xTop.top );
				
			/*	
				if ((xo.top - xTop.top) >= 200  )
					xOptions.find('div').scrollTop(  (xo.top) - xTop.top );
				if ((xo.top) <= -200  )
					xOptions.find('div').scrollTop(  (-1)*( (xo.top) + xTop.top ));
			*/
			}
			else
			{
				e.preventDefault();
				return false;
			}
		});
	
	}
    
	var close = function(e){
		elem = $(safeReturnElement(e)).attr('class');
		if (	
			elem == "ieFix" || 
			elem == "select_replace" ||
			elem == "display"	)
		{ return; }
		
		var xOptions = $('.options:visible');
		if( xOptions.length || (e.type == "keyup" && e.keyCode != 27 ) ){
			$('.stationDetails').hide();
			xOptions.hide();
			return;
		} 
		$('.stationDetails').hide();
	}
    
})(jQuery);


function safeReturnElement(e) {
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		
	return targ;
}