PageRenderTime 59ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/jquery.mbImgNavigator/inc/mbImgNav.js

http://mbideasproject.googlecode.com/
JavaScript | 428 lines | 348 code | 52 blank | 28 comment | 25 complexity | 42ccc549fa2d57acd3f9e552c10d1e5e MD5 | raw file
Possible License(s): GPL-2.0
  1. /*******************************************************************************
  2. jquery.mb.components
  3. Copyright (c) 2001-2010. Matteo Bicocchi (Pupunzi); Open lab srl, Firenze - Italy
  4. email: info@pupunzi.com
  5. site: http://pupunzi.com
  6. Licences: MIT, GPL
  7. http://www.opensource.org/licenses/mit-license.php
  8. http://www.gnu.org/licenses/gpl.html
  9. ******************************************************************************/
  10. /*
  11. * Name:jquery.mb.imageNavigator
  12. * Version: 2.0
  13. */
  14. (function($){
  15. jQuery.fn.imageNavigator = function (options){
  16. return this.each (function ()
  17. {
  18. this.options={
  19. areaWidth: 500,
  20. areaHeight:500,
  21. defaultnavWidth:150,
  22. draggerStyle:"2px dotted red",
  23. navOpacity:.8,
  24. loaderUrl:"loading.gif",
  25. additionalContenet:""
  26. };
  27. $.extend (this.options, options);
  28. options= this.options;
  29. var imgNav= this;
  30. 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;
  31. $(imgNav).css({
  32. width : imgNav.options.areaWidth
  33. });
  34. var images= $(imgNav).find(".imagesContainer");
  35. $(imgNav).empty();
  36. if ($.metadata){
  37. $.metadata.setType("class");
  38. $(images).each(function(){
  39. if ($(this).metadata().imageUrl) $(this).attr("imageUrl",$(this).metadata().imageUrl);
  40. if ($(this).metadata().navPosition) $(this).attr("navPosition",$(this).metadata().navPosition);
  41. if ($(this).metadata().navWidth) $(this).attr("navWidth",$(this).metadata().navWidth);
  42. if ($(this).metadata().NavCoordinates) $(this).attr("NavCoordinates",$(this).metadata().NavCoordinates);
  43. });
  44. }
  45. var imageURL=$(images[0]).attr("imageUrl");
  46. var navPos=$(images[0]).attr("navPosition");
  47. var navWidth= $(images[0]).attr("navWidth")?$(this).attr("navWidth"):imgNav.options.defaultnavWidth;//100;
  48. var titles=$(images).find(".title");
  49. var descriptions=$(images).find(".description");
  50. var additionalContents=$(images).find(".additionalContent");
  51. $(imgNav).append("<div class='imageContainer'></div>");
  52. imageContainer=$(imgNav).find(".imageContainer");
  53. $(imageContainer).css({
  54. overflow:"hidden",
  55. position: "relative",
  56. width:this.options.areaWidth+"px",
  57. height:this.options.areaHeight+"px"
  58. });
  59. var loader="<table id='loader' style='display:none;' cellpadding='0' cellspacing='0' width='100%' height='100%'><tr><td valign='middle' align='center'><img src='"+imgNav.options.loaderUrl+"' alt='loading'></td></tr></table>";
  60. $(imageContainer).append(loader);
  61. $(imgNav).prepend("<div class='imagesIndex'></div>");
  62. var imagesIndex=$(imgNav).find(".imagesIndex");
  63. $(imagesIndex).css({
  64. position: "relative",
  65. width:this.options.areaWidth,
  66. padding: "0"
  67. });
  68. $(imagesIndex).append(titles);
  69. var canClick=true;
  70. $(titles).each(function(i){
  71. $(this).click(function(){
  72. if (!canClick) return;
  73. actualIdx=i;
  74. canClick=false;
  75. imageURL=$(images[i]).attr("imageUrl");
  76. navPos=$(images[i]).attr("navPosition");
  77. navWidth= $(images[i]).attr("navWidth")?$(images[i]).attr("navWidth"):imgNav.options.defaultnavWidth;//100;
  78. if ($(images[i]).attr("NavCoordinates")){
  79. navCoordinateX=$(images[i]).attr("NavCoordinates").split(",")[0];
  80. navCoordinateY=$(images[i]).attr("NavCoordinates").split(",")[1];
  81. //console.log(navCoordinateX,navCoordinateY);
  82. }
  83. if(image)
  84. $(image).fadeOut(500, function() {
  85. startNav(imageURL);
  86. });
  87. else
  88. startNav(imageURL);
  89. });
  90. });
  91. $(imgNav).append("<div class='descriptionBox'></div>");
  92. var descriptionBox=$(imgNav).find(".descriptionBox");
  93. $(descriptionBox).html(descriptions[0]);
  94. function startNav(u) {
  95. navW=null;
  96. ratio=null;
  97. if (applContainer){
  98. $(applContainer).remove();
  99. }
  100. $(titles).each(function(i){
  101. if (i==actualIdx)
  102. $(this).addClass("selected");
  103. else
  104. $(this).removeClass("selected");
  105. });
  106. navW=navWidth;
  107. var imageObj = new Image();
  108. imageObj.src=null;
  109. u=u+"?rdm="+Math.random();
  110. imageObj.src = u;
  111. imageObj.onload =function(){buildnav(u);};
  112. imageObj.onerror = imageFailed;
  113. $("#loader").fadeIn(500);
  114. }
  115. function imageFailed() {
  116. alert("non riesco a caricare: "+this.src);
  117. }
  118. function buildnav(u) {
  119. imageContainerW=$(imageContainer).width();
  120. imageContainerH=$(imageContainer).height();
  121. $("#loader").fadeOut(500, function(){canClick=true;});
  122. $(titles).bind("click",function(){return true;});
  123. $(imageContainer).click(function(){
  124. if($.browser.msie) $(nav).show();
  125. else
  126. $(nav).show();
  127. });
  128. $(imageContainer).mouseleave(function(){
  129. if($.browser.msie) $(nav).hide();
  130. else
  131. $(nav).hide();
  132. });
  133. //applContainer
  134. $(imageContainer).append("<div class='applContainer'></div>");
  135. applContainer = $(imgNav).find(".applContainer");
  136. $(applContainer).css({
  137. position:"relative",
  138. height:$(imageContainer).height()
  139. });
  140. $(applContainer).append("<div class='draggableElement'></div>");
  141. draggableElement=$(applContainer).find(".draggableElement");
  142. //todo: add a div for image containment
  143. //image
  144. $(draggableElement).append("<image class='navImage'>");
  145. image= $(draggableElement).find(".navImage");
  146. //additionalContent
  147. $(draggableElement).append("<div class='additionalContent'></div>");
  148. additionalContent=$(draggableElement).find(".additionalContent");
  149. $(additionalContent).css({position:"absolute", top:"0"});
  150. $(draggableElement).css({
  151. position:"absolute"
  152. });
  153. $(descriptionBox).html(descriptions[actualIdx]);
  154. $(additionalContent).html(additionalContents[actualIdx]);
  155. $(image).attr("src",u);
  156. $(image).hide();
  157. imageH=$(image).outerHeight();
  158. imageW=$(image).outerWidth();
  159. $(image).fadeIn(1000, function(){
  160. var t,l;
  161. if (!$(images[actualIdx]).attr("NavCoordinates")){
  162. t=-(imageH/2-($(nav).height()*3));
  163. l=-(imageW/2-($(nav).width()*3));
  164. }else{
  165. t=-(navCoordinateY-($(imageContainer).height()/2));
  166. l=-(navCoordinateX-($(imageContainer).width()/2));
  167. if (t>0) t=0;
  168. if (l>0) l=0;
  169. }
  170. //console.log(!$(images[actualIdx]).attr("NavCoordinates"), t, l)
  171. $(draggableElement).animate({
  172. top:t,
  173. left:l
  174. },500,"linear");
  175. refreshThumbPos(l,t);
  176. });
  177. $(draggableElement).draggable({
  178. containment:[$(imageContainer).offset().left-imageW+$(imageContainer).outerWidth(),$(imageContainer).offset().top-imageH+$(imageContainer).outerHeight(),$(imageContainer).offset().left,$(imageContainer).offset().top],
  179. start:function(){
  180. $(nav).hide();
  181. $(draggableElement).css({cursor:"move"});
  182. },
  183. stop:function(e,ui){
  184. refreshThumbPos(ui.position.left,ui.position.top);
  185. $(draggableElement).css({cursor:"default"});
  186. $(nav).show();
  187. }
  188. });
  189. $(draggableElement).bind("dblclick", function(){fitonScreen();});
  190. //nav SCREEN
  191. $(applContainer).append("<div class='nav'></div>");
  192. nav = $(imgNav).find(".nav");
  193. $(nav).css({
  194. position:"absolute",
  195. opacity: imgNav.options.navOpacity
  196. });
  197. //ZONE SELECTOR
  198. $(nav).append("<div id='navLocator'></div>");
  199. navLocator= $(imgNav).find("#navLocator");
  200. $(navLocator).css({
  201. zIndex: 10000,
  202. position: "absolute",
  203. border : imgNav.options.draggerStyle,
  204. backgroundColor: $.browser.msie?"white":"transparent",
  205. opacity: $.browser.msie?.5:1
  206. });
  207. $(nav).hide(1);
  208. $(navLocator).bind("dblclick",function(){fitonScreen();});
  209. $(navLocator).draggable({
  210. containment: 'parent',
  211. start:function(){
  212. $(navLocator).css({cursor:"move"});
  213. },
  214. drag:function(e,ui){
  215. refreshImagePos(ui.position.left,ui.position.top);
  216. },
  217. stop:function(){
  218. $(navLocator).css({cursor:"default"});
  219. }
  220. });
  221. //THUMB
  222. $(nav).append("<image class='navigationThumb'>");
  223. navigationThumb= $(imgNav).find(".navigationThumb");
  224. $(navigationThumb).attr("src",u);
  225. $(navigationThumb).bind("dblclick",function(){fitonScreen();});
  226. image_isHoriz= imageH < imageW;
  227. cont_isHoriz= imageContainerH < imageContainerW;
  228. ratio= imageH/navH;
  229. resetAllValue();
  230. }
  231. function fitonScreen(){
  232. if(!onScreen){
  233. navLocator.oldX=$(navLocator).css("left");
  234. navLocator.oldY=$(navLocator).css("top");
  235. draggableElement.oldX=$(draggableElement).css("left");
  236. draggableElement.oldY=$(draggableElement).css("top");
  237. var controller=((navW*imageContainerH)/navH)<imageContainerW;
  238. if(controller)
  239. $(image).css("width",imageContainerW);
  240. else
  241. $(image).css("height",imageContainerH);
  242. onScreen=true;
  243. $(navLocator).css("top",0);
  244. $(navLocator).css("left",0);
  245. $(draggableElement).css("top",0);
  246. $(draggableElement).css("left",0);
  247. $(draggableElement).bind("mousemove",imgNav.doNothing=function(){return false;});
  248. $(additionalContent).hide();
  249. } else{
  250. $(image).width("");
  251. $(image).height("");
  252. onScreen=false;
  253. $(draggableElement).css("top",draggableElement.oldY);
  254. $(draggableElement).css("left",draggableElement.oldX);
  255. $(navLocator).css("top",navLocator.oldY);
  256. $(navLocator).css("left",navLocator.oldX);
  257. $(draggableElement).unbind("mousemove",imgNav.doNothing);
  258. $(additionalContent).show();
  259. }
  260. resetAllValue();
  261. var x=$(navLocator).offsetLeft;
  262. var y=$(navLocator).offsetTop;
  263. refreshImagePos(x,y);
  264. }
  265. function refreshImagePos(x,y){
  266. ratio= imageH/navH;
  267. var posX=-(arguments[0]+1)*ratio;
  268. var posY=-(arguments [1]+1)*ratio;
  269. $(draggableElement).css("top",posY);
  270. $(draggableElement).css("left",posX);
  271. }
  272. function refreshThumbPos(x,y){
  273. ratio= imageH/navH;
  274. var posX=-(arguments[0]+1)/ratio;
  275. var posY=-(arguments [1]+1)/ratio;
  276. $(navLocator).css({
  277. top:posY,
  278. left:posX
  279. });
  280. }
  281. function setnavDim(){
  282. navW=!navW?imageContainerW/4:navW;
  283. navH=(navW*imageH)/imageW;
  284. $(navigationThumb).height(parseFloat(navH));
  285. navigationThumbW=$(navigationThumb).width();
  286. navigationThumbH=$(navigationThumb).height();
  287. // $(nav).css({
  288. // overflow:"hidden",
  289. // width:navigationThumbW,
  290. // height: navigationThumbH+10
  291. // })
  292. }
  293. function setnavLocatorDim(){
  294. $(navLocator).width((imageContainerW*navW)/imageW);
  295. $(navLocator).height((imageContainerH*navH)/imageH);
  296. }
  297. function setnavPos(){
  298. switch(navPos){
  299. case "TL":
  300. $(nav).css("left",0);
  301. $(nav).css("top",0);
  302. break;
  303. case "TR":
  304. $(nav).css("top",0);
  305. $(nav).css("left",(imageContainerW-navigationThumbW));
  306. break;
  307. case "BL":
  308. $(nav).css("top",(imageContainerH-navigationThumbH));
  309. break;
  310. case "BR":
  311. $(nav).css("left",(imageContainerW-navigationThumbW));
  312. $(nav).css("top",(imageContainerH-navigationThumbH));
  313. break;
  314. default:
  315. var dim=($(imageContainer).width())-navigationThumbW;
  316. $(nav).css("left", dim);
  317. break;
  318. }
  319. }
  320. function resetAllValue(){
  321. imageContainerW=$(imageContainer).width();
  322. imageContainerH=$(imageContainer).height();
  323. cont_isHoriz= imageContainerH < imageContainerW;
  324. imageH=$(image).height();
  325. imageW=$(image).width();
  326. setnavDim();
  327. setnavLocatorDim();
  328. setnavPos();
  329. }
  330. function fullScreen(){
  331. if(!image) return;
  332. $(image).width("");
  333. $(image).height("");
  334. if($.browser.msie) $(nav).show();
  335. else
  336. $(nav).fadeIn(500);
  337. imageContainer.oldW=$(imageContainer).css("width");
  338. imageContainer.oldH=$(imageContainer).css("height");
  339. imageContainer.style.width= $(window).outerWidth();
  340. $(window).bind("resize", function(){fullScreen();});
  341. resetAllValue();
  342. }
  343. startNav(imageURL);
  344. });
  345. };
  346. jQuery.fn.extend (
  347. {
  348. getMouseX : function (e)
  349. {
  350. var mouseX;
  351. if ($.browser.msie) {
  352. mouseX = event.clientX + document.body.scrollLeft;
  353. } else {
  354. mouseX = e.pageX;
  355. }
  356. if (mouseX < 0) {
  357. mouseX = 0;
  358. }
  359. return mouseX;
  360. },
  361. getMouseY : function (e)
  362. {
  363. var mouseY;
  364. if ($.browser.msie) {
  365. mouseY = event.clientY + document.body.scrollTop;
  366. } else {
  367. mouseY = e.pageY;
  368. }
  369. if (mouseY < 0) {
  370. mouseY = 0;
  371. }
  372. return mouseY;
  373. }
  374. });
  375. })(jQuery);