(function(jQuery) {

    /**
     *
     * Select Continent and Country
     *
     * @param Object options An object literal containing key/value pairs to provide optional attributes.
     *
     * clObject - JSON Object with Continent and Country  definitions
     *
     *
     */


    jQuery.fn.worldwideMenu = function(options) {

        /* return if empty selection */
        if (this.length == 0) return;
        
        var defaults = {
            wwObject: worldwideMenu.world,
            mapOpacity: 0.4
        }


        /* Set options */
        var opts = jQuery.extend(defaults, options);


        /* toggle Country and Language dropdowns */
        $selectRegion = jQuery(this).find('#select_region');
        $selectCountry = jQuery(this).find('#select_country');
        $inputCountry = jQuery(this).find('#dropdown_country');
        $inputRegion = jQuery(this).find('#dropdown_region');
        $submitButton = jQuery(this).find('a.submit');

        /* Reset Input fields */
        $inputCountry.attr('value',$selectCountry.find('option:selected').attr('text'));
        $inputRegion.attr('value',$selectRegion.find('option:selected').attr('text'));

        $selectRegion.change(function() {

            $selectCountry[0].options.length = 1;
            $inputCountry.attr("value",$selectCountry.find('option').eq(0).html());

            activateSubmit()

            // return if no Region was selected
            if (opts.wwObject.continent[this.value] == undefined) return;
            
            // Add all Countries to Select Box
            jQuery.each(opts.wwObject.continent[this.value].country, function(key, value) {
                addCountry(key, value);
            });
        })

        $selectCountry.change(function() {
            activateSubmit()
        })

        jQuery(this).find(".submit").click(function() {

            addLightboxContent (opts.lightbox)
            openLightbox(opts.lightbox);
        })

        // Add all Regions to Select Box
        jQuery.each(opts.wwObject.continent, function(key, value) {
            addRegion(key, value);
        });

        // Add a single Region
        function addRegion(key, value) {
            /* add options to Region Select */
            var options = $selectRegion.attr('options');
            options[options.length] = new Option(key, key);
        }

        // Add Country depending on Region
        function addCountry(key, value) {
            /* add options to Country Select */
            var options = $selectCountry.attr('options');
            options[options.length] = new Option(key, key);
        }

        // Add the Content to the Lightbox
        function addLightboxContent(id){
            $lightbox = jQuery('#'+id)
            $lbContent = $lightbox.find('.lightboxContentWrapper');
            $lbContent.empty();

            $lbHeader = $lightbox.find('.lightboxHeader');
            var region = $selectRegion.attr("value");
            var country = $selectCountry.attr("value");
            var headline = ("<h2><span>"+opts.wwObject.worldtext +" </span><span class='arrowGreyLarge'></span><span>" +region + "</span><span class='arrowGreyLarge'></span><span>" + country +"</span></h2>");
            $lbHeader.find("h2").remove();


            var $worldwideWrapper = jQuery("<div class='worldwideWrapper'></div>");

            // at least one select box is empty
            if ( region == 0 || country == 0) {
                var emptySelect = "<p>"+opts.wwObject.empty_selection_text+"</p>";
                $worldwideWrapper.append(emptySelect);
                $lbContent.append($worldwideWrapper);
                return;
            };

            // Add Background Image
            var $worldwideBG = jQuery("<div class='worldwideBG'></div>");
            var bgUrl;
            if (opts.wwObject.continent[region].country[country]['background_image'] != undefined){
                bgUrl = opts.wwObject.continent[region].country[country]['background_image'];
            } else {
                bgUrl = opts.wwObject.continent[region]['background_image']
            }
            $worldwideBG.css("background-image","url("+bgUrl+")")
            $lbContent.append($worldwideBG);

            $lbHeader.prepend(headline);
            $lbContent.append($worldwideWrapper);

            
            var tempAdresses = new Array();
            jQuery.each(opts.wwObject.continent[region].country[country].city, function(key, value) {
                jQuery.each(value, function(key, value){
                  //  addItem(key, value, $worldwideWrapper);
                  jQuery.each(value,function(key, value){
                   tempAdresses.push(value);
                  });
                });
            });

            $tempAdresses = jQuery(tempAdresses);
            $tempAdresses.sort(function(a, b) {
                var compA = a.head.replace('&','').toUpperCase();
                var compB = b.head.replace('&','').toUpperCase();
                return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
            });

            jQuery.each($tempAdresses, function(key, value){
               addItemSingle(key, value, $worldwideWrapper);
            });

            $worldwideBG.fadeTo(3000, opts.mapOpacity)

        }

        function addItemSingle(key, value, target){
                var $item =jQuery("<div class='item'></div>");
                var $city = jQuery("<a href=''><h3>"+ value.head+"</h3></a>");
                var $itemContent = jQuery("<div class='itemContent'></div>")
                var $text = jQuery("<p>"+ value.text+"</p>");
                 $itemContent.append($text)

                jQuery.each(value.link, function(key, value) {
                    $link = jQuery("<p><a class='arrow' href='"+ value.target+"' target=_blank>"+ value.name+"</a></p>");
                    $itemContent.append($link)
                });

                $item.append($city,$itemContent)

                $city.click(function(){

                    // check if element already selected
                    $itemSelected = target.find(".selected");
                    if (jQuery(this).parent().html() != $itemSelected.html()){
                        hideItem($itemSelected, jQuery(this));
                    }
                    showItem(jQuery(this));
                    return false;
                });

                target.append($item);
        }

        function addItem(key, value, target){

            jQuery.each(value, function(key, value) {
                var $item =jQuery("<div class='item'></div>");
                var $city = jQuery("<a href=''><h3>"+ value.head+"</h3></a>");
                var $itemContent = jQuery("<div class='itemContent'></div>")
                var $text = jQuery("<p>"+ value.text+"</p>");
                 $itemContent.append($text)

                jQuery.each(value.link, function(key, value) {
                    $link = jQuery("<p><a class='arrow' href='"+ value.target+"' target=_blank>"+ value.name+"</a></p>");
                    $itemContent.append($link)
                });

                $item.append($city,$itemContent)

                $city.click(function(){

                    // check if element already selected
                    $itemSelected = target.find(".selected");
                    if (jQuery(this).parent().html() != $itemSelected.html()){
                        hideItem($itemSelected, jQuery(this));
                    }
                    showItem(jQuery(this));
                    return false;
                });

                target.append($item);
            });

        }

        function hideItem(selected, toggleItem){
            selected.find('.itemContent').slideToggle();
            selected.removeClass('selected');
        }

        function showItem(toggleItem){
            toggleItem.parent().toggleClass('selected')
            toggleItem.next().slideToggle();
        }

        function activateSubmit(){
            if(($selectRegion.attr('value') !== 0) && ($selectCountry.attr('value') != 0)){
                $submitButton.addClass('activated')
            } else {
                $submitButton.removeClass('activated')
            }



        }

    }
})(jQuery);

