

(function($) {
    var cache = [];
    
    // Arguments are image paths relative to the current page.
    $.deco_preload_img = function() {
        var args_len = arguments.length;
        for (var i = args_len; i--;) {
            var cache_img = document.createElement('img');
            cache_img.src = arguments[i];
            cache.push(cache_img);
        }
    }
})(jQuery);


(function($) {

    
    /**
     * Simple plugin for opening links in new window.
     */
    $.fn.deco_new_window = function(options) {
        return this.each(function() {
           $(this).click(function() {
                window.open($(this).attr('href'));
                return false;
            });
        });
    };
    
    
    /**
     * Plugin for dynamic and asynchronous page loading.
     *
     */
    $.deco_ajax = (function() {
        var self = {};

        /**
         * public
         */

        self.init = function(options) {
            self.opts = $.extend({}, $.deco_ajax.defaults, options);
            self.page_data = null;
            self.$container = self.opts.page_container;
            self.$loader = $('<iframe name="page-loader" id="page-loader" class="hidden" />');
            self.base_title = $.address.title();
            self.base_page_class = self.$container.children('.p').attr('class');

            self.$container.children('.p').eq(0).addClass('active');
            $('<div></div>')
                .appendTo(self.$container)
                .addClass(self.base_page_class);

            self.$container.bind('before_load_done.deco_ajax', self.load_page);

            self.$loader.appendTo($('body'));
            self.$loader.load(self.onload);
            self.loader = window.frames['page-loader']

            $.address.change(self.onchange);
        };

        self.active_page = function() { return self.$container.children('.active'); }
        self.hidden_page = function() { return self.$container.children(':not(.active)'); }

        // Return current page id
        self.page_id = function() {
            return self.get_page_id($.address.path());
        }

        self.trigger_before_load_done = function(url) {
            self.$container.trigger('before_load_done.deco_ajax', [url]);
        }


        /**
         * private
         */

        self.get_page_id = function(url) {
            var split = url.split('/');
            
            if (split[split.length-1] == '')
                split.pop()
            return split[split.length-1];
        }

        self.onchange = function(event) {
            if (self.opts.before_load)
                self.opts.before_load(event.value);
            else
                self.before_load(event.value);
        };

        self.before_load = function(url) {
            self.trigger_before_load_done(url);
        };

        self.load_page = function(event, url) {
            if (url == '/') {
                self.loader.location.replace('/fpcontent/');
            }
            else {
                var page_id = Number(self.get_page_id(url));
                self.loader.location.replace('/pcontent/' + (isNaN(page_id) ? 0 : page_id) + '/');
            }
        };

        self.onload = function() {
            var $hpage = self.hidden_page();
            var pcontent = self.$loader.contents().find('body').html();
            var $pdata = self.$loader.contents().find('#page-data');
            var page_data = {};

            $pdata.children().each(function() {
                var $item = $(this);
                page_data[$item.attr('class')] = $item.text();
            });

            $hpage.html(pcontent);
            $hpage.removeClass().addClass(self.base_page_class + ' ' + page_data.type);

            if (page_data.title)
                $.address.title(self.base_title + self.opts.title_separator + page_data.title);
            else
                $.address.title(self.base_title);


            if (self.opts.after_load)
                self.opts.after_load(self.page_data, page_data)
            else {
                if (self.opts.before_show)
                    self.opts.before_show(self.page_data, page_data);

                self.active_page().fadeOut(self.opts.fade_speed, function() {
                    self.hidden_page().fadeIn(self.opts.fade_speed, function() {
                        if (self.opts.after_show)
                            self.opts.after_show(self.page_data, page_data)
                    }).addClass('active');
                    $(this).removeClass('active');
                });
            }

            self.page_data = page_data;
        }

        return self;
    })();

    $.deco_ajax.defaults = {
        page_container: $('#cnt'),
        title_separator: ' - ',
        before_load: null,    // called before asynchronous request is sent.
        after_load: null,     // called after page content is completely loaded, use it to override
                              // default fadeout/in animation on page change.
        before_show: null,    // called after page content is completely loaded but before it is shown.
                              // old and new page data is passed as arguments
        after_show: null,     // called after new page is shown (showing animation is complete)
        fade_speed: 'normal'  // speed for default hide/show animation
    };

    
    /**
     * Inline gallery plugin.
     *
     * Expected HTML markup:
     * <outer_element>
     *  <inner_element> [collection of photos (any structure)] </inner_element>
     * </outer_element>
     *
     * Usage: $('outer_element').deco_gallery({ ... })
     */
    $.fn.deco_gallery = function(options) {
        var opts = $.extend({}, $.fn.deco_gallery.defaults, options);
        var $thumbs = opts.thumbs;

        return this.each(function() {
            var $outer = $(this);
            var $photos = opts.photos ? $outer.children(':first').find(opts.photos)
                                      : $outer.children(':first').children();
            init();

            function init() {
                $thumbs.click(function() {
                    var index = $thumbs.index($(this));
                    show_photo(index);
                    return false;
                });

                if (opts.prev_next) setup_prevnext();
            }

            function setup_prevnext() {
                $('<div class="nav prev"><span></span></div>')
                    .appendTo($outer)
                    .hide()
                    .click(function() { show_photo(current_photo() - 1); });
                $('<div class="nav next"><span></span></div>')
                    .appendTo($outer)
                    .click(function() { show_photo(current_photo() + 1); });
            }

            function show_photo(index) {
                var $nav = $outer.children('.nav');

                if (index < 0 || index >= $photos.size())
                    return;
                if (index == current_photo())
                    return;

                var $next_photo = $photos.eq(index);

                if (opts.prev_next) {
                    if (index == 0)
                        $nav.filter('.prev').hide()
                    else
                        $nav.filter('.prev:not(:visible)').show();
                    if (index == $photos.size()-1)
                        $nav.filter('.next').hide()
                    else
                        $nav.filter('.next:not(:visible)').show();
                }

                $thumbs.removeClass('active').eq(index).addClass('active');

                $photos.filter(':visible').fadeOut(1000);
                $photos.eq(index).fadeIn(1000);
                opts.after_change($next_photo);
            }

            function current_photo() {
                return $photos.index($photos.filter(':visible'))
            }
        });
    };
    $.fn.deco_gallery.defaults = {
        photos: '',         // selector for photos if should be something else than all children
        thumbs: $(),        // jQuery collection containing thumbnails
        prev_next: true,    // prev_next functionality disabled/enabled
        after_change: function($nphoto) {} // photo after change callback
    };


    var menuitem = null;
    var menuactive = null;
    /**
     * Dropdown menu plugin
     */
    $.fn.deco_dropmenu = function(options) {
        var functions = {
            activate_page: function(id) {
                var $menu = $(this).eq(0);

                $menu
                    .find('li.active ul')
                        .stop().animate({ opacity: 0 }, 500).css('display', 'none')
                    .end().find('li.active')
                        .removeClass('active');

                if (id) {
                    var $li = $menu.find('#p-'+id);
                    $li.parentsUntil('#menu').andSelf()
                        .filter('li')
                            .addClass('active')
                        .end().filter('ul')
                            .stop().animate({ opacity: 1 }, 500).css('display', 'block');

                    menuitem = $menu.find('li.active > ul').eq(0);
                    if ($li.parentsUntil('#menu').filter('ul').length)
                        menuactive = $li;
                    else
                        menuactive = null;
                } else {
                    menuitem = null;
                    menuactive = null;
                }
                Cufon.refresh('#menu > li > a');
                if (!$.browser.msie)
                    Cufon.refresh('#menu li ul a');
            }
        };

        
        if (typeof options == "string") {
            functions[options].apply($(this).get(0), $.makeArray(arguments).slice(1));
        } else
            return setup(this);

        
        function setup(jqcollection) {
        var opts = $.extend({}, $.fn.deco_dropmenu.defaults, options);

        return jqcollection.each(function() {
            var closetimer = 0;
            var $menu = $(this);
            var $active = $();


            function init() {
                var $action_items = $menu.children('li');
                if (opts.active_stay_expanded)
                    $action_items = $action_items.not('.active');

                $menu.find('a ~ ul').prevAll('a').click(function() { return false; });
                $menu.children('li').hoverIntent({
                    over: jsddm_open,
                    out: jsddm_timer,
                    interval: opts.show_timeout
                });

                $(document).click(jsddm_close);

                $menu.find('li > a').mouseenter(function() {
                    var $li = $(this).parent();
                    $li.addClass('hover');
                    opts.item_enter.call($li.get(0));
                }).mouseleave(function() {
                    var $li = $(this).parent();
                    $li.removeClass('hover');
                    opts.item_leave.call($li.get(0));
                });
            }

            function jsddm_open() {
                jsddm_canceltimer();
                jsddm_close(true, true);

                menuitem = $(this).find('ul');
                if (menuitem.size()) {
                    $menu.trigger('opt_dropmenu.before-show', [menuitem.get(0)]);
                    menuitem.stop().css('display', 'block').animate({ opacity: 1 }, 250);
                }
            }

            function jsddm_close(fadeout, opening) {
                if (menuitem) {
                    var mitem = menuitem;
                    if (!mitem.parent().hasClass('active')) {
                        if (menuactive) {
                            menuitem = menuactive.parent();
                            menuactive.parent().stop().animate({ opacity: 1 }, 500).css('display', 'block');
                        }
                    }
                    
                    if (!opening && mitem.parent().hasClass('active')) {
                        return;
                    }

                    if (fadeout) {
                        mitem.stop().animate({ opacity: 0 }, 500, function() {
                            mitem.hide();
                            $menu.trigger('opt_dropmenu.after-hide', [mitem.get(0)]);
                        });
                    } else {
                        mitem.stop().hide();
                        $menu.trigger('opt_dropmenu.after-hide', [mitem.get(0)]);
                    }
                }
            }

            function jsddm_timer() {
                closetimer = window.setTimeout(function() { jsddm_close(true, false); }, opts.hide_timeout);
            }

            function jsddm_canceltimer() {
                if (closetimer) {
                    window.clearTimeout(closetimer);
                    closetimer = null;
                }
            }

            init();
        });
        }
    };
    $.fn.deco_dropmenu.defaults = {
        hide_timeout: 200,
        show_timeout: 35,
        active_stay_expanded: false, // menu mode in which active submenus are permanently expanded
        item_enter: function() {},
        item_leave: function() {}
    };

})(jQuery);
