/*
 * Gallery plugin for jquery
 */
jQuery.fn.gallery = function(options) {
    var size = this.size();
    if (! size) return;

    var $data = jQuery(this);
    var opt = jQuery.extend({}, jQuery.fn.gallery.defaults, options);

    // Only show pager when two or more elements are present
    if (size < 2) opt.pager_enabled = false; 

    opt["data"] = $data;
    opt["count"] = size;

    jQuery(document).ready(function() {
        var currentIndex = 0;
        opt.data.each(function() {
            opt.pager_previous_index = (currentIndex - 1) % opt.count >= 0 ?
                currentIndex - 1 :
                opt.count - 1;    
            opt.pager_next_index = (currentIndex + 1) % opt.count > 0 ?
                currentIndex + 1 :
                0;
                
            // Build and place the pager control for each element
            if (opt.pager_enabled) {
                jQuery(this).append(
                    buildPager(
                        opt.pager_previous_index, 
                        opt.pager_next_index, 
                        currentIndex));
            }

            currentIndex++;

            explicitHeight(this);
            linkImageTo(this, jQuery(this).find(opt.image_selector));
        });
        show(0);

    });

    function buildPager(previous, next, current) {
        /*
         * Build a clikable "previous element" pager control and install
         * event to hide all elements and show the previous one
         */
        $previousImg = jQuery("<img src='' title=' '>")
            .attr("title", opt.pager_previous_label)
            .attr("src", opt.pager_previous_imagePath)
            .click(function() {
                opt.data.hide();
                jQuery(opt.data[previous]).show();
            });

        /*
         * Build the pager info widget
         */
        $pager = jQuery("<span id='" + opt.pager_info_id + "'></span>")
            .html((current + 1) + opt.pager_info_text + opt.count);

        /*
         * Build a clickable "next element" pager control and install
         * event to hide all elements and show the next one
         */
        $nextImg = jQuery("<img src='' title=' ' >")
            .attr("title", opt.pager_next_label)
            .attr("src", opt.pager_next_imagePath)
            .click(function() { 
                opt.data.hide();
                jQuery(opt.data[next]).show();
            });

        // Encapsulate all pager controls into a div
        $pagerContainer = jQuery("<div class='" + opt.pager_class + "'></div>")
            .append($previousImg)
            .append($pager)
            .append($nextImg);

        return $pagerContainer;
    }

    function show(index) {
        opt.data.hide();
        jQuery(opt.data[index]).show();
    }

    function explicitHeight(obj) {
        // Explorer needs to know element height to properly render an item
        jQuery(obj).css({'height'  : jQuery(obj).height()});
    }

    function linkImageTo(obj, img) {
        // If element has any link
        if (jQuery(obj).find('a').size() > 0) {
            
            // Change pointer to feedback user of image clickability
            jQuery(obj).css({'cursor' : 'pointer'});
            var linkDetected = jQuery(obj).find('a:first').attr("href"); 

            if (linkDetected) {
                var link = jQuery("<a />").attr("href", linkDetected);
                jQuery(img).wrap(link);
            }

        }
    }

};

jQuery.fn.gallery.defaults = {
    pager_enabled           : true,
    pager_class             : "navegacio-destacat",
    pager_info_id           : "pagina-actual",
    pager_info_text         : " de ",
    pager_previous_label    : "Anterior",
    pager_previous_imagePath: "site/resources/imatges/navegacio-destacat-anterior.gif",
    pager_next_label        : "Següent",
    pager_next_imagePath    : "site/resources/imatges/navegacio-destacat-seguent.gif",
    image_selector          : "div.fotografia img"
};


