Event.observe(window, "load", OnDocumentLoad);
Event.observe(window, "unload", OnDocumentUnload);

function OnDocumentLoad(evObj) {
    if ($("SliderBox") != null)
        new SliderBoxExtender($("SliderBox"));

    if ($("Navigation") != null)
        new NavigationExtender($("Navigation"));

    if ($("Gallery") != null)
        new GalleryExtender($("Gallery"));

    if ($("Footer") != null)
        new PopupLinkExtender($("Footer"));

    $$(".image.dynamic").each(function(item) {

        $w(item.className).each(function(cn) {
            if (cn.substring(0, 3) == "num") {
                var Pictures = new Array();
                for (i = 1; i <= cn.substring(3); ++i) {
                    Pictures.push(item.down("img").src.replace("-1", "-" + i));
                }
                new FadingBannerExtender(item, Pictures);
            }
        }, this);
    }, this);
}

function OnDocumentUnload ( evObj )
{
}

/********** NavigationExtender  **********/
var NavigationExtender = Class.create();
NavigationExtender.prototype =
{
    initialize: function(Navigation) {
        this.ItemClick = this.OnItemClick.bindAsEventListener(this);
        this.DisappearFinish = this.OnDisappearFinish.bindAsEventListener(this);
        this.AppearBeforeSetup = this.OnAppearBeforeSetup.bindAsEventListener(this);

        this.Navigation = $(Navigation);
        this.ClickedElement = null;

        this.Navigation.getElementsBySelector("li a").each(function(item) {
            if (item.up("li").down("ul") != null) {
                item.writeAttribute("onclick", "return false;");
                item.writeAttribute("href", "javascript:void(0);");
                Event.observe(item, "click", this.ItemClick);
            }
        }, this);

    },

    OnItemClick: function(evObj) {
        this.ClickedElement = Event.element(evObj);

        if (navigator.appVersion.indexOf("Mac") > -1 || navigator.appVersion.indexOf("Safari") > -1) {
            if ( this.ClickedElement.up("ul").down("ul.selected") != null )
                this.ClickedElement.up("ul").down("ul.selected").removeClassName("selected");
            if (this.ClickedElement.up("li").down("ul") != null)
                this.ClickedElement.up("li").down("ul").addClassName("selected");
            
        }
        else {

            if (this.ClickedElement.up("ul").down("ul.selected") != null) {
                Effect.BlindLeft(this.ClickedElement.up("ul").down("ul.selected"), { duration: 0.4, afterFinish: this.DisappearFinish });
            }
            else
                Effect.BlindRight(this.ClickedElement.up("li").down("ul"), { duration: 0.4, beforeSetup: this.AppearBeforeSetup });
        }
    },

    OnDisappearFinish: function(evObj) {
        this.ClickedElement.up("ul").down("ul.selected").removeClassName("selected");
        Effect.BlindRight(this.ClickedElement.up("li").down("ul"), { duration: 0.4, beforeSetup: this.AppearBeforeSetup });

    },

    OnAppearBeforeSetup: function(evObj) {
        this.ClickedElement.up("li").down("ul").addClassName("selected");
    }


}
/********** NavigationExtender  **********/


/********** PopupLinkExtender  **********/
var PopupLinkExtender = Class.create();
PopupLinkExtender.prototype =
{
    initialize: function(SearchElement) {
        this.ItemClick = this.OnItemClick.bindAsEventListener(this);
        this.CloseClick = this.OnCloseClick.bindAsEventListener(this);
        this.ContentLoaded = this.OnContentLoaded.bindAsEventListener(this);
        this.ContentUnloaded = this.OnContentUnloaded.bindAsEventListener(this);

        SearchElement = $(SearchElement);

        Event.observe($("WindowHolder").down(".closeButton"), "click", this.CloseClick);

        SearchElement.getElementsBySelector("a.popup").each(function(item) {
            item.writeAttribute("onclick", "return false;");
            item.File = item.href;
            item.writeAttribute("href", "javascript:void(0);");
            Event.observe(item, "click", this.ItemClick);
        }, this);

    },

    OnItemClick: function(evObj) {
        obj = Event.element(evObj);

        $("WindowOverlay").addClassName("visible");
        $("WindowHolder").addClassName("visible");
        $("WindowHolder").down(".window").hide();

        new Ajax.Updater($("WindowHolder").down(".content"), obj.File, { method: "get", onComplete: this.ContentLoaded });


    },

    OnCloseClick: function(evObj) {
        obj = Event.element(evObj);

        Effect.Shrink($("WindowHolder").down(".window"), { duration: 0.4, afterFinish: this.ContentUnloaded });
    },

    OnContentLoaded: function(evObj) {
        Effect.Grow($("WindowHolder").down(".window"), { duration: 0.4 });
    },

    OnContentUnloaded: function(evObj) {
        $("WindowOverlay").removeClassName("visible");
        $("WindowHolder").removeClassName("visible");
    }
}
/********** PopupLinkExtender  **********/


