$j = jQuery;

self.PortfolioManager = {
    aThumbs: [],
    aThumb2Index: {},
    sContextItemType: "",
    sSlug: "",
    bInProgress: false,
    iActiveIndex: 0,
    onMediaLoad: null,
    defaultMediaDesc: "",
    iSlideshowTimeout: 5000,
    iSlideshowTimeoutHandle: null,
    init: function() {
        var oSelf = self.PortfolioManager;
        // parse url
        var aUrlBits = document.location.pathname.substr(1).split("/");
        // person|institution|event|document|group
        oSelf.sContextItemType = aUrlBits[0];
        // [.., "<slug>", "portfolio", ""]
        oSelf.sSlug = aUrlBits[aUrlBits.length - 3];
        var sFilename = document.location.hash.indexOf("#file_")==0?
            document.location.hash.substr(6): "";
        // parse list of photos
        // add onclick functions to them
        $j("#dyn_portfolio").removeClass("hidden");
        var $media_thumb_links = $j("#media_thumbs a").click(oSelf.activate).map(oSelf.registerImage);
        // check the currently selected
        if (sFilename && oSelf.aThumb2Index[sFilename]==null) {
            document.location.href = document.location.pathname;
        }
        // load if # defined
        $j("#media_next").click(oSelf.activateNext);
        $j("#media_previous").click(oSelf.activatePrevious);
        $j("#media_slideshow_start").click(oSelf.startSlideshow);
        $j("#media_slideshow_stop").click(oSelf.stopSlideshow);
        
        oSelf.defaultMediaDesc = $j("#media_desc_content").html();
        
        if ($media_thumb_links.length>1) {
            self.PortfolioManager.activate(sFilename);
            oSelf.iSlideshowTimeoutHandle = setTimeout(
                oSelf.activateNextLoop,
                oSelf.iSlideshowTimeout
            );
        } else {
            $j("#media_previous,#media_next,"
                + "#media_slideshow_start,#media_slideshow_stop"
            ).addClass("hidden");
        }
    },
    destruct: function() {
        self.PortfolioManager = null;
    },
    registerImage: function() {
        var oSelf = self.PortfolioManager;
        var oLink = $j(this);
        var sFilename = oLink.attr("href").split("#")[1].substr(5);
        oSelf.aThumb2Index[sFilename] = oSelf.aThumbs.length;
        oSelf.aThumbs[oSelf.aThumbs.length] = oLink;
        return oLink;
    },
    activateNext: function() {
        var oSelf = self.PortfolioManager;
        oSelf.stopSlideshow();
        if (oSelf.iActiveIndex < oSelf.aThumbs.length - 1) {
            oSelf.aThumbs[oSelf.iActiveIndex+1].click();
        } else {
            return false;
        }
    },
    activatePrevious: function() {
        var oSelf = self.PortfolioManager;
        oSelf.stopSlideshow();
        if (oSelf.iActiveIndex > 0) {
            oSelf.aThumbs[oSelf.iActiveIndex-1].click();
        } else {
            return false;
        }
    },
    startSlideshow: function() {
        var oSelf = self.PortfolioManager;
        $j("#media_slideshow_start").addClass("hidden");
        $j("#media_slideshow_stop").removeClass("hidden");
        oSelf.activateNextLoop();
        return false;
    },
    stopSlideshow: function() {
        var oSelf = self.PortfolioManager;
        $j("#media_slideshow_start").removeClass("hidden");
        $j("#media_slideshow_stop").addClass("hidden");
        clearTimeout(oSelf.iSlideshowTimeoutHandle);
        return false;
    },
    activateNextLoop: function() {
        var oSelf = self.PortfolioManager;
        if (oSelf.iActiveIndex < oSelf.aThumbs.length - 1) {
            oSelf.aThumbs[oSelf.iActiveIndex+1].click();
        } else {
            oSelf.aThumbs[0].click();
        }
        oSelf.iSlideshowTimeoutHandle = setTimeout(
            oSelf.activateNextLoop,
            oSelf.iSlideshowTimeout
        );
    },
    activate: function(sFilename) {
        var oSelf = self.PortfolioManager;
        if (oSelf.bInProgress) {
            return false;
        }
        oSelf.bInProgress = true;
        if (!oSelf.aThumbs.length) {
            return
        } 
        if (typeof(sFilename) != "string") {
            if (sFilename.pageX) {
                // if clicked manually
                oSelf.stopSlideshow();
            }
            sFilename = $j(this).attr("href").split("#")[1].substr(5);
        }
        if (!sFilename) {
            sFilename = oSelf.aThumbs[0].attr("href").split("#")[1].substr(5);
        }
        // activate another thumbnail
        oSelf.aThumbs[oSelf.iActiveIndex].parent().removeClass("active");
        oSelf.iActiveIndex = oSelf.aThumb2Index[sFilename];
        oSelf.aThumbs[oSelf.iActiveIndex].parent().addClass("active");
        // hide existing image and description
        oSelf.getNewImage(sFilename);
        return true;
    },
    getNewImage: function(sFilename) {
        var oSelf = self.PortfolioManager;
        var sToken = oSelf.aThumbs[oSelf.iActiveIndex].attr("href").split("#")[1].substr(5);
        $j("#in_progress").show();
        $j.get(
            location.pathname + "file_" + sToken + "/json/",
            oSelf.showResults
        );
    },
    showResults: function(sData) {
        var oSelf = self.PortfolioManager;
        eval("var oData = " + sData);
        if (!oData) {
            $j("#media_file_content").html(gettext("Media file is broken."));
            return false;
        }
        // show new image and description
        $j("#in_progress").hide();
        var $oPrev = $j("#media_file img");
        $j("#media_file").css("background", "transparent url(" + $oPrev.attr("src") + ") no-repeat 0px 0px");
        $j("#media_file").html(oData.html)
        $j("#media_file img").css("display", "none").fadeIn("slow");
        $j("#media_desc_content").html(oData.description || oSelf.defaultMediaDesc);
        
        // previous navigation
        if (oSelf.iActiveIndex > 0) {
            $j("#media_previous").removeClass("disabled").attr("href", oSelf.aThumbs[oSelf.iActiveIndex-1].attr("href"));
        } else {
            $j("#media_previous").addClass("disabled").attr("href", "");
        }
        // next navigation
        if (oSelf.iActiveIndex < oSelf.aThumbs.length - 1) {
            $j("#media_next").removeClass("disabled").attr("href", oSelf.aThumbs[oSelf.iActiveIndex+1].attr("href"));
        } else {
            $j("#media_next").addClass("disabled").attr("href", "");
        }
        
        // hook for other libraries
        if (typeof(self.PortfolioManager.onMediaLoad)=="function") {
            self.PortfolioManager.onMediaLoad();
        }
        
        oSelf.bInProgress = false;
    }
};

$j(document).ready(function(){
    self.PortfolioManager.init();
});

$j(window).unload(function() {
    self.PortfolioManager.destruct();
});

