/**
* Name: piroBox v.1.2.2
* Date: May 2010
* Autor: Diego Valobra (http://www.pirolab.it),(http://www.diegovalobra.com)
* Version: 1.2.2
* Licence: CC-BY-SA http://creativecommons.org/licenses/by-sa/2.5/it/
*
* Tweaked by FES for the SOCS CMS - http://socs.fes.org
**/

(function($) {
  $.fn.piroBox = function(opt) {
    opt = jQuery.extend({
      overlay_color : null,
      my_speed : null,
      close_speed : 300,
      bg_alpha : 0.5,
      close_all : '.piro_close,.piro_overlay',
      slideShow : null,
      slideSpeed : null
    }, opt);

//BAH - Begin tweaking for SOCS
    var timer = null;
    var firstImage = false;

    // Need access to this outside of the start_pirobox function
    var piro_play = $(jQuery('<a href="#play" class="play" title="play slideshow"></a>'));

    function autoStart() {
      piro_play.click();
    }
//BAH - End

    function start_pirobox() {
//BAH - Begin tweaking for SOCS
      var articleID = '';

      // Don't want to show the "View Thumbnails" link if we're already viewing them - "vt=1" in the querystring means we're on the thumbnails page.
      var viewingThumbnails = new RegExp('[\\?&]vt=([^&#]*)').exec(window.location.href);
//BAH - End
      var corners = 
        '<tr>'+
          '<td colspan="3" class="pirobox_up"></td>'+
        '</tr>'+
        '<tr>'+
          '<td class="t_l"></td>'+
          '<td class="t_c"></td>'+
          '<td class="t_r"></td>'+
        '</tr>'+
        '<tr>'+
          '<td class="c_l"></td>'+
          '<td class="c_c"><span><span></span></span><div></div></td>'+
          '<td class="c_r"></td>'+
        '</tr>'+
        '<tr>'+
          '<td class="b_l"></td>'+
          '<td class="b_c"></td>'+
          '<td class="b_r"></td>'+
        '</tr>'+
        '<tr>'+
          '<td colspan="3" class="pirobox_down"></td>'+
        '</tr>';
      var window_height =  $(document).height();
      var bg_overlay = $(jQuery('<div class="piro_overlay"></div>').hide().css({'opacity':+opt.bg_alpha,'height':window_height+'px'}));
//BAH - Begin tweaking for SOCS
      if (opt.overlay_color) bg_overlay.css('background-color', opt.overlay_color);
//BAH - End
      var main_cont = $(jQuery('<table class="pirobox_content" cellpadding="0" cellspacing="0"></table>'));
      var caption = $(jQuery('<div class="caption"></div>'));
      var piro_nav = $(jQuery('<div class="piro_nav"></div>'));
      var piro_close = $(jQuery('<a href="#close" class="piro_close" title="close"></a>'));
//BAH - Orig      var piro_play = $(jQuery('<a href="#play" class="play" title="play slideshow"></a>'));
      var piro_stop = $(jQuery('<a href="#stop" class="stop" title="stop slideshow"></a>'));
      var piro_prev = $(jQuery('<a href="#prev" class="piro_prev" title="previous image"></a>'));
      var piro_next = $(jQuery('<a href="#next" class="piro_next" title="next image"></a>'));
      $('body').append(bg_overlay).append(main_cont);
      main_cont.append(corners);
      $('.pirobox_up').append(piro_close);
      $('.pirobox_down').append(piro_nav);
      $('.pirobox_down').append(piro_play);
      piro_play.hide();
      $('.pirobox_down').append(piro_prev).append(piro_next);
      piro_nav.append(caption);
      var my_nav_w = piro_prev.width();
      main_cont.hide();
      var my_gall_classes = $("a[class^='pirobox']");
      var map = new Object();
      for (var i=0; i<my_gall_classes.length; i++) {
        var it=$(my_gall_classes[i])
        map['a.'+it.attr('class')]=0;
      }
      var gall_settings = new Array();
      for (var key in map) {
        gall_settings.push(key);
      }
      for (var i=0; i<gall_settings.length; i++) {
        $(gall_settings[i]).each(function(rel){this.rel = rel+1 + "&nbsp;of&nbsp;" + $(gall_settings[i]).length;});
        var add_first = $(gall_settings[i]+':first').addClass('first');
        var add_last = $(gall_settings[i]+':last').addClass('last');
      }
      $(my_gall_classes).each(function(rev){this.rev = rev+0});
      var imgCache = $(my_gall_classes).each(function(){this.href});
      var hidden = $('body').append('<div id="imgCache" style="display:none"></div').children('#imgCache');
      $.each(imgCache, function (i,val) {
        $('<div/>').css({'background':'url('+val+')'/*,'width':'600px','height':'200px'*/}).appendTo(hidden);
      });
      var piro_gallery = $(my_gall_classes);
      $.fn.fixPNG = function() {
        return this.each(function () {
          var image = $(this).css('backgroundImage');
          if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
            image = RegExp.$1;
            $(this).css({
              'backgroundImage': 'none',
              'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"
            }).each(function () {
              var position = $(this).css('position');
              if (position != 'absolute' && position != 'relative') $(this).css('position', 'relative');
            });
          }
        });
      };
      $.browser.msie6 =($.browser.msie && /MSIE 6\.0/i.test(window.navigator.userAgent));
      if( $.browser.msie6 && !/MSIE 8\.0/i.test(window.navigator.userAgent)) {
        $('.t_l,.t_c,.t_r,.c_l,.c_r,.b_l,.b_c,.b_r,a.piro_next, a.piro_prev,a.piro_prev_out,a.piro_next_out,.c_c,.piro_close,a.play,a.stop').fixPNG();
        var ie_w_h =  $(document).height();
        bg_overlay.css('height',ie_w_h+ 'px'); 
      }
      if( $.browser.msie) {
        opt.close_speed = 0;
      }
      $(window).resize(function(){
        var new_w_bg = $(document).height();
        bg_overlay.css({'visibility':'visible','height':+ new_w_bg +'px'});
      });
      piro_prev.add(piro_next).bind('click',function(c) {
        c.preventDefault();
        var image_count = parseInt($(piro_gallery).filter('.item').attr('rev'));
        var start = $(this).is('.piro_prev_out,.piro_prev') ? $(piro_gallery).eq(image_count - 1) : $(piro_gallery).eq(image_count + 1);
        if(!start.size()) {
          start = $(this).is('.piro_prev_out,.piro_prev') ? $(piro_gallery).eq($(piro_gallery).size() - 1) : $(piro_gallery).eq(0);
        }
        start.click();
        piro_close.add(caption).add(piro_next).add(piro_prev).css('visibility','hidden');
      });
      $(piro_gallery).each(function(array) {
        var item = $(this);
        item.unbind(); 
        item.bind('click',function(c) {
          c.preventDefault();
          piro_open(item.attr('href'));
          var this_url = item.attr('href');
          //var descr = item.children('span').html();
//BAH - Begin tweaking for SOCS
//Orig          var descr = item.attr('title');
          var imgFilename = this_url.match(/.*\/(.*)$/)[1];
          var gallryNum = imgFilename.match(/^(.*)_/)[1];
          var $imgNotes = item.next();
          var articleIDTemp = $imgNotes.find('.articleID').text();
          if (articleIDTemp != '') articleID = articleIDTemp;
          var cutline = $imgNotes.find('.cutline').text();
          var credit = $imgNotes.find('.credit').text();
          var socsCaption = '<p>';
//BAH - End
          var number = item.attr('rel');
//BAH - Begin tweaking for SOCS
/* Orig
          if( descr == ""){
            caption.html('<p>'+ this_url+'<em class="number">' + number + '</em><a href='+ this_url +' class="link_to" target="_blank" title="Open Image in a new window"></a></p>');
          }else{
            caption.html('<p>'+ descr+'<em class="number">' + number + '</em><a href='+ this_url +' class="link_to" target="_blank" title="Open Image in a new window"></a></p>');
          }
*/

          if (!(item.is('.last') && item.is('.first'))) {
            // Don't want to show the "View Thumbnails" link if we're already viewing them - "vt=1" in the querystring means we're on the thumbnails page.
            if (!viewingThumbnails) {
              socsCaption += '<a href="/vnews/display.v?TARGET=showThumbnails&amp;article_id=' + articleID + '&amp;gn=' + gallryNum +
                '&amp;new_win=1&amp;vt=1" class="link_to_thumbnails" target="_blank" title="View thumbnail gallery in a new window">&mdash; View Thumbnails &mdash;</a>';
            }
          }
          if (cutline == '') {
            // Extract the filename from the ULR
            socsCaption += 'Filename: ' + imgFilename;
          } else {
            socsCaption += cutline;
          }
          if (credit != '') socsCaption += '<br />' + credit;
          socsCaption += '<em class="number">' + number + '</em><a href='+ this_url +' class="link_to" target="_blank" title="Open Image in a new window"></a></p>';
          caption.html(socsCaption);
//BAH - End
          if(item.is('.last')){
            $('.number').css('text-decoration','underline');
          }else{
            $('.number').css('text-decoration','none');
          }
          if(item.is('.first')){
            piro_prev.hide();
            piro_next.show();
          }else{
            piro_next.add(piro_prev).show();
          }
          if(item.is('.last')){
            piro_prev.show();
            piro_next.hide();
            piro_play.css('width','0');
          }else{
            piro_play.css('width','40px');
          }
          if(item.is('.last') && item.is('.first') ){
            piro_prev.add(piro_next).hide();
            $('.number').hide();
            piro_play.remove();
          }
          $(piro_gallery).filter('.item').removeClass('item');
          item.addClass('item');
          $('.c_c').removeClass('unique');
        });
      });
      var piro_open = function(my_url) {
        piro_play.add(piro_stop).hide();
        piro_close.add(caption).add(piro_next).add(piro_prev).css('visibility','hidden');
        if(main_cont.is(':visible')) {
          $('.c_c div').children().fadeOut(300, function() {
            $('.c_c div').children().remove();
            load_img(my_url);
          });
        } else {
          $('.c_c div').children().remove();
          main_cont.show();
          bg_overlay.fadeIn(300,function(){
            load_img(my_url);
//BAH - Begin tweaking for SOCS
            firstImage = true;
//BAH - End
          });
        }
      }
      var load_img = function(my_url) {
        if(main_cont.is('.loading')) {return;}
        main_cont.addClass('loading');
        var img = new Image();
        img.onerror = function (){
          var main_cont_h = $(main_cont).height();
          main_cont.css({marginTop : parseInt($(document).scrollTop())-(main_cont_h/1.9)});
          $('.c_c div').append('<p class="err_mess">There seems to be an Error:&nbsp;<a href="#close" class="close_pirobox">Close Pirobox</a></p>');
          $('.close_pirobox').bind('click',function(c) {
            c.preventDefault();
            piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).hide(0,function(){ img.src = '';});
            main_cont.removeClass('loading');
          });
        }
        img.onload = function() {
          var imgH = img.height;
          var imgW = img.width;
          var main_cont_h = $(main_cont).height();
          var w_H = $(window).height();
          var w_W = $(window).width();
//BAH - Begin tweaking for SOCS
          // If necessary, resize image to fit within browser window
          // The border around the image is 40px - use 50px to keep it off the chrome
          if (imgH + 50 > w_H) {
            var reduceH = (imgH + 50) - w_H;
            imgH -= reduceH;
            imgW -= reduceH;
          }
          if (imgW + 50 > w_W) {
            var reduceW = (imgW + 50) - w_W;
            imgH -= reduceW;
            imgW -= reduceW;
          }
//BAH - End
          $(img).height(imgH).width(imgW).hide();
          $('.c_c div').animate({height:imgH+'px',width:imgW+'px'},opt.my_speed);
          var fix = imgH/w_H*2.3;
          if(w_H < imgH){h_fix = fix;}else{h_fix = 2;}
          main_cont.animate({
            height : (imgH+40) + 'px' ,
            width : (imgW+40) + 'px' , 
            marginLeft : '-' +((imgW)/2+20) +'px',
//BAH - Orig            marginTop : parseInt($(document).scrollTop())-(imgH/h_fix)
//BAH - Begin tweaking for SOCS
            marginTop : parseInt($(document).scrollTop())-((imgH + 40)/h_fix)
//BAH - End
          },opt.my_speed, function(){
            $('.piro_nav,.caption').css({width:(imgW)+'px','margin-bottom':'10px'});
            $('.piro_nav').css('margin-left','-'+(imgW)/2+'px');
            var caption_height = caption.height();
            $('.c_c div').append(img);
            piro_close.css('display','block');
            piro_next.add(piro_prev).add(piro_close).css('visibility','visible');
            caption.css({'visibility':'visible','display':'block','opacity':'0.8','overflow':'hidden'});
            main_cont.hover(
              function(){caption.stop().fadeTo(200,0.8);},
              function(){caption.stop().fadeTo(200,0);}
            );
            $(img).fadeIn(300);
            main_cont.removeClass('loading');
            if(opt.slideShow === true){
              piro_play.add(piro_stop).show();
            }else{
              piro_play.add(piro_stop).hide();
            }
//BAH - Begin tweaking for SOCS
            // If this is the first image in a "gallery" - setup a timer to "click the play button" = auto-start feature
            if (firstImage && piro_play.is(':visible')) {
              firstImage = false;
              timer = setTimeout(autoStart, opt.slideSpeed * 1000);
            }
//BAH - End
          });
        }
        img.src = my_url;
        $('html').bind("keyup", function (c) {
          if(c.keyCode == 27) {
            c.preventDefault();
            if($(img).is(':visible') || $('.c_c>div>p>a').is('.close_pirobox')){
              $(piro_gallery).removeClass('slideshow').removeClass('item');
//BAH - Begin tweaking for SOCS
//Orig              piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).hide(0,function(){ img.src = '';});
              piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).fadeOut(opt.close_speed);
//BAH - End
              main_cont.removeClass('loading');
              clearTimeout(timer);
              $(piro_gallery).children().removeAttr('class');
              $('.stop').remove();
              $('.c_c').append(piro_play);
              $('.sc_menu').css('display','none');
              $('ul.sc_menu li a').removeClass('img_active').css('opacity','0.4');
              piro_next.add(piro_prev).show().css({'top':'50%'});
              $(piro_gallery).children().fadeTo(100,1);
            }
          }
        });
        $('html').bind("keyup" ,function(e) {
          if ($('.item').is('.first')){
          }else if(e.keyCode == 37){
            e.preventDefault();
            if($(img).is(':visible')){
              clearTimeout(timer);
              $(piro_gallery).children().removeAttr('class');
              $('.stop').remove();
              $('.c_c').append(piro_play);
              piro_prev.click();
            }
          }
        });
        $('html').bind("keyup" ,function(z) {
          if ($('.item').is('.last')){
          }else if(z.keyCode == 39){
            z.preventDefault();
            if($(img).is(':visible')){
              clearTimeout(timer);
              $(piro_gallery).children().removeAttr('class');
              $('.stop').remove();
              $('.c_c').append(piro_play);
              piro_next.click();
              //alert('click')
            }
          }
        });
        var win_h = $(window).height();
        piro_stop.bind('click',function(x){
          x.preventDefault();
          clearTimeout(timer);
          $(piro_gallery).removeClass('slideshow');
          $('.stop').remove();
          $('.pirobox_down').append(piro_play);
          piro_next.add(piro_prev).css('width',my_nav_w+'px');
        });
        piro_play.bind('click',function(w){
          w.preventDefault();
          clearTimeout(timer);
          if($(img).is(':visible')){
            $(piro_gallery).addClass('slideshow');
            $('.play').remove();
            $('.pirobox_down').append(piro_stop);
          }
          piro_next.add(piro_prev).css({'width':'0px'});
          return slideshow();
        });
        $(opt.close_all).bind('click',function(c) {
          $(piro_gallery).removeClass('slideshow');
          clearTimeout(timer);
          if($(img).is(':visible')){
            c.preventDefault();
//BAH - Begin tweaking for SOCS
//Orig            piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).hide(0,function(){ img.src = '';});
            piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).fadeOut(opt.close_speed);
//BAH - End
            main_cont.removeClass('loading');
            $(piro_gallery).removeClass('slideshow');
            piro_next.add(piro_prev).css('width',my_nav_w+'px').hide();
            $('.stop').remove();
            $('.pirobox_down').append(piro_play);
            piro_play.hide();
          }
        });
        if(opt.slideShow === true){
          function slideshow(){
            if( $(piro_gallery).filter('.item').is('.last')){
              clearTimeout(timer);
              $(piro_gallery).removeClass('slideshow');
              $('.stop').remove();
              $('.pirobox_down').append(piro_play);
              piro_next.add(piro_prev).css('width',my_nav_w+'px');
            } else if($(piro_gallery).is('.slideshow' ) && $(img).is(':visible')){
              clearTimeout(timer);
              piro_next.click();
            }
          }
//BAH - Begin tweaking for SOCS
//Orig          var timer = setInterval(slideshow,opt.slideSpeed*1000 );
          timer = setInterval(slideshow,opt.slideSpeed*1000 );
//BAH - End
        }
      }
    }
    start_pirobox();
  }
})(jQuery);