/********** FadingBannerExtender **********/
var FadingBannerExtender = Class.create();
FadingBannerExtender.prototype =
{
    initialize: function(holder, pics) {
        this.ImageLoaded = this.OnImageLoaded.bindAsEventListener(this);
        this.ImageChanged = this.OnImageChanged.bindAsEventListener(this);

        this.Holder = $(holder);
        this.Pics = pics;
        this.Timeout = 2;
        this.PicIndex = -1;

        this.CurrentImage = this.Holder.down("img");

        this.NextImage = new Image();
        this.NextImage.src = this.NextPicture();

        if (this.CurrentImage == null)
            new PeriodicalExecuter(this.ImageLoaded, 0.1);
        else
            new PeriodicalExecuter(this.ImageLoaded, this.Timeout);
    },

    NextPicture: function() {
        if (this.PicIndex == -1)
            this.PicIndex = Math.floor(Math.random() * this.Pics.length);
        else if (this.PicIndex < (this.Pics.length - 1))
            this.PicIndex++;
        else
            this.PicIndex = 0;

        return this.Pics[this.PicIndex];
    },

    OnImageLoaded: function(evObj) {
        if (this.NextImage.complete) {
            evObj.stop();

            this.Holder.appendChild(this.NextImage);

            if (this.CurrentImage == null) {
                this.OnImageChanged(null);
            }
            else {

                Effect.Fade($(this.CurrentImage), { duration: 4 });
                Effect.Appear($(this.NextImage), { duration: 4, afterFinish: this.ImageChanged });
            }
        }
    },

    OnImageChanged: function(evObj) {
        if (this.CurrentImage != null)
            this.Holder.removeChild(this.CurrentImage);

        this.CurrentImage = this.NextImage;

        $(this.CurrentImage).addClassName("visible");

        this.NextImage = new Image();
        this.NextImage.src = this.NextPicture();

        new PeriodicalExecuter(this.ImageLoaded, this.Timeout);
    }
}
/********** FadingBannerExtender **********/



/********** GalleryExtender  **********/
var GalleryExtender = Class.create();
GalleryExtender.prototype =
{
    initialize: function(Gallery) {
        this.ThumbClick = this.OnThumbClick.bindAsEventListener(this);
        this.PictureClick = this.OnPictureClick.bindAsEventListener(this);
        this.ImageLoaded = this.OnImageLoaded.bindAsEventListener(this);
        this.ImageChanged = this.OnImageChanged.bindAsEventListener(this);

        this.Gallery = $(Gallery);
        this.Holder = this.Gallery.down(".picture");
        this.CurrentImage = this.Holder.down("img");
        this.CurrentImageHref = this.CurrentImage.up("a");
        this.NextImage = null;
        this.NextImageHref = null;
        this.Timeout = 0.1;

        this.Loading = false;

        this.CurrentImage.addClassName("visible");
        if (this.CurrentImageHref != null)
            this.CurrentImageHref.addClassName("visible");

        this.Gallery.getElementsBySelector("ul li a").each(function(item) {
            item.writeAttribute("onclick", "return false;");
            item.writeAttribute("href", "javascript:void(0);");
            Event.observe(item, "click", this.ThumbClick);
        }, this);

    },

    NextPicture: function() {

    },

    OnThumbClick: function(evObj) {
        if (!this.Loading) {
            var obj = Event.element(evObj);
            var thumb = (obj.down("img") != null) ? obj.down("img") : obj;

            if (thumb.src.replace("thumb-", "") != this.CurrentImage.src) {

                this.Holder.getElementsBySelector("a").each(function(item) {
                    if (item.href == thumb.src.replace("thumb-", "large-"))
                        this.NextImageHref = item;
                }, this);


                this.Loading = true;
                this.NextImage = new Image();
                this.NextImage.src = thumb.src.replace("thumb-", "");

                new PeriodicalExecuter(this.ImageLoaded, this.Timeout);
            }
        }

    },

    OnPictureClick: function(evObj) {
        this.ClickedElement = Event.element(evObj);
    },

    OnImageLoaded: function(evObj) {
        if (this.NextImage.complete) {
            evObj.stop();

            if (this.NextImageHref != null) {
                this.NextImageHref.appendChild(this.NextImage);
                this.NextImageHref.addClassName("visible");
            }
            else {
                this.Holder.appendChild(this.NextImage);
            }

            if (this.CurrentImage == null) {
                this.OnImageChanged(null);
            }
            else {
                Effect.Fade($(this.CurrentImage), { duration: 0.8 });
                Effect.Appear($(this.NextImage), { duration: 0.8, afterFinish: this.ImageChanged });
            }
        }
    },

    OnImageChanged: function(evObj) {
        if (this.CurrentImage != null) {
            if (this.CurrentImageHref != null) {
                this.CurrentImageHref.removeChild(this.CurrentImage);
                this.CurrentImageHref.removeClassName("visible");
            }
            else {
                this.Holder.removeChild(this.CurrentImage);
            }
        }

        this.CurrentImage = this.NextImage;
        this.CurrentImageHref = this.NextImageHref;

        $(this.CurrentImage).addClassName("visible");

        this.Loading = false;
    }
}
/********** GalleryExtender  **********/


