/**
 * Created by Alexander Trefz.
 * Date: 16.08.2010
 * Time: 16:23:05
 */

(function($) {
    
    if ($.browser.msie && $.browser.version < 7) {
        // we don't care for IE6 on this fancy details.
        $.fn.fancyDropdown = function() { return document; };
        
    } else {
        
        $.fancyDropdown = {
            
            defaults: {
                speed: 400
            },

			resetDropdown: function(elem) {
				var data = elem.data();
				
				data.flyout.children().first().click();
			},
        
            openDropdown: function (elem) {
                
                var data = elem.data();
                
                data.flyout.slideDown(data.speed, function() {
                    elem.data("isShown", true);
                });
                
            },
            
            closeDropdown: function(elem) {
                
                var data = elem.data();
                
                data.flyout.slideUp(data.speed, function() {
                    elem.data("isShown", false);
                });
                
            },
            
            initDropdown: function(elem, options) {

                var dropdownChooser = $("<div/>", {
                    "class": "dropdownChooser"
                }).append(
                        $("<span/>", {
                            "class": "dropdownSpan",
                            text: elem.children(":selected").text(),
                            click: function() {
                                $(this).next().click();
                            }
                        }),
                        $("<div/>", {
                            "class": "dropdownButton",
                            click: function() {
                                
                                var dropdown = $(this).parent().parent();

                                if (dropdown.data("isShown")) {
                                    $.fancyDropdown.closeDropdown(dropdown);
                                } else {
                                    $.fancyDropdown.openDropdown(dropdown);
                                }
                            }
                        })
                        );

                // init flyout without showing it.
                var dropdownFlyout = $("<div/>", {
                    "class": "dropdownFlyout",
                    data: {"olddisplay": "block"},
                    css: {
                        display: "none"
                    }
                });

                // copy all options into the new dropdown
                elem.children("option").each(function(index, elem) {

                    dropdownFlyout.append($("<div/>", {
                        "class": "dropdownFlyoutEntry",
                        text: $.trim($(elem).text()), // trim is important for assinging the value to the original select in firefox
                        click: function() {
                            var text = $(this).text();
                            // select the right option in the orignal Select
                            $(this).parent().parent().data("originalSelect").children("option").removeAttr("selected").eq($(this).index()).attr("selected","selected");
                            // set text in Chooser
                            $(this).parent().prev().children("span").text(text);
                            // close dropdown
                            $.fancyDropdown.closeDropdown($(this).parent().parent());
                        }
                    }));

                });

                
                // dropdown data:
                // chooser:         :jQuery
                // speed:           :int
                // flyout:          :jQuery
                // isShown:         :bool
                // originalSelect:  :jQuery

                var dropdown = $("<div/>", {
                    "class": "fancyDropdown " + elem.attr("class"),
                    id: elem.attr("id") + "Dropdown",
                    data: {
                        chooser: dropdownChooser,
                        flyout: dropdownFlyout.first(),
                        speed: $.fancyDropdown.defaults.speed,
                        isShown: false,
                        originalSelect: elem
                    }
                }).append(
                    dropdownChooser,
                    dropdownFlyout
                );

                // hide original Select and append new Dropdown.
                elem.hide().before(dropdown);
                
            }
            
        };
        
        
        // enable chaining.
        $.fn.fancyDropdown = function(options) {
            
            return this.each(function() {
                
                $.fancyDropdown.initDropdown($(this), options);
                
            });
            
        };
            
        // copy original behavior: close Dropdown if focus is lost (workaround)
        $("html").click(function() {
            
            var elems = $(".fancyDropdown");
            
            elems.each(function() {
            
                if($(this).data("isShown")) {
                    $.fancyDropdown.closeDropdown($(this));
                }
                
            });
            
        });
        
    }   

})(jQuery);
