
// Lightbox 1.6, Extended version of Slimbox with some fixes for Mootools 1.2 by Aeron Glemann. Copyright (c) 2007 Samuel Birch <http://phatfusion.net>, MIT Style License.
var Lightbox = new Class({Implements:[Events, 
  Options], 
  options: {resizeDuration: 400, resizeTransition: Fx.Transitions.Sine.easeInOut, initialWidth: 250, initialHeight: 250, 
  animateCaption: 
{In: true, Out: true}, showControls: false, showNumbers: true, descriptions: false, opacity: 0.8, onClose: $empty, 
  onOpen: $empty}, 
  initialize: function(A)
   {this.setOptions(A);
    this.options.container = document.body;
    this.anchors =[];
    $$("a[rel]").each(function(C)
       {if (C.rel.test( /^lightbox/i))
           {C.onclick = this.click.pass(C, this);
            this.anchors.push(C);
           }
       }, this);
    this.eventPosition = this.position.bind(this);
    this.overlay = (new Element("div")).set("id", "lbOverlay").inject(this.options.container);
    this.center = (new Element("div")).set("id", "lbCenter").setStyles( {width: this.options.initialWidth + "px", height: this.options.initialHeight + 
      "px", marginLeft: "-" + this.options.initialWidth / 2 + "px", display: "none"}).inject(this.options.container);
    this.image = (new Element("div")).set("id", "lbImage").inject(this.center);
    this.bottomContainer = (new Element("div")).set("id", "lbBottomContainer").setStyle("display", "none").inject(this.options.container);
    this.bottom = (new Element("div")).set("id", "lbBottom").inject(this.bottomContainer);
    if (this.options.showControls)
       {this.controlDiv = (new Element("div")).set("id", "lbControls").inject(this.bottom);
       }
    else 
       {this.controlDiv = this.image;
       }
    this.prevLink = (new Element("a")).setProperties( {id: "lbPrevLink", href: "#"}).setStyle("display", "none").inject(this.controlDiv);
    this.nextLink = this.prevLink.clone().set("id", "lbNextLink").inject(this.controlDiv);
    this.prevLink.onclick = this.previous.bind(this);
    this.nextLink.onclick = this.next.bind(this);
    this.closeButton = (new Element("a")).setProperties( {id: "lbCloseLink", href: "#"}).inject(this.bottom);
    this.closeButton.onclick = this.overlay.onclick = this.close.bind(this);
    this.caption = (new Element("div")).set("id", "lbCaption").inject(this.bottom);
    if (this.options.descriptions != false)
       {this.options.descriptions = $$(this.options.descriptions);
        this.description = (new Element("div")).set("id", "lbDescription").inject(this.bottom);
       }
    if (this.options.showNumbers)
       {this.number = (new Element("div")).set("id", "lbNumber").inject(this.bottom);
       }
    (new Element("div")).setStyle("clear", "both").inject(this.bottom);
    var B = this.nextEffect.bind(this);
    this.fx =  {overlay: new Fx.Tween(this.overlay, "opacity",  {duration: 500}), resize: new Fx.Morph(this.center,  {duration: this.options.resizeDuration, transition: this.options.resizeTransition, 
      onComplete: B}), image: new Fx.Tween(this.image, "opacity",  {duration: 500, onComplete: B}), bottom: new Fx.Tween(this.bottom, "margin-top",  {duration: 400, 
      onComplete: B})};
    this.overlay.fade("hide");
    this.preloadPrev = new Image;
    this.preloadNext = new Image;
   
    return this;
   }
, 
  click: function(D)
   {if (this.options.descriptions != false)
       {this.options.descriptions.each(function(F, E)
           {if (F.hasClass(D.id))
               {this.linkLoc = E;
               }
           }, this);
       }
    if (D.rel.length == 8)
       {return this.show(D.href, D.title);
       }
    var C, B, A =[];
    this.anchors.each(function(E)
       {if (E.rel == D.rel)
           {for (C = 0;C < A.length;C++)
               {               if (A[C][0] == E.href)
                   {                   break;
                   }
               }
            if (C == A.length)
               {A.push([E.href, E.title]);
                if (E.href == D.href)
                   {B = C;
                   }
               }
           }
       }, this);
   
    return this.open(A, B);
   }
, 
  show: function(A, 
  B)
   {
   return this.open([[A, B]], 0);
   }
, 
  open: function(A, 
  B)
   {   this.images = A;
    this.position();
    this.setup(true);
    this.top = window.getScrollTop() + window.getHeight() / 15;
    this.window = {};
    this.window.height = window.getScrollHeight();
    this.window.width = window.getScrollWidth();
    this.window.top = window.getScrollTop();
    this.window.left = window.getScrollLeft();
    this.center.setStyles( {top: this.top + "px", display: ""});
    this.overlay.fade(this.options.opacity);
    this.fireEvent("onOpen");
   
    return this.changeImage(B);
   }
, 
  position: function()
   {if (this.options.container == document.body)
       {var B = window.getScrollHeight() + "px";
        var A = window.getScrollWidth() + "px";
        this.overlay.setStyles( {top: "0px", height: B, width: A});
       }
    else 
       {var C = this.options.container.getCoordinates();
        this.overlay.setStyles(
        {top: C.top + "px", height: C.height + "px", left: C.left + "px", width: C.width + "px"});
       }
   }
, 
  setup: function(A)
   {var C = $A(document.getElementsByTagName("object"));
    if (window.ie)
       {C.extend(document.getElementsByTagName("select"));
       }
    C.each(function(D)
       {D.style.visibility = A ? "hidden": "";
       });
    var B = A ? "addEvent": "removeEvent";
    window[B]("scroll", this.eventPosition)[B]("resize", this.eventPosition);
   
    this.step = 0;
   }
, 
  previous: function()
   {this.linkLoc--;
   
    return this.changeImage(this.activeImage - 1);
   }
, 
  next: function()
   {this.linkLoc++;
   
    return this.changeImage(this.activeImage + 1);
   }
, 
  changeImage: function(A)
   {if (this.step || A < 0 || A >= this.images.length)
       {return false;
       }
    this.step = 1;
    this.activeImage = A;
    if (this.options.animateCaption.In && this.bottom.offsetHeight)
       {this.prevLink.style.display = this.nextLink.style.display = "none";
        this.bottom.set("tween",  {duration: 300, onComplete: this.loadImage.bind(this)}).tween("margin-top", - this.bottom.offsetHeight);
       }
    else 
       {this.bottomContainer.style.display = this.prevLink.style.display = this.nextLink.style.display = "none";
        this.loadImage();
       }
    this.image.fade("hide");
    this.center.className = "lbLoading";
   
    return false;
   }
, 
  loadImage: function()
   {this.preload = new Image;
    this.preload.onload = this.nextEffect.bind(this);
   
    this.preload.src = this.images[this.activeImage][0];
   }
, 
  nextEffect: function()
   {switch (this.step++)
       {case 1: 
            this.center.className = "";
            this.image.style.backgroundImage = "url(" + this.images[this.activeImage][0] +")";
            this.image.style.width = this.bottom.style.width = this.preload.width + "px";
            if (this.options.showControls)
               {this.image.style.height = this.preload.height + "px";
               }
            else 
               {this.image.style.height = this.prevLink.style.height = this.nextLink.style.height = this.preload.height + "px";
               }
            this.caption.set("html", this.images[this.activeImage][1] || "");
            if (this.options.descriptions != false)
               {if (this.description.getFirst())
                   {this.description.getFirst().remove();
                   }
                var B = this.options.descriptions[this.linkLoc].clone();
                B.setStyle("display", "block").inject(this.description);
               }
            if (this.options.showNumbers)
               {this.number.set("html", this.images.length == 1 ? "": "Image " + (this.activeImage + 1) + " of " + this.images.length);
               }
            if (this.activeImage)
               {this.preloadPrev.src = this.images[this.activeImage - 1][0];
               }
            if (this.activeImage != this.images.length - 1)
               {this.preloadNext.src = this.images[this.activeImage + 1][0];
               }
            if (this.center.clientHeight != this.image.offsetHeight)
               {this.fx.resize.start( {height: this.image.offsetHeight});
                break;
               }
            this.step++;
        case 2: 
            if (this.center.clientWidth != this.image.offsetWidth)
               {this.fx.resize.start( {width: this.image.offsetWidth, marginLeft: - this.image.offsetWidth / 2});
                break;
               }
            this.step++;
        case 3: 
            this.bottomContainer.setStyles( {top: this.top + this.center.clientHeight + "px", height: "30px", marginLeft: this.center.style.marginLeft, 
              display: ""});
            this.image.fade("in");
            var A = this.caption.getStyle("height").toInt();
            if (this.options.descriptions != false)
               {A += this.description.getStyle("height").toInt();
               }
            if (this.options.showControls)
               {A += this.controlDiv.getStyle("height").toInt();
               }
            if (this.options.showNumbers)
               {A += this.number.getStyle("height").toInt();
               }
            var C = A - this.closeButton.getStyle("height").toInt() * 2;
            if (C < 0)
               {C = 0;
               }
            //this.closeButton.setStyle("marginTop", C + "px");
            if (this.activeImage != 0)
               {this.prevLink.style.display = "";
               }
            if (this.activeImage != this.images.length - 1)
               {this.nextLink.style.display = "";
               }
            break;
        case 4: 
            if (this.options.animateCaption.Out)
               {this.fx.bottom.set( - this.bottom.offsetHeight);
                this.bottomContainer.style.height = "";
                this.fx.bottom.start(0);
                break;
               }
            this.bottomContainer.style.height = "";
        case 5: 
            this.step = 0;
        default:
       }
   }
, 
  close: function()
   {if (this.step < 0)
       {return;
       }
    this.step = - 1;
    if (this.preload)
       {this.preload.onload = $empty;
        this.preload = null;
       }
    for (var A in this.fx)
       {this.fx[A].cancel();
       }
    this.center.style.display = this.bottomContainer.style.display = "none";
    this.overlay.fade("out");
    this.setup.pass(false, this);
    this.overlay.setStyles( {height: this.window.height + "px", width: this.window.width + "px"});
    this.fireEvent("onClose");
    return false;
   }
});

