﻿///<reference path="global.js" />
///<reference path="uielements.js" />
Gallery =
{
    Init: function () {
        Gallery.ImageHolder = $G.GET("#image-holder") || $G.Append(document.body, $G.Tag("div", { style: { width: "0px", height: "0px", overflow: "hidden"} }, "image-holder"));
        Gallery.Div = $G.Append(document.body, $G.Tag("div", "image-popup"));
        Gallery.Div.Prev = $G.Append(Gallery.Div, $G.Tag("div", "prev"));
        Gallery.Div.Next = $G.Append(Gallery.Div, $G.Tag("div", "next"));
        Gallery.Div.Pic = $G.Append(Gallery.Div, $G.Tag("div", "pic"));
        Gallery.Div.Info = $G.Append(Gallery.Div, $G.Tag("div", "info"));
        Gallery.Div.Close = $G.Append(Gallery.Div, $G.Tag("div", "close"));

        $G.Event.Add(Gallery.Div.Prev, "click", Gallery.Prev);
        $G.Event.Add(Gallery.Div.Next, "click", Gallery.Next);
        $G.Event.Add(Gallery.Div.Close, "click", Gallery.Close);
    },
    Div: null,
    Show: function (obj, getImages) {
        if (getImages)
            Gallery.CurrentGetImages = getImages;
        else
            Gallery.CurrentGetImages = null;
        if (obj && obj.getAttribute("bigsrc")) {
            var img = $G.GET(Gallery.ImageHolder, [["@src", obj.getAttribute("bigsrc"), "0"]]);
            if (!img)
                img = $G.Append(Gallery.ImageHolder, $G.Tag("img", { src: obj.getAttribute("bigsrc") }));
            var _gTop = Math.round($G.Window.Height() / 2 + $G.Window.Scroll.Top()) - 34;
            var _gLeft = Math.round($G.Window.Width() / 2 + $G.Window.Scroll.Left()) - 34;
            Gallery.Div.style.width = "68px";
            Gallery.Div.style.height = "68px";
            Gallery.Div.Pic.style.width = "48px";
            Gallery.Div.Pic.style.height = "48px";
            Gallery.Div.style.top = _gTop + "px";
            Gallery.Div.style.left = _gLeft + "px";
            Gallery.Div.style.display = "block";
            Gallery.Div.style.backgroundImage = "url(res/img/preloader.gif)";
            Gallery.Div.Next.style.display = Gallery.Div.Prev.style.display = Gallery.Div.Info.style.display = Gallery.Div.Close.style.display = "none";
            $FX.Time(500).Page.FadeIn("#000000", 60, Gallery.LoadCheck.bind({ img: img, obj: obj }));
        }
    },
    Prev: function () {
        var imgs = Gallery.GetImages(Gallery.Current.obj);
        if (imgs.length > 0) {
            var info = Gallery.GetInfo(Gallery.Current.obj);
            var obj;
            if (info.index > 1)
                obj = imgs[info.index - 2];
            else
                obj = imgs[imgs.length - 1];
            if (obj) {
                if (obj && obj.getAttribute("bigsrc")) {
                    var img = $G.GET(Gallery.ImageHolder, [["@src", obj.getAttribute("bigsrc"), "0"]]);
                    if (!img)
                        img = $G.Append(Gallery.ImageHolder, $G.Tag("img", { src: obj.getAttribute("bigsrc") }));
                    Gallery.LoadCheck.bind({ img: img, obj: obj })();
                }
            }
        }
    },
    Next: function () {
        var imgs = Gallery.GetImages(Gallery.Current.obj);
        if (imgs.length > 0) {
            var info = Gallery.GetInfo(Gallery.Current.obj);
            var obj;
            if (info.index < imgs.length)
                obj = imgs[info.index];
            else
                obj = imgs[0];
            if (obj) {
                if (obj && obj.getAttribute("bigsrc")) {
                    var img = $G.GET(Gallery.ImageHolder, [["@src", obj.getAttribute("bigsrc"), "0"]]);
                    if (!img)
                        img = $G.Append(Gallery.ImageHolder, $G.Tag("img", { src: obj.getAttribute("bigsrc") }));
                    Gallery.LoadCheck.bind({ img: img, obj: obj })();
                }
            }
        }
    },
    GetImages: function (obj) {
        if (Gallery.CurrentGetImages)
            return Gallery.CurrentGetImages(obj);
        else
            return Gallery.DefaultGetImages(obj);
    },
    DefaultGetImages: function (obj) {
        return $G.GET(obj, "up").getElementsByTagName("img");
    },
    GetInfo: function (obj) {
        var imgs = Gallery.GetImages(obj);
        var result = { amount: 0, index: 0 };
        if (imgs) {
            result.amount = imgs.length;
            for (var i = 0; i < result.amount; i++) {
                if (imgs[i].getAttribute("bigsrc") == obj.getAttribute("bigsrc")) {
                    result.index = i + 1;
                    return result;
                }
            }
        }
        return { index: 0, amount: 0 };
    },
    LoadCheck: function () {
        if (this.img.complete) {
            Gallery.Current = this;
            var _gTop = Math.round($G.Window.Height() / 2 + $G.Window.Scroll.Top());
            var _gLeft = Math.round($G.Window.Width() / 2 + $G.Window.Scroll.Left());
            Gallery.Div.Pic.style.background = "url(" + this.img.src + ") no-repeat center top";
            Gallery.Div.Pic.style.display = "block";
            Gallery.Div.style.backgroundImage = "url(res/img/px.gif)";

            var disp = this.img.offsetHeight - Gallery.Div.Pic.offsetHeight;
            disp = (disp + Gallery.Div.Pic.offsetHeight > 100 ? disp : 100 - Gallery.Div.Pic.offsetHeight);
            //var h = this.img.offsetHeight > 100 ? this.img.offsetHeight < $G.Window.Height() * 0.85 ? this.img.offsetHeight : Math.round($G.Window.Height() * 0.85) : 100;
            var h = this.img.offsetHeight;
            $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div.Pic, "height", disp, h, function () {
                //var h = this.img.offsetHeight > 100 ? this.img.offsetHeight < $G.Window.Height() * 0.85 ? this.img.offsetHeight : Math.round($G.Window.Height() * 0.85) : 100;
                var h = this.img.offsetHeight;
                Gallery.Div.style.height = (h + 60) + "px";
                var width = this.img.offsetWidth - Gallery.Div.Pic.offsetWidth;
                width = (width + Gallery.Div.Pic.offsetWidth > 400 ? width : 400 - Gallery.Div.Pic.offsetWidth);
                $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div.Pic, "width", width, (this.img.offsetWidth > 400 ? this.img.offsetWidth : 400), function () {
                    Gallery.Div.style.width = ($G.GetStyle(Gallery.Div.Pic, "width", true) + 20) + "px";
                    Gallery.Div.Next.style.display = Gallery.Div.Prev.style.display = Gallery.Div.Info.style.display = Gallery.Div.Close.style.display = "block";
                    var info = Gallery.GetInfo(this.obj);
                    Gallery.Div.Info.innerHTML = this.obj.getAttribute("metatitle") + "<br />изображение " + info.index.toString() + " из " + info.amount.toString();
                } .bind(this), function (f) {
                    Gallery.Div.style.width = (f + 20) + "px";
                    Gallery.Div.style.left = Math.round(_gLeft - (f + 20) / 2) + "px";
                }, "AnimateWidth");
            } .bind(this), function (f) {
                if (f != null) {
                    Gallery.Div.style.height = (f + 60) + "px";
                    Gallery.Div.style.top = Math.round(_gTop - (f + 60) / 2) + "px";
                }
            }, "AnimateHeight");
        }
        else {
            setTimeout(Gallery.LoadCheck.bind(this), 100);
        }
    },
    Close: function () {
        $G.SetStyle("display", "none", Gallery.Div.Prev, Gallery.Div.Next, Gallery.Div.Close, Gallery.Div.Info, Gallery.Div.Pic);
        Gallery.Div.style.backgroundImage = "url(res/img/px.gif)";
        var cTop = Math.round($G.Window.Height() / 2) + $G.Window.Scroll.Top();
        var cLeft = Math.round($G.Window.Width() / 2) + $G.Window.Scroll.Left();
        var dLeft = cLeft - $G.GetStyle(Gallery.Div, "left", true);
        var dTop = cTop - $G.GetStyle(Gallery.Div, "top", true);
        $FX.Interval(10).Time(500).Page.FadeOut("#000000");
        $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div, "width", -$G.GetStyle(Gallery.Div, "width", true), 0, function () { Gallery.Div.style.display = "none"; }, null, "GalleryWidth");
        $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div, "height", -$G.GetStyle(Gallery.Div, "height", true), 0, null, null, "GalleryHeight");
        $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div, "top", dTop, cTop, null, null, "GalleryTop");
        $FX.Interval(10).Time(500).AnimateStyle(Gallery.Div, "left", dLeft, cLeft, null, null, "GalleryLeft");
        Gallery.Current = null;
    }
}
//Gallery._GalleryingLoad = window.onload;
//window.onload = function(e)
//{
//    if (Gallery._GalleryingLoad)
//        Gallery._GalleryingLoad(e);
    addDOMLoadEvent(Gallery.Init);
//}
