var imagePreviewer = new Class({
    Binds: ["_hidePreview", "_getNextImage", "_placePreviewDivOnResize", "_getFull"],
    initialize: function(curlbl) {
        var c = $("picturama").setStyles({ "position": "relative" });
        var mainObj = [];
        var overLayDiv = new Element("div", { "id": "overLayDiv", "class": "overlay fixME",
            "events": { "click": this._hidePreview }
        }).inject($(document.body));

        var previewDiv = new Element("div", { "id": "previewDiv", "styles": { "position": "absolute",
            "cursor": "pointer",
            "z-index": "5500",
            "display": "none"
        },
            "events": { "click": this._getNextImage }
        }).inject($(document.body));

        var scrollFx = new Fx.Scroll($(document.body));
        this.curVideoSwf = 0;
        var initprojind, initimgind = -1;
        this.currentProject = -1;
        this.currentLink = -1;
        c.getElements("div.p").each(function(projectDiv, projind) {
            var imageArr = [];
            if (curlbl == projectDiv.get("id")) { initprojind = projind; initimgind = 0 };
            projectDiv.getElements("a.img, a.video").each(function(imgLkElt, imgind) {
                switch (imgLkElt.get("class")) {
                    case "img":
                        imageArr.include({ "container": imgLkElt, "img": imgLkElt.get("href"), "type": "image" });
                        imgLkElt.set("href", "javascript:void(0)").addEvent("click", this._getFull.pass([projind, imgind]));
                        break;
                    case "video":
                        imageArr.include({ "container": imgLkElt, "video": imgLkElt.get("href"), "type": "video" });
                        imgLkElt.set("href", "javascript:void(0)").addEvent("click", this._getFull.pass([projind, imgind]));
                        break;
                }

            }, this);
            if (imageArr.length > 0)
                mainObj.push({ "container": projectDiv, "images": imageArr });
        }, this);
        c.store("scrollFx", scrollFx);
        c.store("mainObj", mainObj);
        this.mainObjLength = mainObj.length;
        if (initprojind >= 0 && initimgind >= 0) window.addEvent("load", this._getFull.pass([initprojind, initimgind], this));
        else this._hidePreview();
        if (Browser.Engine.trident && Browser.Engine.version < 7)
            window.onresize = this._placePreviewDivOnResize;
        else
            window.addEvent("resize", this._placePreviewDivOnResize);
    },
    _getFull: function(projind, imgind) {
        if (this.currentProject < 0)
            this._showPreview();
        switch (this._getPreviewType(projind, imgind)) {
            case "image":
                this._setPreviewImg(this._getImgSrc(projind, imgind));
                break;
            case "video":
                this._setPreviewVideo(this._getVidSrc(projind, imgind));
                break;
        }
        if (this.currentProject != projind) {
            this._setProjectActive(this.currentProject, false);
            this._setProjectActive(projind, true);
            this._placePreviewDiv(projind);
        }
        this.currentProject = projind;
        this.currentLink = imgind;
        this._setImgVisited(this._getImgLinkElt(this.currentProject, this.currentLink));
        return;
    },
    _getNextImage: function() {
        var nextprojind = this.currentProject,
            nextimgind = this.currentLink,
            curProj = this._getProjectObj(nextprojind);
        if (nextimgind + 1 >= curProj.images.length) {
            nextprojind = (nextprojind + 1) % this.mainObjLength;
            nextimgind = 0;
        } else
            nextimgind = nextimgind + 1;
        return this._getFull(nextprojind, nextimgind);
    },
    _setPreviewImg: function(imgSrc) {
        if (Browser.Engine.trident && Browser.Engine.version < 7) new Asset.image(imgSrc, { onload: function(e) { e.inject($("previewDiv").empty()) } });
        return new Element("img", { "src": imgSrc, "styles": { "display": "block", "zoom": 1, "position": "relative"} }).inject($("previewDiv").empty());
    },
    _setPreviewVideo: function(vidSrc) {
        var container = new Element("div", { "styles": { "background-color": "#000000"} }).inject($("previewDiv").empty());
        var url = '/video.swf?r=' + $time();
        var swfElt = new Swiff(url, { "width": 500,
            "height": 300,
            "container": container,
            vars: { 'urlVideo': vidSrc,
                'autoplay': 'true',
                'fs': 'false',
                'w': 500,
                'h': 300
            },
            params: { 'scale': 'showall',
                'allowFullScreen': 'true',
                'allowScriptAccess': 'sameDomain'
            }
        });
        return container;
    },
    _showPreview: function() {
        this._setProjectActive(this.currentProject, true);
        $("overLayDiv").setStyle("display", "block");
        $("previewDiv").setStyle("display", "block");
        return;
    },
    _hidePreview: function() {
        this._setProjectActive(this.currentProject, false);
        this.currentProject = -1;
        this.currentLink = -1;
        $("overLayDiv").setStyle("display", "none");
        $("previewDiv").setStyle("display", "none");
        return;
    },
    _placePreviewDiv: function(projind) {
        var projCoord = this._getImgLinkElt(projind, 0).getCoordinates();
        $("previewDiv").setStyles({ "top": projCoord.top, "left": projCoord.left });
        $("picturama").retrieve("scrollFx").start(0, (projCoord.top - 40) > 0 ? projCoord.top - 40 : 0);
        return;
    },
    _placePreviewDivOnResize: function() {
        if (this.currentProject >= 0) this._placePreviewDiv(this.currentProject);
    },
    _getProjectObj: function(projind) {
        return $("picturama").retrieve("mainObj")[projind];
    },
    _getImgLinkElt: function(projind, imgind) {
        return this._getProjectObj(projind).images[imgind].container;
    },
    _getImgSrc: function(projind, imgind) {
        return this._getProjectObj(projind).images[imgind].img;
    },
    _getVidSrc: function(projind, imgind) {
        return this._getProjectObj(projind).images[imgind].video;
    },
    _getPreviewType: function(projind, imgind) {
        return this._getProjectObj(projind).images[imgind].type;
    },
    _setImgVisited: function(imgLinkElt) {
        imgLinkElt.addClass("visited");
    },
    _setProjectActive: function(projind, bool) {
        if (projind < 0 || !$chk(this._getProjectObj(projind))) return;
        if (bool) this._getProjectObj(projind).container.addClass("active");
        else this._getProjectObj(projind).container.removeClass("active");
    }
});

