/* * * (mb)ImageNavigator * developed by Matteo Bicocchi on JQuery * 2002-2009 Open Lab srl, Matteo Bicocchi * www.open-lab.com - info@open-lab.com * version 2.0 * tested on: Explorer and FireFox for PC * FireFox and Safari for Mac Os X * FireFox for Linux * GPL (GPL-LICENSE.txt) licenses. * * */ (function($){ jQuery.fn.imageNavigator = function (options){ return this.each (function () { this.options={ areaWidth: 500, areaHeight:500, defaultnavWidth:150, draggerStyle:"2px dotted red", navOpacity:.8, loaderUrl:"loading.gif", additionalContenet:"" }; $.extend (this.options, options); options= this.options; var imgNav= this; var additionalContent, draggableElement, applContainer,image,imageW,imageH,imageContainer,imageContainerW,imageContainerH,navLocator,navigationThumb,navigationThumbW,navigationThumbH,nav,navW,navH,image_isHoriz,cont_isHoriz,ratio,actualIdx=0,onScreen=false,navCoordinateX,navCoordinateY; $(imgNav).css({ width : imgNav.options.areaWidth }); var images= $(imgNav).find(".imagesContainer"); $(imgNav).empty(); if ($.metadata){ $.metadata.setType("class"); $(images).each(function(){ if ($(this).metadata().imageUrl) $(this).attr("imageUrl",$(this).metadata().imageUrl); if ($(this).metadata().navPosition) $(this).attr("navPosition",$(this).metadata().navPosition); if ($(this).metadata().navWidth) $(this).attr("navWidth",$(this).metadata().navWidth); if ($(this).metadata().NavCoordinates) $(this).attr("NavCoordinates",$(this).metadata().NavCoordinates); }); } var imageURL=$(images[0]).attr("imageUrl"); var navPos=$(images[0]).attr("navPosition"); var navWidth= $(images[0]).attr("navWidth")?$(this).attr("navWidth"):imgNav.options.defaultnavWidth;//100; var titles=$(images).find(".title"); var descriptions=$(images).find(".description"); var additionalContents=$(images).find(".additionalContent"); var navCoordinateX=$(images[0]).attr("NavCoordinates").split(",")[0]; var navCoordinateY=$(images[0]).attr("NavCoordinates").split(",")[1]; $(imgNav).append("
"); imageContainer=$(imgNav).find(".imageContainer"); $(imageContainer).css({ overflow:"hidden", position: "relative", width:this.options.areaWidth+"px", height:this.options.areaHeight+"px" }); var loader=""; $(imageContainer).append(loader); $(imgNav).prepend("
"); var imagesIndex=$(imgNav).find(".imagesIndex"); $(imagesIndex).css({ position: "relative", width:this.options.areaWidth, padding: "0" }); $(imagesIndex).append(titles); var canClick=true; $(titles).each(function(i){ $(this).click(function(){ if (!canClick) return; actualIdx=i; canClick=false; imageURL=$(images[i]).attr("imageUrl"); navPos=$(images[i]).attr("navPosition"); navWidth= $(images[i]).attr("navWidth")?$(images[i]).attr("navWidth"):imgNav.options.defaultnavWidth;//100; if ($(images[i]).attr("NavCoordinates")){ navCoordinateX=$(images[i]).attr("NavCoordinates").split(",")[0]; navCoordinateY=$(images[i]).attr("NavCoordinates").split(",")[1]; //console.log(navCoordinateX,navCoordinateY); } if(image) $(image).fadeOut(500, function() { startNav(imageURL); }); else startNav(imageURL); }); }); $(imgNav).append("
"); var descriptionBox=$(imgNav).find(".descriptionBox"); $(descriptionBox).html(descriptions[0]); function startNav(u) { navW=null; ratio=null; if (applContainer){ $(applContainer).remove(); } $(titles).each(function(i){ if (i==actualIdx) $(this).addClass("selected"); else $(this).removeClass("selected"); }); navW=navWidth; var imageObj = new Image(); imageObj.src=null; u=u+"?rdm="+Math.random(); imageObj.src = u; imageObj.onload =function(){buildnav(u);}; imageObj.onerror = imageFailed; $("#loader").fadeIn(500); } function imageFailed() { alert("non riesco a caricare: "+this.src); } function buildnav(u) { imageContainerW=$(imageContainer).width(); imageContainerH=$(imageContainer).height(); $("#loader").fadeOut(500, function(){canClick=true;}); $(titles).bind("click",function(){return true;}); $(imageContainer).mouseenter(function(){ if($.browser.msie) $(nav).show(); else $(nav).show(); }); $(imageContainer).mouseleave(function(){ if($.browser.msie) $(nav).hide(); else $(nav).hide(); }); //applContainer $(imageContainer).append("
"); applContainer = $(imgNav).find(".applContainer"); $(applContainer).css({ position:"relative", height:$(imageContainer).height() }); $(applContainer).append("
"); draggableElement=$(applContainer).find(".draggableElement"); //todo: add a div for image containment //image $(draggableElement).append(""); image= $(draggableElement).find(".navImage"); //additionalContent $(draggableElement).append("
"); additionalContent=$(draggableElement).find(".additionalContent"); $(additionalContent).css({position:"absolute", top:"0"}); $(draggableElement).css({ position:"absolute" }); $(descriptionBox).html(descriptions[actualIdx]); $(additionalContent).html(additionalContents[actualIdx]); $(image).attr("src",u); $(image).hide(); imageH=$(image).outerHeight(); imageW=$(image).outerWidth(); $(image).fadeIn(1000, function(){ var t,l; if (!$(images[actualIdx]).attr("NavCoordinates")){ t=-(imageH/2-($(nav).height()*3)); l=-(imageW/2-($(nav).width()*3)); }else{ t=-(navCoordinateY-($(imageContainer).height()/2)); l=-(navCoordinateX-($(imageContainer).width()/2)); if (t>0) t=0; if (l>0) l=0; } //console.log(navCoordinateY) $(draggableElement).animate({ top:t, left:l },500,"linear"); refreshThumbPos(l,t); }); $(draggableElement).draggable({ containment:[$(imageContainer).offset().left-imageW+$(imageContainer).outerWidth(),$(imageContainer).offset().top-imageH+$(imageContainer).outerHeight(),$(imageContainer).offset().left,$(imageContainer).offset().top], start:function(){ $(nav).hide(); $(draggableElement).css({cursor:"move"}); }, drag:function(e,ui){ //console.info('ui.position.left=%f, ui.position.top=%f', ui.position.left,ui.position.top); }, stop:function(e,ui){ refreshThumbPos(ui.position.left,ui.position.top); $(draggableElement).css({cursor:"default"}); $(nav).show(); } }); $(draggableElement).bind("dblclick", function(){fitonScreen();}); //nav SCREEN $(applContainer).append(""); nav = $(imgNav).find(".nav"); $(nav).css({ position:"absolute", opacity: imgNav.options.navOpacity }); //ZONE SELECTOR $(nav).append(""); navLocator= $(imgNav).find("#navLocator"); $(navLocator).css({ zIndex: 10000, position: "absolute", border : imgNav.options.draggerStyle, backgroundColor: $.browser.msie?"white":"transparent", opacity: $.browser.msie?.5:1 }); $(nav).hide(1); $(navLocator).bind("dblclick",function(){fitonScreen();}); $(navLocator).draggable({ containment: 'parent', start:function(){ $(navLocator).css({cursor:"move"}); }, drag:function(e,ui){ //console.info('ui.position.left=%f, ui.position.top=%f', ui.position.left,ui.position.top); if (ui.position.left<0||ui.position.top<-1) { return false; } refreshImagePos(ui.position.left,ui.position.top); }, stop:function(){ $(navLocator).css({cursor:"default"}); } }); //THUMB $(nav).append(""); navigationThumb= $(imgNav).find(".navigationThumb"); $(navigationThumb).attr("src",u); $(navigationThumb).bind("dblclick",function(){fitonScreen();}); image_isHoriz= imageH < imageW; cont_isHoriz= imageContainerH < imageContainerW; ratio= imageH/navH; resetAllValue(); } function fitonScreen(){ if(!onScreen){ navLocator.oldX=$(navLocator).css("left"); navLocator.oldY=$(navLocator).css("top"); draggableElement.oldX=$(draggableElement).css("left"); draggableElement.oldY=$(draggableElement).css("top"); var controller=((navW*imageContainerH)/navH)