/*
 * Smoothbox v20080623 by Boris Popoff (http://gueschla.com)
 * To be used with mootools 1.2
 *
 * Based on Cody Lindley's Thickbox, MIT License
 *
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

// on page load call TB_init
window.addEvent('domready', TB_init);

// prevent javascript error before the content has loaded
TB_WIDTH = 0;
TB_HEIGHT = 0;
var TB_doneOnce = 0;

// add smoothbox to href elements that have a class of .smoothbox
function TB_init(){
    $$("a.smoothbox").each(function(el){
   el.onclick = TB_bind
    });
}

function TB_bind(event){
    var event = new Event(event);
    // stop default behaviour
    event.preventDefault();
    // remove click border
    this.blur();
    // get caption: either title or name attribute
    var caption = this.title || this.name || "";
    // get rel attribute for image groups
    var group = this.rel || false;
    // display the box for the elements href
    TB_show(caption, this.href, group);
    this.onclick = TB_bind;
    return false;
}

// called when the user clicks on a smoothbox link
function TB_show(caption, url, rel){

    // create iframe, overlay and box if non-existent
    
    if (!$("TB_overlay")) {
   new Element('iframe').setProperty('id', 'TB_HideSelect').injectInside(document.body);
   $('TB_HideSelect').setOpacity(0);
   new Element('div').setProperty('id', 'TB_overlay').injectInside(document.body);
   $('TB_overlay').setOpacity(0);
   TB_overlaySize();
   new Element('div').setProperty('id', 'TB_load').injectInside(document.body);
   $('TB_load').innerHTML = "<img src='../images/loading.gif' />";
   TB_load_position();
   
   $('TB_overlay').set('tween', {
  duration: 400
   });
   $('TB_overlay').tween('opacity', 0, 0.6);
   
    }
    
    if (!$("TB_load")) {
   new Element('div').setProperty('id', 'TB_load').injectInside(document.body);
   $('TB_load').innerHTML = "<img src='../images/loading.gif' />";
   TB_load_position();
    }
    
    if (!$("TB_window")) {
   new Element('div').setProperty('id', 'TB_window').injectInside(document.body);
   $('TB_window').setOpacity(0);
    }
    
    $("TB_overlay").onclick = TB_remove;
    window.onscroll = TB_position;
    
    // check if a query string is involved
    var baseURL = url.match(/(.+)?/)[1] || url;
    
    // regex to check if a href refers to an image
    var imageURL = /\.(jpe?g|png|gif|bmp)/gi;
    
    // check for images
    if (baseURL.match(imageURL)) {
   var dummy = {
  caption: "",
  url: "",
  html: ""
   };
   
   var prev = dummy, next = dummy, imageCount = "";
   
   // if an image group is given
   if (rel) {
  function getInfo(image, id, label){
      return {
     caption: image.title,
     url: image.href,
     html: "<span id='TB_" + id + "'>&nbsp;&nbsp;<a href='#'>" + label + "</a></span>"
      }
  }
  
  // find the anchors that point to the group
  var imageGroup = [];
  $$("a.smoothbox").each(function(el){
      if (el.rel == rel) {
     imageGroup[imageGroup.length] = el;
      }
  })
  
  var foundSelf = false;
  
  // loop through the anchors, looking for ourself, saving information about previous and next image
  for (var i = 0; i < imageGroup.length; i++) {
      var image = imageGroup[i];
      var urlTypeTemp = image.href.match(imageURL);
      
      // look for ourself
      if (image.href == url) {
     foundSelf = true;
     imageCount = "Image " + (i + 1) + " of " + (imageGroup.length);
      }
      else {
     // when we found ourself, the current is the next image
     if (foundSelf) {
    next = getInfo(image, "next", "Next &gt;");
    // stop searching
    break;
     }
     else {
    // didn't find ourself yet, so this may be the one before ourself
    prev = getInfo(image, "prev", "&lt; Prev");
     }
      }
  }
   }
   
   imgPreloader = new Image();
   imgPreloader.onload = function(){
  imgPreloader.onload = null;
  
  // Resizing large images
  var x = window.getWidth() - 150;
  var y = window.getHeight() - 150;
  var imageWidth = imgPreloader.width;
  var imageHeight = imgPreloader.height;
  if (imageWidth > x) {
      imageHeight = imageHeight * (x / imageWidth);
      imageWidth = x;
      if (imageHeight > y) {
     imageWidth = imageWidth * (y / imageHeight);
     imageHeight = y;
      }
  }
  else 
      if (imageHeight > y) {
     imageWidth = imageWidth * (y / imageHeight);
     imageHeight = y;
     if (imageWidth > x) {
    imageHeight = imageHeight * (x / imageWidth);
    imageWidth = x;
     }
      }
  // End Resizing
  
  // TODO don't use globals
  TB_WIDTH = imageWidth + 30;
  TB_HEIGHT = imageHeight + 60;
  
  // TODO empty window content instead
  $("TB_window").innerHTML += "<a href='' id='TB_ImageOff' title='Close'><img id='TB_Image' src='" + url + "' width='" + imageWidth + "' height='" + imageHeight + "' alt='" + caption + "'/></a>" + "<div id='TB_caption'>" + caption + "<div id='TB_secondLine'>" + imageCount + prev.html + next.html + "</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a></div>";
  
  $("TB_closeWindowButton").onclick = TB_remove;
  
  function buildClickHandler(image){
      return function(){
     $("TB_window").dispose();
     new Element('div').setProperty('id', 'TB_window').injectInside(document.body);
     
     TB_show(image.caption, image.url, rel);
     return false;
      };
  }
  var goPrev = buildClickHandler(prev);
  var goNext = buildClickHandler(next);
  if ($('TB_prev')) {
      $("TB_prev").onclick = goPrev;
  }
  
  if ($('TB_next')) {
      $("TB_next").onclick = goNext;
  }
  
  document.onkeydown = function(event){
      var event = new Event(event);
      switch (event.code) {
     case 27:
    TB_remove();
    break;
     case 190:
    if ($('TB_next')) {
        document.onkeydown = null;
        goNext();
    }
    break;
     case 188:
    if ($('TB_prev')) {
        document.onkeydown = null;
        goPrev();
    }
    break;
      }
  }
  
  // TODO don't remove loader etc., just hide and show later
  $("TB_ImageOff").onclick = TB_remove;
  TB_position();
  TB_showWindow();
   }
   imgPreloader.src = url;
   
    }
    else { //code to show html pages
   var queryString = url.match(/\?(.+)/)[1];
   var params = TB_parseQuery(queryString);
   
   TB_WIDTH = (params['width'] * 1) + 30;
   TB_HEIGHT = (params['height'] * 1) + 40;
   
   var ajaxContentW = TB_WIDTH - 30, ajaxContentH = TB_HEIGHT - 45;
   
   if (url.indexOf('TB_iframe') != -1) {
  urlNoQuery = url.split('TB_');
  $("TB_window").innerHTML += "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a></div></div><iframe frameborder='0' hspace='0' src='" + urlNoQuery[0] + "' id='TB_iframeContent' name='TB_iframeContent' style='width:" + (ajaxContentW + 29) + "px;height:" + (ajaxContentH + 17) + "px;' onload='TB_showWindow()'> </iframe>";
   }
   else {
  $("TB_window").innerHTML += "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>close</a></div></div><div id='TB_ajaxContent' style='width:" + ajaxContentW + "px;height:" + ajaxContentH + "px;'></div>";
   }
   
   $("TB_closeWindowButton").onclick = TB_remove;
   
   if (url.indexOf('TB_inline') != -1) {
  $("TB_ajaxContent").innerHTML = ($(params['inlineId']).innerHTML);
  TB_position();
  TB_showWindow();
   }
   else 
  if (url.indexOf('TB_iframe') != -1) {
      TB_position();
      if (frames['TB_iframeContent'] == undefined) {//be nice to safari
     $(document).keyup(function(e){
    var key = e.keyCode;
    if (key == 27) {
        TB_remove()
    }
     });
     TB_showWindow();
      }
  }
  else {
      var handlerFunc = function(){
     TB_position();
     TB_showWindow();
      };

				new Request.HTML({
     method: 'get',
     update: $("TB_ajaxContent"),
     onComplete: handlerFunc
      }).get(url);
  }
    }
    
    window.onresize = function(){
   TB_position();
   TB_load_position();
   TB_overlaySize();
    }
    
    document.onkeyup = function(event){
   var event = new Event(event);
   if (event.code == 27) { // close
  TB_remove();
   }
    }
    
}

//helper functions below

function TB_showWindow(){
    //$("TB_load").dispose();
    //$("TB_window").setStyles({display:"block",opacity:'0'});
    
    if (TB_doneOnce == 0) {
   TB_doneOnce = 1;
   
   $('TB_window').set('tween', {
  duration: 250,
  onComplete: function(){
      if ($('TB_load')) {
     $('TB_load').dispose();
      }
  }
   });
   $('TB_window').tween('opacity', 0, 1);
   
    }
    else {
   $('TB_window').setStyle('opacity', 1);
   if ($('TB_load')) {
  $('TB_load').dispose();
   }
    }
}

function TB_remove(){
    $("TB_overlay").onclick = null;
    document.onkeyup = null;
    document.onkeydown = null;
    
    if ($('TB_imageOff')) 
   $("TB_imageOff").onclick = null;
    if ($('TB_closeWindowButton')) 
   $("TB_closeWindowButton").onclick = null;
    if ($('TB_prev')) {
   $("TB_prev").onclick = null;
    }
    if ($('TB_next')) {
   $("TB_next").onclick = null;
    }
    
    
    $('TB_window').set('tween', {
   duration: 250,
   onComplete: function(){
  $('TB_window').dispose();
   }
    });
    $('TB_window').tween('opacity', 1, 0);
    
    
    
    $('TB_overlay').set('tween', {
   duration: 400,
   onComplete: function(){
  $('TB_overlay').dispose();
   }
    });
    $('TB_overlay').tween('opacity', 0.6, 0);
    
    window.onscroll = null;
    window.onresize = null;
    
    $('TB_HideSelect').dispose();
    TB_init();
    TB_doneOnce = 0;
    return false;
}

function TB_position(){
    $('TB_window').set('morph', {
   duration: 75
    });
    $('TB_window').morph({
		width: TB_WIDTH + 'px',
		left: (window.getScrollLeft() + (window.getWidth() - TB_WIDTH) / 2) + 'px',
		top: (window.getScrollTop() + (window.getHeight() - TB_HEIGHT) / 2) + 'px'
	});	
}

function TB_overlaySize(){
    // we have to set this to 0px before so we can reduce the size / width of the overflow onresize 
    $("TB_overlay").setStyles({
   "height": '0px',
   "width": '0px'
    });
    $("TB_HideSelect").setStyles({
   "height": '0px',
   "width": '0px'
    });
    $("TB_overlay").setStyles({
   "height": window.getScrollHeight() + 'px',
   "width": window.getScrollWidth() + 'px'
    });
    $("TB_HideSelect").setStyles({
   "height": window.getScrollHeight() + 'px',
   "width": window.getScrollWidth() + 'px'
    });
}

function TB_load_position(){
    if ($("TB_load")) {
   $("TB_load").setStyles({
  left: (window.getScrollLeft() + (window.getWidth() - 56) / 2) + 'px',
  top: (window.getScrollTop() + ((window.getHeight() - 20) / 2)) + 'px',
  display: "block"
   });
    }
}

function TB_parseQuery(query){
    // return empty object
    if (!query) 
   return {};
    var params = {};
    
    // parse query
    var pairs = query.split(/[;&]/);
    for (var i = 0; i < pairs.length; i++) {
   var pair = pairs[i].split('=');
   if (!pair || pair.length != 2) 
  continue;
   // unescape both key and value, replace "+" with spaces in value
   params[unescape(pair[0])] = unescape(pair[1]).replace(/\+/g, ' ');
    }
    return params;
}