/**********  scriptaculous - Effect-Extension **********/
Effect.BlindRight = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleY: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({
        width: '0px',
        height: effect.dims[0] + 'px'
      }).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};

Effect.BlindLeft = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleY: false,
      scaleMode: 'box',
      scaleContent: false,
      restoreAfterFinish: true,
      afterSetup: function(effect) {
        effect.element.makeClipping().setStyle({
          height: effect.dims[0] + 'px'
        }).show();
      },
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};
/**********  scriptaculous - Effect-Extension **********/

/********** SliderBoxExtender  **********/
var SliderBoxExtender = Class.create();
SliderBoxExtender.prototype =
{
    initialize: function(SliderBox) {
        this.ItemOver = this.OnItemOver.bindAsEventListener(this);
        this.MouseMove = this.OnMouseMove.bindAsEventListener(this);

        this.SliderBox = $(SliderBox);
        this.InnerBox = this.SliderBox.down("table");

        Event.observe(this.SliderBox, "mouseover", this.ItemOver);

        this.Movement = null;

        this.OverAreaSize = 220;


        this.LeftOverArea = this.OverAreaSize;
        this.RightOverArea = this.SliderBox.getWidth() - this.OverAreaSize;


    },

    OnItemOver: function(evObj) {
        Event.observe(document, "mousemove", this.MouseMove);
    },

    OnMouseMove: function(evObj) {
        var x = Event.pointerX(evObj) - Element.cumulativeOffset(this.SliderBox)[0];
        var y = Event.pointerY(evObj) - Element.cumulativeOffset(this.SliderBox)[1];

        this.PerformEvent(x, y);
    },

    PerformEvent: function(x, y) {
        var rightMissing = this.InnerBox.getWidth() - this.SliderBox.getWidth() + Element.positionedOffset(this.InnerBox)[0] + 20;
        var leftMissing = -Element.positionedOffset(this.InnerBox)[0] + 30;

        if ((y <= 0 || y >= this.SliderBox.getHeight() || x <= 0 || x >= this.SliderBox.getWidth())) {
            if (this.Movement != null) {
                this.Movement.cancel();
                this.Movement = null;
            }

            Event.stopObserving(document, "mousemove", this.MouseMove);
        }
        else {

            if (x > this.LeftOverArea && x < this.RightOverArea && this.Movement != null) {
                this.Movement.cancel();
                this.Movement = null;
            }

            if (x > this.RightOverArea && rightMissing > 0) {
                var dur = rightMissing / 100 * 0.4;
                if (this.Movement != null && this.Movement.options.x > 0) {
                    this.Movement.cancel();
                    this.Movement = new Effect.Move(this.InnerBox, { x: -rightMissing, y: 0, mode: "relative", duration: dur });
                }
                else if (this.Movement == null)
                    this.Movement = new Effect.Move(this.InnerBox, { x: -rightMissing, y: 0, mode: "relative", duration: dur });
            }

            if (x < this.LeftOverArea && leftMissing > 0) {
                var dur = leftMissing / 100 * 0.4;
                if (this.Movement != null && this.Movement.options.x < 0) {
                    this.Movement.cancel();
                    this.Movement = new Effect.Move(this.InnerBox, { x: leftMissing, y: 0, mode: "relative", duration: dur });
                }
                else if (this.Movement == null)
                    this.Movement = new Effect.Move(this.InnerBox, { x: leftMissing, y: 0, mode: "relative", duration: dur });
            }
        }

    }
}
/********** SliderBoxExtender  **********/

