/*
 * 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 
 *  - Selectboxes can now be refreshed by AJAX, to update the list just recall the initial function   @Cedric Michaux
 *  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
 *  
 *  
 *  Modified by Cedric Michaux for Sanitec
 */



(function ($) {

    var zIndexBase = 1000;

    jQuery.fn.extend({
        selectbox: function (options) {
            return this.each(function () {
                new jQuery.SelectBox(this, options);
            });
        }
    });


    jQuery.SelectBox = function (selectobj, options) {
        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.mainContainerClass = opt.mainContainerClass || "selectbox-container";
        opt.debug = opt.debug || false;

        var active = -1;
        var inFocus = false;
        var hasfocus = 0;


        if ($(selectobj).parents("." + opt.mainContainerClass).length != 0) {
            var elm_id = selectobj.id;
            var $mainContainer = $(selectobj).parents("." + opt.mainContainerClass)
            var $container = $mainContainer.find("." + opt.containerClass)
            var $select = $(selectobj)
            var $input = $mainContainer.find("." + opt.inputClass)
            $input.unbind("blur").blur(inputBlur);
            $mainContainer.find("." + opt.containerClass).empty();
            init();
        }
        else {
            var elm_id = selectobj.id;

            $mainContainer = $(document.createElement("div"));
            $mainContainer.addClass(opt.mainContainerClass).css("zIndex", zIndexBase--);

            //jquery object for select element
            var $select = $(selectobj);
            $select.wrap($mainContainer);

            // jquery container object
            var $container = setupContainer(opt);
            //jquery input object 
            var $input = setupInput(opt);
            // hide select and append newly created elements
            $select.hide().before($input).before($container);

            init();

            $input.click(function () {
                if (!inFocus) {
                    $container.toggle();
                }
            }).focus(function () {
                if ($container.not(':visible')) {
                    inFocus = true;
                    $container.show();
                    if ($(".mosaicView").length) {
                        $(this).css("position", "relative");
                        $(this).css("left", "-10000px");
                    }
                    $container.css("z-index", "10000");
                }
            }).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 ($(".mosaicView").length) {
                    $(this).css("position", "static");
                    $(this).css("left", "0");
                }
                inputBlur();
            })
        }

        function hideMe() {
            hasfocus = 0;
            $container.hide();
            $container.css("z-index", "1");
        }

        function inputBlur() {
            if ($container.is(':visible') && hasfocus > 0) {
                if (opt.debug)
                    console.log('container visible and has focus')
            }
            else {
                hideMe();
            }
        }


        function init() {
            $container.append(getSelectOptions($input.attr('id'))).hide();
            var width = $input.css('width');
        }

        function setupContainer(options) {
            $container = $(document.createElement("div"));
            $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
            return $input;
        }

        function moveSelect(step) {
            var lis = $("li", $container);
            if (!lis) return;

            active += step;

            if (active < 0) {
                active = 0;
            } else if (active >= lis.size()) {
                active = lis.size() - 1;
            }

            lis.removeClass(opt.hoverClass);

            $(lis[active]).addClass(opt.hoverClass);
        }

        function setCurrent() {
            var li = $("li." + opt.currentClass, $container).get(0);
            var ar = ('' + li.id).split('_');
            var el = ar[ar.length - 1];
            $select.val(el);
            $select.change();
            $input.val($(li).html());
            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).html());
                    $(li).addClass(opt.currentClass);
                }
                $(li)
				.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();
				    hideMe();
				})
				.mouseover(function (event) {
				    hasfocus = 1;
				    if (opt.debug) console.log('over on : ' + this.id);
				    $(event.target, $container).addClass(opt.hoverClass);
				})
				.mouseout(function (event) {
				    hasfocus = -1;
				    if (opt.debug) console.log('out on : ' + this.id);
				    $(event.target, $container).removeClass(opt.hoverClass);
				});
                ul.appendChild(li);
            });
            return ul;
        }

    };
})(jQuery)


