/*******************************************************************************
 jquery.mb.components
 Copyright (c) 2001-2011. Matteo Bicocchi (Pupunzi); Open lab srl, Firenze - Italy
 email: mbicocchi@open-lab.com
 site: http://pupunzi.com

 Licences: MIT, GPL
 http://www.opensource.org/licenses/mit-license.php
 http://www.gnu.org/licenses/gpl.html
 ******************************************************************************/

/*
 * jQuery.mb.components: jquery.mb.linearGallery
 * version: 1.0
 * © 2001 - 2011 Matteo Bicocchi (pupunzi), Open Lab
 */


/*******************************************************************************
 jQuery.mb.components: jquery.mb.pagination
 version: 1.0
 © 2001 - 2011 Matteo Bicocchi (pupunzi), Open Lab

 inclusion: jquery.mb.pagination.js
 ******************************************************************************/

/*******************************************************************************
 jquery.mb.components
 Copyright (c) 2001-2011. Matteo Bicocchi (Pupunzi); Open lab srl, Firenze - Italy
 email: mbicocchi@open-lab.com
 site: http://pupunzi.com

 Licences: MIT, GPL
 http://www.opensource.org/licenses/mit-license.php
 http://www.gnu.org/licenses/gpl.html
 ******************************************************************************/

/*
 * jQuery.mb.components: jquery.mb.pagination
 * version: 1.0
 * © 2001 - 2011 Matteo Bicocchi (pupunzi), Open Lab
 */

$.fn.initPagination=function(c){var a=this.get(0);a.opt={elements:null,elsPerPage:null,navigationID:null,showNextPrev:null,showIdxList:null,showIdx:null,maxPage:null,nextLabel:"next",prevLabel:"prev"};$.extend(a.opt,c);if(a.opt.elements)a.opt.elements.hide(),a.paginationIDX=-1,a.pages=[],a.totPages=Math.ceil(a.opt.elements.length/a.opt.elsPerPage),$(a).buildIndex(a.opt.elements,a.opt.elsPerPage,a.opt.navigationID),$(a).paginateNext(a.opt.elements,a.opt.elsPerPage,a.opt.navigationID)}; $.fn.buildIndex=function(c,a,b){for(var d=this.get(0),f=d.opt.maxPage&&d.totPages>d.opt.maxPage?d.opt.maxPage:d.totPages,e=0;e<f;e++){d.pages[e]=[];for(var g=a*e;g<a*e+a;g++)0<c.eq(g).length&&d.pages[e].push(c.eq(g))}a=$("#"+b);1<d.totPages&&a.show();if(d.opt.showIdxList){a.find(".navIdx").remove();b=$("<div/>").addClass("navIdx");a.append(b);for(e=0;e<f;e++)g=$("<span/>").html(e+1).addClass("index").attr("idx",e),b.append(g),g.bind("click.pagination",function(){$(d).paginateIdx(c,$(this).attr("idx"))})}if(d.opt.showNextPrev){a.find(".navNextPrev").remove(); var h=$("<div/>").addClass("navNextPrev"),e=$("<span/>").addClass("next").html(d.opt.nextLabel).bind("click.pagination",function(a){$(d).paginateNext(c);a.stopPropagation()}),b=$("<span/>").addClass("prev").html(d.opt.prevLabel).bind("click.pagination",function(a){$(d).paginatePrev(c);a.stopPropagation()});h.append(b).append(e).append(i);a.prepend(h)}if(d.opt.showIdx){var i=$("<span/>").addClass("idx").html("1&#8211;"+f);h.append(i)}$(d).manageNav()}; $.fn.paginateNext=function(c){var a=this.get(0);if(!(a.paginationIDX>=(a.opt.maxPage&&a.totPages>a.opt.maxPage?a.opt.maxPage:a.totPages)-1)){a.paginationIDX++;c.hide();$("#"+a.opt.navigationID);var c=a.pages[a.paginationIDX],b;for(b in c)c[b].fadeIn(100);$(a).manageNav()}};$.fn.paginatePrev=function(c){var a=this.get(0);if(!(1>a.paginationIDX)){a.paginationIDX--;c.hide();var c=a.pages[a.paginationIDX],b;for(b in c)c[b].fadeIn(100);$(a).manageNav()}}; $.fn.paginateIdx=function(c,a){var b=this.get(0);c.hide();b.oldPaginationIDX=b.paginationIDX;b.paginationIDX=a;$(b).manageNav();var d=b.pages[b.paginationIDX],f;for(f in d)d[f].show();f=0;b.oldPaginationIDX>b.paginationIDX&&(f=d.length-1);b.oldPaginationIDX!=b.paginationIDX&&d[f].click()};$.fn.getPageFromIndex=function(c,a){var b=this.get(0);if(!a)a=b.opt.elsPerPage;var d=Math.floor((c-1)/a);b.paginationIDX!=d&&$(".index").eq(d).click()}; $.fn.manageNav=function(){var c=this.get(0),a=c.opt.maxPage&&c.totPages>c.opt.maxPage?c.opt.maxPage:c.totPages,b=$("#"+c.opt.navigationID),d=b.find("[idx]").eq(c.paginationIDX);b.find("[idx]").removeClass("sel");d.addClass("sel");1>=c.totPages?(b.find(".prev").remove(),b.find(".next").remove(),b.find(".index").remove()):(0==c.paginationIDX?b.find(".prev").addClass("disabled"):b.find(".prev").removeClass("disabled"),c.paginationIDX==a-1?b.find(".next").addClass("disabled"):b.find(".next").removeClass("disabled"), c.opt.showIdx&&b.find(".idx").html(c.paginationIDX+1+"&#8211;"+a))};

