/*
 * jGD DropDown
 * Version 0.4 (18-SEP-2010)
 * @requires jQuery v1.3 or later
 *
 * Homepage: http://www.dev4press.com/jquery/jgd-dropdown/
 * Examples: http://www.dev4press.com/jgd/dropdown/
 * 
 * Copyright (c) 2008-2010 Milan Petrovic, Dev4Press
 *
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Thanks to Janko at Warp Speed for this great article:
 * http://www.jankoatwarpspeed.com/post/2009/07/28/reinventing-drop-down-with-css-jquery.aspx
 */

(function($){
    $.fn.jgdDropdown = function(options) {
        var settings =  $.extend({}, $.fn.jgdDropdown.defaults, options);
        return this.each(function() {
            var $this = $(this);
            var $id = $.fn.jgdDropdown.convert($this, settings);

            $("#" + $id + " dt a").click(function(e) {
            	e.preventDefault();
        		$("#" + $id + " dd ul").toggle(0,function(){
                	if ( $("#" + $id + " dd ul").is(':visible') ) {
                		$('.dropdownbox').css({zIndex:1});
                		$("#" + $id).parents('.dropdownbox').css({zIndex:1000}).removeClass('error');
                	}
                	else {
                		$("#" + $id).parents('.dropdownbox').css({zIndex:1});
                	}
                });
                return false;
            });

            $(document).bind('click', function(e) {
                var $clicked = $(e.target);
                if (!$clicked.parents().hasClass(settings.cls)) {
                    $("." + settings.cls + " dd ul").hide().parents('.dropdownbox').css({zIndex:1});;
                }
            });

            $("#" + $id + " dd ul li a").click(function(e) {
            	e.preventDefault();
                var $sel = $(this);
                var $val = $sel.find("span.value").html();
                
                if($sel.parent().hasClass('disabled')) { return false; }

                $this.val($val);
                $("#" + $id + " dt a").html($sel.html());
                $("#" + $id + " dd ul").hide();
                if (settings.clsCopySelect) {
                    $("#" + $id + " dt").attr("class", $sel.parent().attr("class"));
                }
                $sel.parent().parent().find("li").removeClass(settings.clsLISelected);
                $sel.parent().addClass(settings.clsLISelected);
                if (settings.callback) {
                    settings.callback($this, $val);
                }
                return false;
            });
        });
    };
    $.fn.jgdDropdown.defaults = {
        callback: null,
        cls: 'jgd-dropdown',
        initTitle: '',
        forceTitle: false,
        clsLIPrefix: '',
        clsLISelected: 'selected',
        clsCopySelect: true,
        clsLIExpand: true,
        selected: ''
    };
    $.fn.jgdDropdown.convert = function($obj, settings) {
        var iTitle = settings.initTitle;
        var iVal = '';
        if (settings.selected !== null && settings.selected !== '') {
            $obj.val(settings.selected);
            if (!settings.forceTitle) {
                iTitle = '';
            }
        }
        var selected = $obj.find("option[selected]");
        var options = $("option", $obj);
        var id = "jgd_dd_" + get_id($obj);
        $obj.after('<dl id="' + id + '" class="' + settings.cls + '"></dl>');
        if (iTitle === '') {
            iTitle = selected.text();
            iVal = selected.val();
            // Wenn kein Element selected ist, den Inhalt des ersten option-Tags anzeigen
            if ( iTitle === '' ) {
            	iTitle = options.eq(0).text();
            }
        }
        $("#" + id).append('<dt><a href="#">' + iTitle + '<span class="value">' + iVal +  '</span></a></dt>');
        $("#" + id).append('<dd><ul></ul></dd>');
        options.each(function(index){
            var elClass = $(this).attr("class");
            var elStyle = $(this).attr("style");
            var elUri   = $(this).attr("uri");
            var elDis   = $(this).attr("disabled");
            var elHref  = '#';

            var cls = settings.clsLIPrefix + $(this).val();
            if (settings.clsLIExpand) {
                cls += " item-" + index;
                cls += " item-" + ($.fn.jgd.isEven(index) ? "even" : "odd");
                if (index === 0) {
                    cls += " item-first";
                }
                if (index == options.length - 1) {
                    cls += " item-last";
                }
                if(elClass && elClass !== '') {
                    //cls+= " " + thisclass;
                	cls+= " " + elClass;
                }
            }
            if (settings.clsCopySelect) {
                $("#" + id + " dt").attr("class", cls);
            }
            if ($(this).val() == selected.val()) {
                cls += " " + settings.clsLISelected;
            }
            if ( !elUri ) {
            	elUri = '#';
            }
            elHref = elUri;
            
            if( elDis ){
            	cls += " disabled";
            }
            
            $("#" + id + " dd ul").append('<li class="' + cls + '"><a href="' + elUri + '">' +
                $(this).text() + '<span class="value">' + $(this).val() + '</span>' +
                '<span class="uri">' + elUri + '</span></a></li>');
            if (elStyle) {
                $("#" + id + " dd ul").find("li:last a").attr("style", elStyle);
            }
        });
        $obj.hide();
        return id;
    };
    $.fn.jgd = function() {};
    $.fn.jgd.isEven = function($num) {
        return ($num%2 === 0);
    };
    function get_id($obj) {
        var id = $obj.attr("id");
        if (id === "") {
            id = random_id();
        }
        return id;
    }
    function random_id() {
        var dt = new Date().getMilliseconds();
        var num = Math.random();
        var rnd = Math.round(num * 100000);
        return "jgd" + dt + rnd;
    }
    function debug($obj) {
        if (window.console && window.console.log) {
             window.console.log('jgd_dropdown: ' + $obj.size());
        }
    }
})(jQuery);

