/*
* 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: $Id$
* Version: 0.6
* 
* Changelog :
*  Version 0.6
*  - Fix IE scrolling problem
*  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) {
        }
    }
}




/*
* This class has been customized to not use fancy dropdowns on mobile devices
*/


// detect iOS
var is_iOS = (BrowserDetect.OS == "iPhone/iPod" || BrowserDetect.OS == "iPad");
var is_Android = (BrowserDetect.browser == "Android");
var is_Blackberry = (BrowserDetect.OS == "BlackBerry");



// If mobile
if (is_iOS || is_Android || is_Blackberry)
{
    jQuery.SelectBox = function(selectobj, options)
    {
        selectobj.style.display = "inline";
    }
}


// if desktop
else
{

    jQuery.SelectBox = function(selectobj, options)
    {
        var opt = options || {};
        opt.inputClass = opt.inputClass || "selectbox";
        opt.containerClass = opt.containerClass || "dd_outer";
        opt.hoverClass = opt.hoverClass || "current";
        opt.currentClass = opt.selectedClass || "selected";
        opt.outerDivClass = opt.outerDivClass || "dd_left";
        opt.debug = opt.debug || false;
        var elm_id = selectobj.id;
        var active = 0;
        var inFocus = false;
        var hasfocus = 0;

        //jquery object for select element
        var $select = $(selectobj);

        // jquery container object
        var numParents = $select.parents("div").length;
        for (var i = 0; i < numParents; i++)
        {
            if ($select.parents("div:eq(" + i + ")").attr("id") == "rdm_banner")
                return true;
        }


        var $container = setupContainer(opt, elm_id);

        //jquery input object
        var $input = setupInput(opt);


        //don't render twice
        if ($('#' + elm_id + '_ddlleft').length > 0)
        {
            return;
        }


        // hide select and append newly created elements
        $select.hide().after($container).before($input);



        $input.add($container).wrapAll("<div class=\"dropdown\"></div>");
        $input.wrap("<div id='" + elm_id + "_input_div' class='dd_input'></div>");
        $input.before("<span id='" + elm_id + "_ddlleft' class='dd_left'>&nbsp;</span>");


        //    if (navigator.appName == "Microsoft Internet Explorer") 
        init();


        $input
	    .click(function()
	    {
	        if (!inFocus)
	        {
	            $container.toggle();

	        }
	    })


	    .focus(function()
	    {
	        if ($container.not(':visible'))
	        {
	            inFocus = true;
	            $container.css("display", "block");
	        }
	    })


	    .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 !
	                $('li.' + opt.hoverClass).trigger('click');
	                break;
	            case 27: //escape
	                hideMe();
	                break;
	        }
	    })


	    .blur(function()
	    {
	        if ($container.is(':visible') && hasfocus > 0)
	        {
	            if (opt.debug) console.log('container visible and has focus')
	        }
	        else
	        {
	            // Workaround for ie scroll - thanks to Bernd Matzner
	            if (($.browser.msie && getInternetExplorerVersion() <= 8) || $.browser.safari)
	            { // check for safari too - workaround for webkit
	                if (document.activeElement.getAttribute('id').indexOf('_container') == -1)
	                {
	                    hideMe();
	                }
	                else
	                {
	                    $input.focus();
	                }
	            }
	            else
	            {
	                hideMe();
	            }
	        }
	    });


        function hideMe()
        {
            hasfocus = 0;
            $container.hide();
        }


        function init()
        {
            var inner = getSelectOptions($input.attr('id'));
            $container.append(inner).hide();
        }


        function setupContainer(options, inner_id)
        {

            var container = document.createElement("div");
            $container = $(container);
            $container.attr('id', elm_id + '_container');
            $container.addClass(options.containerClass);

            return $container;
        }


        function setupInput(options)
        {
            var input = document.createElement("input");
            var $input = $(input);
            $input.attr("id", elm_id + "_input");
            $input.attr("type", "text");
            $input.addClass(options.inputClass);
            $input.attr("autocomplete", "off");
            $input.attr("readonly", "readonly");
            $input.attr("tabIndex", $select.attr("tabindex")); // "I" capital is important for ie
            /* code added */
            //$input.attr("onchange", $select.attr("onchange")); // "I" capital is important for ie


            /* code added */
            return $input;
        }


        function moveSelect(step)
        {
            var lis = $("li", $container);
            if (!lis || lis.length == 0) return false;
            active += step;
            //loop through list
            if (active < 0)
            {
                active = lis.size();
            }
            else if (active > lis.size())
            {
                active = 0;
            }
            scroll(lis, active);
            lis.removeClass(opt.hoverClass);

            $(lis[active]).addClass(opt.hoverClass);
        }


        function scroll(list, active)
        {
            var el = $(list[active]).get(0);
            var list = $container.get(0);

            if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)
            {
                list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;
            }
            else if (el.offsetTop < list.scrollTop)
            {
                list.scrollTop = el.offsetTop;
            }
        }


        function setCurrent()
        {
            var li = $("li." + opt.currentClass, $container).get(0);
            var ar = ('' + li.id).split('_');
            var el = ar[ar.length - 1];
            $select.val(el);
            $input.val($(li).text());
            /* code added */
            //eval($input.attr("onchange"));
            $input.change();
            return true;
        }


        // select value
        function getCurrentSelected()
        {
            return $select.val();
        }


        // input value
        function getCurrentValue()
        {
            return $input.val();
        }


        function getSelectOptions(parentid)
        {
            var select_options = new Array();
            var ul = document.createElement('ul');
            $select.children('option').each(function()
            {
                var li = document.createElement('li');
                li.setAttribute('id', parentid + '_' + $(this).val());
                li.innerHTML = $(this).html();
                if ($(this).is(':selected'))
                {
                    $input.val($(this).text());
                    $(li).addClass(opt.currentClass);
                }
                ul.appendChild(li);
                $(li)
			    .mouseover(function(event)
			    {
			        hasfocus = 1;
			        if (opt.debug) console.log('over on : ' + this.id);
			        jQuery(event.target, $container).addClass(opt.hoverClass);
			    })
			    .mouseout(function(event)
			    {
			        hasfocus = -1;
			        if (opt.debug) console.log('out on : ' + this.id);
			        jQuery(event.target, $container).removeClass(opt.hoverClass);
			    })
			    .click(function(event)
			    {
			        var fl = $('li.' + opt.hoverClass, $container).get(0);
			        if (opt.debug) console.log('click on :' + this.id);
			        $('li.' + opt.currentClass).removeClass(opt.currentClass);
			        $(this).addClass(opt.currentClass);
			        setCurrent();
			        $select.change();
			        //$select.get(0).blur();
			        hideMe();
			    });
            });
            return ul;
        }


        function getInternetExplorerVersion()
        {
            // Returns the version of Internet Explorer or a -1
            // (indicating the use of another browser).

            var rv = -1; // Return value assumes failure.
            if (navigator.appName == 'Microsoft Internet Explorer')
            {
                var ua = navigator.userAgent;
                var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                if (re.exec(ua) != null)
                    rv = parseFloat(RegExp.$1);
            }
            return rv;
        }


    };
}