/*******************************************************************************
 end inclusion
 ******************************************************************************/

(function($) {

  $.mbLinearGallery={
    name:"mb.linearGallery",
    author:"Matteo Bicocchi",
    version:"1.0",

    defaults:{
      elements:[], // if empty get children
      thumbPlaceHolder:"#thumbs",
      resizeEnabled:false,
      transitionTime:600,
      imageWrapperWidth:"50%",
      imageMinWidth:550,
      defaultScale:.2,
      defaultOpacity:.4,
      enableZoom:true,
      onStart:function(){},
      onChange:function(){},
      onCreateThumbs:function(){}
    },

    build:function(opt){
      return this.each(function(){
        var gallery=this;
        var $gallery=$(gallery);

        $gallery.children().hide();

        gallery.opt={};
        $.extend(gallery.opt,$.mbLinearGallery.defaults,opt);

        if (gallery.opt.elements.length == 0){
          gallery.opt.elements = $gallery.children();
        }

        var galleryWrapper=$("<div/>").addClass("galleryWrapper");
        $gallery.append(galleryWrapper);

        galleryWrapper.css({
          overflow:"hidden",
          position: "relative",
          whiteSpace: "nowrap",
          "-moz-box-sizing": "border-box",
          verticalAlign: "top"
        });

        for(var i=0; i<= gallery.opt.elements.length-1;i++){
          var newImg=$.mbLinearGallery.buildImage(gallery,gallery.opt.elements[i],i+1);
          galleryWrapper.append(newImg);
          $.mbLinearGallery.buildThumbs(gallery,gallery.opt.elements[i]);
        }

        // Add empty elements at the beginning and at the end.
        galleryWrapper.prepend($.mbLinearGallery.buildImage(gallery));
        galleryWrapper.append($.mbLinearGallery.buildImage(gallery));

        // set the height of the gallery
        galleryWrapper.css({height:$(".galleryWrapper").parent().height()});

        var elements=$(".element",".elementWrapper");
        elements.each(function(i){
          var el = $(this);
          el.css({width:"auto",height:"100%"}).hide();

          function initElements(el) {
            setTimeout(function() {
              if (el.width() >= el.parent().width()) {
                el.css({width:"100%",height:"auto"});
              }
              $(".imageDesc").css({position:"absolute", left:$("img", el.parent()).position().left, width:$("img", el.parent()).width()});
              el.fadeIn(3000);
            }, 1000);
          }

          if(el.is("img"))
            el.load(function(){
              initElements(el);
            });
          else
            initElements(el);

        });

        $(window).resize(function(){$.mbLinearGallery.refresh(gallery)});

        if(typeof gallery.opt.onCreateThumbs=="function")
          gallery.opt.onCreateThumbs(gallery.opt.thumbPlaceHolder);

        $gallery.goTo(1,false);

        if(typeof gallery.opt.onStart == "function")
          gallery.opt.onStart();

      });
    },

    buildImage:function(gallery, imgObj, idx){
      var elementWrapper= $("<div/>").addClass("elementWrapper");

      elementWrapper.css({
        position: "relative",
        overflow:"hidden",
        width: gallery.opt.imageWrapperWidth,
        minWidth: gallery.opt.imageMinWidth,
        height: "101%",
        display: "inline-block",
        "text-align": "center",
        "-moz-box-sizing": "border-box",
        padding: 0,
        "vertical-align":"top"
      }).click(function(){
        if($(this).children().length>0){
          var idx= $(this).index();
          $(gallery).goTo(idx,true);
        }
      });

      if(typeof imgObj == "object"){
        var url= imgObj.url ? imgObj.url : $(imgObj).attr("src");
        var link= imgObj.link ? imgObj.link : $(imgObj).data("link");
        var element;

        if($(imgObj).data("nozoom") || link)
          elementWrapper.addClass("noZoom");



        if(url){
          element=$("<img>").addClass("galleryImage element").css({position:"relative"});
          element.css({
            margin: "auto",
            cursor: "pointer",
            height: "100%"
          });
          element.attr("src",url);
        }else{
          element=$("<div/>").addClass("galleryBox element").css({position:"relative"});
          element.css({
            margin: "auto",
            cursor: "pointer",
            height: "100%"
          });
          var c= $(imgObj).clone().css({height: $(gallery).height()}).show();
          element.html(c);
        }

        if(idx){
          element.data("index",idx);
        }
        elementWrapper.append(element);

        //custom for Officine Grafiche
        var descIt=$("<span data-lang='it'></span>").html($(imgObj).data("desc-it"));
        var descEn=$("<span data-lang='en'></span>").html($(imgObj).data("desc-en"));

        if(descIt){
          var description=$("<div>").addClass("imageDesc")
            .css({position:"absolute",left:element.position().left, width:elementWrapper.width(), display:"none"}).append(descIt).append(descEn).hide();
          elementWrapper.append(description);
          if(element.data("index")==1){
            description.fadeIn();
          }
        }
        if(link){
          element.addClass("link");
          element.click(function(){
            var idx= element.data("index");
            if(idx == gallery.opt.actualIdx ){
              window.open(link);
            }
          });
        }else if(gallery.opt.enableZoom && !$(imgObj).data("nozoom")){

          var anim;

          element.click(function(){
            var idx= element.data("index");
            if(idx == gallery.opt.actualIdx ){
              var t=gallery.opt.transitionTime/1.5;
              var zoomEl=$(this).clone().addClass("zoomEl");
              var zoomDesc=$(this).parent().find(".imageDesc").clone().addClass("zoomDesc");
              zoomDesc.css({position:"absolute",left:$(this).offset().left, width:$(this).outerWidth()}).hide();

              var startTop=$(this).offset().top;
              zoomEl.css({position:"absolute", top:startTop,left:$(this).offset().left, width:$(this).width(), height:$(this).height()});

              var overlay=$("<div>").addClass("overlay").hide();
              $(overlay).append(zoomEl);
              $(overlay).append(zoomDesc);
              $("body").append(overlay);

              var isHorizzontal=zoomEl.height()<zoomEl.width();

              var scale=isHorizzontal ? ($(window).width()*70/zoomEl.width())/100: ($(window).height()*80/zoomEl.height())/100;

              var elTop=($(window).height()-zoomEl.height())/2;

              overlay.fadeIn(t*2, function(){
                anim = $.support.transition ? {scale: scale, top:elTop} : {top:elTop};
                zoomEl.animate(anim,t,function(){});
                zoomDesc.fadeIn();
              });
              overlay.one("click",function(){
                zoomDesc.fadeOut();
                anim= $.support.transition ? {scale: '1', top:startTop} : {top:startTop};

                zoomEl.animate(anim, t, function(){
                  overlay.fadeOut(t*2,function(){overlay.remove()});
                });
              });
            }
          });
        }
      }
      return elementWrapper;
    },

    buildThumbs:function(gallery,imgObj){

      var thumbPlaceHolder= $(gallery.opt.thumbPlaceHolder);
      var thumbURL = imgObj.thumb ? imgObj.thumb : $(imgObj).data("thumb");
      thumbURL = thumbURL ? thumbURL : imgObj.src;
      var thumbTitle=imgObj.title; //.replace(/\|/g,".")
      var thumb=$("<img>").addClass("imgThumb").hide().load(function(){
        thumb.fadeIn(2000);
      }).attr({"src":thumbURL});
      var thumbWrapper= $("<div>").addClass("thumbWrapper");

      thumbWrapper.append(thumb);

      thumbWrapper.click(function(){
        if($(this).find("img").length>0){
          var idx= $(this).index()+1;
          $(gallery).goTo(idx,true);
        }
      });

      thumbWrapper.bind("mouseenter",function(){

        var titleDiv=$("<div>").addClass("thumbTitle");
        titleDiv.html(thumbTitle);
        titleDiv.css({position:"absolute", top:$(this).offset().top+$(this).height(), left:$(this).offset().left});
        $("body").append(titleDiv);
      }).bind("mouseleave",function(){
        $(".thumbTitle").remove();
      });

      thumbPlaceHolder.append(thumbWrapper);
    },

    goTo:function(idx, anim){
      var g= this.get(0);

      if(anim==undefined)
        anim=true;

      if(idx==g.opt.actualIdx && anim)
        return;

      g.opt.actualIdx=idx;

      var gallery=$(".galleryWrapper",g);
      var target= $(".elementWrapper").eq(g.opt.actualIdx);
      var allImages= $(".elementWrapper",g);

      var t=anim? g.opt.transitionTime:0;

      var transitionOut= $.support.transition ? {opacity:g.opt.defaultOpacity, scale: g.opt.defaultScale} : {opacity:g.opt.defaultOpacity};

      allImages.animate(transitionOut,t/1.5,function(){
        allImages.removeClass("sel");
        target.addClass("sel");
        if(g.opt.enableZoom && !target.hasClass("noZoom"))
          target.addClass("zoom");
        allImages.css("z-index",0);
        target.css("z-index",1);
        if(anim)
          $(".imageDesc", $(this)).fadeOut();
      });

      var transitionIn=$.support.transition ? {opacity:1, scale: '1'} : {opacity:1};

      target.animate(transitionIn,t/2,function(){
        if(anim)
          $(".imageDesc", target).fadeIn();
        $(".imageDesc", target).css({position:"absolute",left:$(".element",target).position().left, width:$(".element",target).width()});
      });

      var thumbContainer=$(g.opt.thumbPlaceHolder);
      $(".thumbWrapper",thumbContainer).removeClass("sel");
      var targetThumb= $(".thumbWrapper",thumbContainer).eq(g.opt.actualIdx-1);
      targetThumb.addClass("sel");

      var scrollLeft = (target.width()*g.opt.actualIdx) - (($(".galleryWrapper",g).outerWidth()-target.outerWidth())/2);

      $(".galleryWrapper",g).animate({scrollLeft:scrollLeft},t,function(){ //"easeOutSine",
        if(typeof g.opt.onChange == "function"){
          g.opt.onChange(g.opt.actualIdx);
        }
      });

    },

    refresh:function(gallery){

      var galleryWrapper= $(".galleryWrapper",$(gallery));
      var elements=$(".element",".elementWrapper");
      var prop = galleryWrapper.height()/ galleryWrapper.width();


      galleryWrapper.css({height:$(gallery).height()});

      elements.each(function(){
        $(this).css({width:"auto",height:"100%"});
        if($(this).width()>=$(this).parent().width()){
          $(this).css({width:"100%",height:"auto"})
        }
      });

      var h= $(".galleryWrapper",$(gallery)).width()*prop;

      if(gallery.opt.resizeEnabled){
        $(".galleryWrapper",$(gallery)).css({height:h});
      }

      $(gallery).goTo(gallery.opt.actualIdx,false);

    }
  };

  $.fn.mbLinearGallery= $.mbLinearGallery.build;
  $.fn.goTo= $.mbLinearGallery.goTo;

})(jQuery);
