Browse Source

added zoom feature to preview page.

Signed-off-by: root <root@ipekatrinadei.ipe.kit.edu>
root 6 years ago
parent
commit
7f4f53b8d0
5 changed files with 3871 additions and 11 deletions
  1. 1 1
      main.py
  2. 1790 0
      static/fossil/js/jquery.elevatezoom.js
  3. 2025 0
      static/fossil/js/jquery.ez-plus.js
  4. 50 6
      static/fossil/js/script.js
  5. 5 4
      templates/index.html

+ 1 - 1
main.py

@@ -215,7 +215,7 @@ class GenFileStreamerHandler(tornado.web.RequestHandler):
             self.set_header('Content-Type',
                             'application/octet-stream')
             self.set_header('Content-Disposition',
-                            'attachment; filename=' + file_name)
+                            'attachment; filename="' + file_name)
             self.set_header("Content-Length",
                             os.path.getsize(self.path))
             self.flush()

+ 1790 - 0
static/fossil/js/jquery.elevatezoom.js

@@ -0,0 +1,1790 @@
+/*
+ *	jQuery elevateZoom 3.0.8
+ *	Demo's and documentation:
+ *	www.elevateweb.co.uk/image-zoom
+ *
+ *	Copyright (c) 2012 Andrew Eades
+ *	www.elevateweb.co.uk
+ *
+ *	Dual licensed under the GPL and MIT licenses.
+ *	http://en.wikipedia.org/wiki/MIT_License
+ *	http://en.wikipedia.org/wiki/GNU_General_Public_License
+ *
+
+/*
+ *	jQuery elevateZoom 3.0.3
+ *	Demo's and documentation:
+ *	www.elevateweb.co.uk/image-zoom
+ *
+ *	Copyright (c) 2012 Andrew Eades
+ *	www.elevateweb.co.uk
+ *
+ *	Dual licensed under the GPL and MIT licenses.
+ *	http://en.wikipedia.org/wiki/MIT_License
+ *	http://en.wikipedia.org/wiki/GNU_General_Public_License
+ */
+
+
+if ( typeof Object.create !== 'function' ) {
+	Object.create = function( obj ) {
+		function F() {};
+		F.prototype = obj;
+		return new F();
+	};
+}
+
+(function( $, window, document, undefined ) {
+	var ElevateZoom = {
+			init: function( options, elem ) {
+				var self = this;
+
+				self.elem = elem;
+				self.$elem = $( elem );
+
+				self.imageSrc = self.$elem.data("zoom-image") ? self.$elem.data("zoom-image") : self.$elem.attr("src");
+
+				self.options = $.extend( {}, $.fn.elevateZoom.options, options );
+
+				//TINT OVERRIDE SETTINGS
+				if(self.options.tint) {
+					self.options.lensColour = "none", //colour of the lens background
+					self.options.lensOpacity =  "1" //opacity of the lens
+				}
+				//INNER OVERRIDE SETTINGS
+				if(self.options.zoomType == "inner") {self.options.showLens = false;}
+
+
+				//Remove alt on hover
+
+				self.$elem.parent().removeAttr('title').removeAttr('alt');
+
+				self.zoomImage = self.imageSrc;
+
+				self.refresh( 1 );
+
+
+
+				//Create the image swap from the gallery 
+				$('#'+self.options.gallery + ' a').click( function(e) { 
+
+					//Set a class on the currently active gallery image
+					if(self.options.galleryActiveClass){
+						$('#'+self.options.gallery + ' a').removeClass(self.options.galleryActiveClass);
+						$(this).addClass(self.options.galleryActiveClass);
+					}
+					//stop any link on the a tag from working
+					e.preventDefault();
+
+					//call the swap image function            
+					if($(this).data("zoom-image")){self.zoomImagePre = $(this).data("zoom-image")}
+					else{self.zoomImagePre = $(this).data("image");}
+					self.swaptheimage($(this).data("image"), self.zoomImagePre);
+					return false;
+				});
+
+			},
+
+			refresh: function( length ) {
+				var self = this;
+
+				setTimeout(function() {
+					self.fetch(self.imageSrc);
+
+				}, length || self.options.refresh );
+			},
+
+			fetch: function(imgsrc) {
+				//get the image
+				var self = this;
+				var newImg = new Image();
+				newImg.onload = function() {
+					//set the large image dimensions - used to calculte ratio's
+					self.largeWidth = newImg.width;
+					self.largeHeight = newImg.height;
+					//once image is loaded start the calls
+					self.startZoom();
+					self.currentImage = self.imageSrc;
+					//let caller know image has been loaded
+					self.options.onZoomedImageLoaded(self.$elem);
+				}
+				newImg.src = imgsrc; // this must be done AFTER setting onload
+
+				return;
+
+			},
+
+			startZoom: function( ) {
+				var self = this;
+				//get dimensions of the non zoomed image
+				self.nzWidth = self.$elem.width();
+				self.nzHeight = self.$elem.height();
+
+				//activated elements
+				self.isWindowActive = false;
+				self.isLensActive = false;
+				self.isTintActive = false;
+				self.overWindow = false;    
+
+				//CrossFade Wrappe
+				if(self.options.imageCrossfade){
+					self.zoomWrap = self.$elem.wrap('<div style="height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;" class="zoomWrapper" />');        
+					self.$elem.css('position', 'absolute'); 
+				}
+
+				self.zoomLock = 1;
+				self.scrollingLock = false;
+				self.changeBgSize = false;
+				self.currentZoomLevel = self.options.zoomLevel;
+
+
+				//get offset of the non zoomed image
+				self.nzOffset = self.$elem.offset();
+				//calculate the width ratio of the large/small image
+				self.widthRatio = (self.largeWidth/self.currentZoomLevel) / self.nzWidth;
+				self.heightRatio = (self.largeHeight/self.currentZoomLevel) / self.nzHeight; 
+
+
+				//if window zoom        
+				if(self.options.zoomType == "window") {
+					self.zoomWindowStyle = "overflow: hidden;"
+						+ "background-position: 0px 0px;text-align:center;"  
+						+ "background-color: " + String(self.options.zoomWindowBgColour)            
+						+ ";width: " + String(self.options.zoomWindowWidth) + "px;"
+						+ "height: " + String(self.options.zoomWindowHeight)
+						+ "px;float: left;"
+						+ "background-size: "+ self.largeWidth/self.currentZoomLevel+ "px " +self.largeHeight/self.currentZoomLevel + "px;"
+						+ "display: none;z-index:100;"
+						+ "border: " + String(self.options.borderSize) 
+						+ "px solid " + self.options.borderColour 
+						+ ";background-repeat: no-repeat;"
+						+ "position: absolute;";
+				}    
+
+
+				//if inner  zoom    
+				if(self.options.zoomType == "inner") {
+					//has a border been put on the image? Lets cater for this
+
+					var borderWidth = self.$elem.css("border-left-width");
+
+					self.zoomWindowStyle = "overflow: hidden;"
+						+ "margin-left: " + String(borderWidth) + ";" 
+						+ "margin-top: " + String(borderWidth) + ";"         
+						+ "background-position: 0px 0px;"
+						+ "width: " + String(self.nzWidth) + "px;"
+						+ "height: " + String(self.nzHeight) + "px;"
+						+ "px;float: left;"
+						+ "display: none;"
+						+ "cursor:"+(self.options.cursor)+";"
+						+ "px solid " + self.options.borderColour 
+						+ ";background-repeat: no-repeat;"
+						+ "position: absolute;";
+				}    
+
+
+
+				//lens style for window zoom
+				if(self.options.zoomType == "window") {
+
+
+					// adjust images less than the window height
+
+					if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
+						lensHeight = self.nzHeight;              
+					}
+					else{
+						lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
+					}
+					if(self.largeWidth < self.options.zoomWindowWidth){
+						lensWidth = self.nzWidth;
+					}       
+					else{
+						lensWidth =  (self.options.zoomWindowWidth/self.widthRatio);
+					}
+
+
+					self.lensStyle = "background-position: 0px 0px;width: " + String((self.options.zoomWindowWidth)/self.widthRatio) + "px;height: " + String((self.options.zoomWindowHeight)/self.heightRatio)
+					+ "px;float: right;display: none;"
+					+ "overflow: hidden;"
+					+ "z-index: 999;"   
+					+ "-webkit-transform: translateZ(0);"               
+					+ "opacity:"+(self.options.lensOpacity)+";filter: alpha(opacity = "+(self.options.lensOpacity*100)+"); zoom:1;"
+					+ "width:"+lensWidth+"px;"
+					+ "height:"+lensHeight+"px;"
+					+ "background-color:"+(self.options.lensColour)+";"					
+					+ "cursor:"+(self.options.cursor)+";"
+					+ "border: "+(self.options.lensBorderSize)+"px" +
+					" solid "+(self.options.lensBorderColour)+";background-repeat: no-repeat;position: absolute;";
+				} 
+
+
+				//tint style
+				self.tintStyle = "display: block;"
+					+ "position: absolute;"
+					+ "background-color: "+self.options.tintColour+";"	
+					+ "filter:alpha(opacity=0);"		
+					+ "opacity: 0;"	
+					+ "width: " + self.nzWidth + "px;"
+					+ "height: " + self.nzHeight + "px;"
+
+					;
+
+				//lens style for lens zoom with optional round for modern browsers
+				self.lensRound = '';
+
+				if(self.options.zoomType == "lens") {
+
+					self.lensStyle = "background-position: 0px 0px;"
+						+ "float: left;display: none;"
+						+ "border: " + String(self.options.borderSize) + "px solid " + self.options.borderColour+";"
+						+ "width:"+ String(self.options.lensSize) +"px;"
+						+ "height:"+ String(self.options.lensSize)+"px;"
+						+ "background-repeat: no-repeat;position: absolute;";
+
+
+				}
+
+
+				//does not round in all browsers
+				if(self.options.lensShape == "round") {
+					self.lensRound = "border-top-left-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+					+ "border-top-right-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+					+ "border-bottom-left-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+					+ "border-bottom-right-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;";
+
+				}
+
+				//create the div's                                                + ""
+				//self.zoomContainer = $('<div/>').addClass('zoomContainer').css({"position":"relative", "height":self.nzHeight, "width":self.nzWidth});
+
+				self.zoomContainer = $('<div class="zoomContainer" style="-webkit-transform: translateZ(0);position:absolute;left:'+self.nzOffset.left+'px;top:'+self.nzOffset.top+'px;height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;"></div>');
+				$('body').append(self.zoomContainer);	
+
+
+				//this will add overflow hidden and contrain the lens on lens mode       
+				if(self.options.containLensZoom && self.options.zoomType == "lens"){
+					self.zoomContainer.css("overflow", "hidden");
+				}
+				if(self.options.zoomType != "inner") {
+					self.zoomLens = $("<div class='zoomLens' style='" + self.lensStyle + self.lensRound +"'>&nbsp;</div>")
+					.appendTo(self.zoomContainer)
+					.click(function () {
+						self.$elem.trigger('click');
+					});
+
+
+					if(self.options.tint) {
+						self.tintContainer = $('<div/>').addClass('tintContainer');	
+						self.zoomTint = $("<div class='zoomTint' style='"+self.tintStyle+"'></div>");
+
+
+						self.zoomLens.wrap(self.tintContainer);
+
+
+						self.zoomTintcss = self.zoomLens.after(self.zoomTint);	
+
+						//if tint enabled - set an image to show over the tint
+
+						self.zoomTintImage = $('<img style="position: absolute; left: 0px; top: 0px; max-width: none; width: '+self.nzWidth+'px; height: '+self.nzHeight+'px;" src="'+self.imageSrc+'">')
+						.appendTo(self.zoomLens)
+						.click(function () {
+
+							self.$elem.trigger('click');
+						});
+
+					}          
+
+				}
+
+
+
+
+
+
+
+				//create zoom window 
+				if(isNaN(self.options.zoomWindowPosition)){
+					self.zoomWindow = $("<div style='z-index:999;left:"+(self.windowOffsetLeft)+"px;top:"+(self.windowOffsetTop)+"px;" + self.zoomWindowStyle + "' class='zoomWindow'>&nbsp;</div>")
+					.appendTo('body')
+					.click(function () {
+						self.$elem.trigger('click');
+					});
+				}else{
+					self.zoomWindow = $("<div style='z-index:999;left:"+(self.windowOffsetLeft)+"px;top:"+(self.windowOffsetTop)+"px;" + self.zoomWindowStyle + "' class='zoomWindow'>&nbsp;</div>")
+					.appendTo(self.zoomContainer)
+					.click(function () {
+						self.$elem.trigger('click');
+					});
+				}              
+				self.zoomWindowContainer = $('<div/>').addClass('zoomWindowContainer').css("width",self.options.zoomWindowWidth);
+				self.zoomWindow.wrap(self.zoomWindowContainer);
+
+
+				//  self.captionStyle = "text-align: left;background-color: black;color: white;font-weight: bold;padding: 10px;font-family: sans-serif;font-size: 11px";                                                                                                                                                                                                                                          
+				// self.zoomCaption = $('<div class="elevatezoom-caption" style="'+self.captionStyle+'display: block; width: 280px;">INSERT ALT TAG</div>').appendTo(self.zoomWindow.parent());
+
+				if(self.options.zoomType == "lens") {
+					self.zoomLens.css({ backgroundImage: "url('" + self.imageSrc + "')" }); 
+				}
+				if(self.options.zoomType == "window") {
+					self.zoomWindow.css({ backgroundImage: "url('" + self.imageSrc + "')" }); 
+				}
+				if(self.options.zoomType == "inner") {
+					self.zoomWindow.css({ backgroundImage: "url('" + self.imageSrc + "')" }); 
+				}
+				/*-------------------END THE ZOOM WINDOW AND LENS----------------------------------*/
+				//touch events
+				self.$elem.bind('touchmove', function(e){    
+					e.preventDefault();
+					var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];  
+					self.setPosition(touch);
+
+				});  
+				self.zoomContainer.bind('touchmove', function(e){ 
+					if(self.options.zoomType == "inner") {
+						self.showHideWindow("show");
+
+					}
+					e.preventDefault();
+					var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];  
+					self.setPosition(touch); 
+
+				});  	
+				self.zoomContainer.bind('touchend', function(e){ 
+					self.showHideWindow("hide");
+					if(self.options.showLens) {self.showHideLens("hide");}
+					if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
+				});  	
+
+				self.$elem.bind('touchend', function(e){ 
+					self.showHideWindow("hide");
+					if(self.options.showLens) {self.showHideLens("hide");}
+					if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
+				});  	
+				if(self.options.showLens) {
+					self.zoomLens.bind('touchmove', function(e){ 
+
+						e.preventDefault();
+						var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];  
+						self.setPosition(touch); 
+					});    
+
+
+					self.zoomLens.bind('touchend', function(e){ 
+						self.showHideWindow("hide");
+						if(self.options.showLens) {self.showHideLens("hide");}
+						if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
+					});  
+				}
+				//Needed to work in IE
+				self.$elem.bind('mousemove', function(e){   
+					if(self.overWindow == false){self.setElements("show");}
+					//make sure on orientation change the setposition is not fired
+					if(self.lastX !== e.clientX || self.lastY !== e.clientY){
+						self.setPosition(e);
+						self.currentLoc = e;
+					}   
+					self.lastX = e.clientX;
+					self.lastY = e.clientY;    
+
+				});  	
+
+				self.zoomContainer.bind('mousemove', function(e){ 
+
+					if(self.overWindow == false){self.setElements("show");} 
+
+					//make sure on orientation change the setposition is not fired 
+					if(self.lastX !== e.clientX || self.lastY !== e.clientY){
+						self.setPosition(e);
+						self.currentLoc = e;
+					}   
+					self.lastX = e.clientX;
+					self.lastY = e.clientY;    
+				});  	
+				if(self.options.zoomType != "inner") {
+					self.zoomLens.bind('mousemove', function(e){      
+						//make sure on orientation change the setposition is not fired
+						if(self.lastX !== e.clientX || self.lastY !== e.clientY){
+							self.setPosition(e);
+							self.currentLoc = e;
+						}   
+						self.lastX = e.clientX;
+						self.lastY = e.clientY;    
+					});
+				}
+				if(self.options.tint && self.options.zoomType != "inner") {
+					self.zoomTint.bind('mousemove', function(e){ 
+						//make sure on orientation change the setposition is not fired
+						if(self.lastX !== e.clientX || self.lastY !== e.clientY){
+							self.setPosition(e);
+							self.currentLoc = e;
+						}   
+						self.lastX = e.clientX;
+						self.lastY = e.clientY;    
+					});
+
+				}
+				if(self.options.zoomType == "inner") {
+					self.zoomWindow.bind('mousemove', function(e) {
+						//self.overWindow = true;
+						//make sure on orientation change the setposition is not fired
+						if(self.lastX !== e.clientX || self.lastY !== e.clientY){
+							self.setPosition(e);
+							self.currentLoc = e;
+						}   
+						self.lastX = e.clientX;
+						self.lastY = e.clientY;    
+					});
+
+				}
+
+
+				//  lensFadeOut: 500,  zoomTintFadeIn
+				self.zoomContainer.add(self.$elem).mouseenter(function(){
+
+					if(self.overWindow == false){self.setElements("show");} 
+
+
+				}).mouseleave(function(){
+					if(!self.scrollLock){
+						self.setElements("hide");
+            self.options.onDestroy(self.$elem);
+					}
+				});
+				//end ove image
+
+
+
+
+
+				if(self.options.zoomType != "inner") {
+					self.zoomWindow.mouseenter(function(){
+						self.overWindow = true;   
+						self.setElements("hide");                  
+					}).mouseleave(function(){
+
+						self.overWindow = false;
+					});
+				}
+				//end ove image
+
+
+
+//				var delta = parseInt(e.originalEvent.wheelDelta || -e.originalEvent.detail);
+
+				//      $(this).empty();    
+				//    return false;
+
+				//fix for initial zoom setting
+				if (self.options.zoomLevel != 1){
+					//	self.changeZoomLevel(self.currentZoomLevel);
+				}
+				//set the min zoomlevel
+				if(self.options.minZoomLevel){
+					self.minZoomLevel = self.options.minZoomLevel;
+				}
+				else{
+					self.minZoomLevel = self.options.scrollZoomIncrement * 2;
+				}
+
+
+				if(self.options.scrollZoom){
+
+
+					self.zoomContainer.add(self.$elem).bind('mousewheel DOMMouseScroll MozMousePixelScroll', function(e){
+
+
+//						in IE there is issue with firing of mouseleave - So check whether still scrolling
+//						and on mouseleave check if scrolllock          
+						self.scrollLock = true;
+						clearTimeout($.data(this, 'timer'));
+						$.data(this, 'timer', setTimeout(function() {
+							self.scrollLock = false;
+							//do something
+						}, 250));
+
+						var theEvent = e.originalEvent.wheelDelta || e.originalEvent.detail*-1
+
+
+						//this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
+						//   e.preventDefault();
+
+
+						e.stopImmediatePropagation();
+						e.stopPropagation();
+						e.preventDefault();
+
+
+						if(theEvent /120 > 0) {
+							//scrolling up
+							if(self.currentZoomLevel >= self.minZoomLevel){ 
+								self.changeZoomLevel(self.currentZoomLevel-self.options.scrollZoomIncrement);        
+							}
+
+						}
+						else{
+							//scrolling down
+
+
+							if(self.options.maxZoomLevel){
+								if(self.currentZoomLevel <= self.options.maxZoomLevel){           
+									self.changeZoomLevel(parseFloat(self.currentZoomLevel)+self.options.scrollZoomIncrement);
+								}
+							}
+							else{
+								//andy 
+
+								self.changeZoomLevel(parseFloat(self.currentZoomLevel)+self.options.scrollZoomIncrement);
+							}
+
+						}
+						return false;
+					});
+				}
+
+
+			},
+			setElements: function(type) {
+				var self = this;
+        if(!self.options.zoomEnabled){return false;}
+				if(type=="show"){
+					if(self.isWindowSet){
+						if(self.options.zoomType == "inner") {self.showHideWindow("show");}
+						if(self.options.zoomType == "window") {self.showHideWindow("show");}
+						if(self.options.showLens) {self.showHideLens("show");}
+						if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("show");
+						}
+					}
+				}
+
+				if(type=="hide"){
+					if(self.options.zoomType == "window") {self.showHideWindow("hide");}
+					if(!self.options.tint) {self.showHideWindow("hide");}
+					if(self.options.showLens) {self.showHideLens("hide");}
+					if(self.options.tint) {	self.showHideTint("hide");}
+				}   
+			},
+			setPosition: function(e) {
+      
+				var self = this;
+        
+        if(!self.options.zoomEnabled){return false;}
+
+				//recaclc offset each time in case the image moves
+				//this can be caused by other on page elements
+				self.nzHeight = self.$elem.height();
+				self.nzWidth = self.$elem.width();
+				self.nzOffset = self.$elem.offset();
+
+				if(self.options.tint && self.options.zoomType != "inner") {
+					self.zoomTint.css({ top: 0});
+					self.zoomTint.css({ left: 0});
+				}
+				//set responsive       
+				//will checking if the image needs changing before running this code work faster?
+				if(self.options.responsive && !self.options.scrollZoom){
+					if(self.options.showLens){ 
+						if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
+							lensHeight = self.nzHeight;              
+						}
+						else{
+							lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
+						}
+						if(self.largeWidth < self.options.zoomWindowWidth){
+							lensWidth = self.nzWidth;
+						}       
+						else{
+							lensWidth =  (self.options.zoomWindowWidth/self.widthRatio);
+						}
+						self.widthRatio = self.largeWidth / self.nzWidth;
+						self.heightRatio = self.largeHeight / self.nzHeight;        
+						if(self.options.zoomType != "lens") {
+
+
+							//possibly dont need to keep recalcalculating
+							//if the lens is heigher than the image, then set lens size to image size
+							if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
+								lensHeight = self.nzHeight;  
+
+							}
+							else{
+								lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
+							}
+
+							if(self.nzWidth < self.options.zoomWindowHeight/self.heightRatio){
+								lensWidth = self.nzWidth;
+							}       
+							else{
+								lensWidth =  String((self.options.zoomWindowWidth/self.widthRatio));
+							}            
+
+							self.zoomLens.css('width', lensWidth);    
+							self.zoomLens.css('height', lensHeight); 
+
+							if(self.options.tint){    
+								self.zoomTintImage.css('width', self.nzWidth);    
+								self.zoomTintImage.css('height', self.nzHeight); 
+							}
+
+						}                     
+						if(self.options.zoomType == "lens") {  
+
+							self.zoomLens.css({ width: String(self.options.lensSize) + 'px', height: String(self.options.lensSize) + 'px' })      
+
+
+						}        
+						//end responsive image change
+					}
+				}
+
+				//container fix
+				self.zoomContainer.css({ top: self.nzOffset.top});
+				self.zoomContainer.css({ left: self.nzOffset.left});
+				self.mouseLeft = parseInt(e.pageX - self.nzOffset.left);
+				self.mouseTop = parseInt(e.pageY - self.nzOffset.top);
+				//calculate the Location of the Lens
+
+				//calculate the bound regions - but only if zoom window
+				if(self.options.zoomType == "window") {
+					self.Etoppos = (self.mouseTop < (self.zoomLens.height()/2));
+					self.Eboppos = (self.mouseTop > self.nzHeight - (self.zoomLens.height()/2)-(self.options.lensBorderSize*2));
+					self.Eloppos = (self.mouseLeft < 0+((self.zoomLens.width()/2))); 
+					self.Eroppos = (self.mouseLeft > (self.nzWidth - (self.zoomLens.width()/2)-(self.options.lensBorderSize*2)));  
+				}
+				//calculate the bound regions - but only for inner zoom
+				if(self.options.zoomType == "inner"){ 
+					self.Etoppos = (self.mouseTop < ((self.nzHeight/2)/self.heightRatio) );
+					self.Eboppos = (self.mouseTop > (self.nzHeight - ((self.nzHeight/2)/self.heightRatio)));
+					self.Eloppos = (self.mouseLeft < 0+(((self.nzWidth/2)/self.widthRatio)));
+					self.Eroppos = (self.mouseLeft > (self.nzWidth - (self.nzWidth/2)/self.widthRatio-(self.options.lensBorderSize*2)));  
+				}
+
+				// if the mouse position of the slider is one of the outerbounds, then hide  window and lens
+				if (self.mouseLeft < 0 || self.mouseTop < 0 || self.mouseLeft > self.nzWidth || self.mouseTop > self.nzHeight ) {				          
+					self.setElements("hide");
+					return;
+				}
+				//else continue with operations
+				else {
+
+
+					//lens options
+					if(self.options.showLens) {
+						//		self.showHideLens("show");
+						//set background position of lens
+						self.lensLeftPos = String(Math.floor(self.mouseLeft - self.zoomLens.width() / 2));
+						self.lensTopPos = String(Math.floor(self.mouseTop - self.zoomLens.height() / 2));
+
+
+					}
+					//adjust the background position if the mouse is in one of the outer regions 
+
+					//Top region
+					if(self.Etoppos){
+						self.lensTopPos = 0;
+					}
+					//Left Region
+					if(self.Eloppos){
+						self.windowLeftPos = 0;
+						self.lensLeftPos = 0;
+						self.tintpos=0;
+					}     
+					//Set bottom and right region for window mode
+					if(self.options.zoomType == "window") {
+						if(self.Eboppos){
+							self.lensTopPos = Math.max( (self.nzHeight)-self.zoomLens.height()-(self.options.lensBorderSize*2), 0 );
+						} 
+						if(self.Eroppos){
+							self.lensLeftPos = (self.nzWidth-(self.zoomLens.width())-(self.options.lensBorderSize*2));
+						}  
+					}  
+					//Set bottom and right region for inner mode
+					if(self.options.zoomType == "inner") {
+						if(self.Eboppos){
+							self.lensTopPos = Math.max( ((self.nzHeight)-(self.options.lensBorderSize*2)), 0 );
+						} 
+						if(self.Eroppos){
+							self.lensLeftPos = (self.nzWidth-(self.nzWidth)-(self.options.lensBorderSize*2));
+						}  
+
+					}
+					//if lens zoom
+					if(self.options.zoomType == "lens") {  
+						self.windowLeftPos = String(((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomLens.width() / 2) * (-1));   
+						self.windowTopPos = String(((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomLens.height() / 2) * (-1));
+
+						self.zoomLens.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
+
+						if(self.changeBgSize){  
+
+							if(self.nzHeight>self.nzWidth){  
+								if(self.options.zoomType == "lens"){       
+									self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+								}   
+
+								self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+							}
+							else{     
+								if(self.options.zoomType == "lens"){       
+									self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
+								}   
+								self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });            
+							}
+							self.changeBgSize = false;
+						}    
+
+						self.setWindowPostition(e);  
+					}
+					//if tint zoom   
+					if(self.options.tint && self.options.zoomType != "inner") {
+						self.setTintPosition(e);
+
+					}
+					//set the css background position 
+					if(self.options.zoomType == "window") {
+						self.setWindowPostition(e);   
+					}
+					if(self.options.zoomType == "inner") {
+						self.setWindowPostition(e);   
+					}
+					if(self.options.showLens) {
+
+						if(self.fullwidth && self.options.zoomType != "lens"){
+							self.lensLeftPos = 0;
+
+						}
+						self.zoomLens.css({ left: self.lensLeftPos + 'px', top: self.lensTopPos + 'px' })  
+					}
+
+				} //end else
+
+
+
+			},
+			showHideWindow: function(change) {
+				var self = this;              
+				if(change == "show"){      
+					if(!self.isWindowActive){
+						if(self.options.zoomWindowFadeIn){
+							self.zoomWindow.stop(true, true, false).fadeIn(self.options.zoomWindowFadeIn);
+						}
+						else{self.zoomWindow.show();}
+						self.isWindowActive = true;
+					}            
+				}
+				if(change == "hide"){
+					if(self.isWindowActive){
+						if(self.options.zoomWindowFadeOut){
+							self.zoomWindow.stop(true, true).fadeOut(self.options.zoomWindowFadeOut, function () {
+								if (self.loop) {
+									//stop moving the zoom window when zoom window is faded out
+									clearInterval(self.loop);
+									self.loop = false;
+								}
+							});
+						}
+						else{self.zoomWindow.hide();}
+						self.isWindowActive = false;        
+					}      
+				}
+			},
+			showHideLens: function(change) {
+				var self = this;              
+				if(change == "show"){      
+					if(!self.isLensActive){
+						if(self.options.lensFadeIn){
+							self.zoomLens.stop(true, true, false).fadeIn(self.options.lensFadeIn);
+						}
+						else{self.zoomLens.show();}
+						self.isLensActive = true;
+					}            
+				}
+				if(change == "hide"){
+					if(self.isLensActive){
+						if(self.options.lensFadeOut){
+							self.zoomLens.stop(true, true).fadeOut(self.options.lensFadeOut);
+						}
+						else{self.zoomLens.hide();}
+						self.isLensActive = false;        
+					}      
+				}
+			},
+			showHideTint: function(change) {
+				var self = this;              
+				if(change == "show"){      
+					if(!self.isTintActive){
+
+						if(self.options.zoomTintFadeIn){
+							self.zoomTint.css({opacity:self.options.tintOpacity}).animate().stop(true, true).fadeIn("slow");
+						}
+						else{
+							self.zoomTint.css({opacity:self.options.tintOpacity}).animate();
+							self.zoomTint.show();
+
+
+						}
+						self.isTintActive = true;
+					}            
+				}
+				if(change == "hide"){      
+					if(self.isTintActive){ 
+
+						if(self.options.zoomTintFadeOut){
+							self.zoomTint.stop(true, true).fadeOut(self.options.zoomTintFadeOut);
+						}
+						else{self.zoomTint.hide();}
+						self.isTintActive = false;        
+					}      
+				}
+			},
+			setLensPostition: function( e ) {
+
+
+			},
+			setWindowPostition: function( e ) {
+				//return obj.slice( 0, count );
+				var self = this;
+
+				if(!isNaN(self.options.zoomWindowPosition)){
+
+					switch (self.options.zoomWindowPosition) { 
+					case 1: //done         
+						self.windowOffsetTop = (self.options.zoomWindowOffety);//DONE - 1
+						self.windowOffsetLeft =(+self.nzWidth); //DONE 1, 2, 3, 4, 16
+						break;
+					case 2:
+						if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
+
+							self.windowOffsetTop = ((self.options.zoomWindowHeight/2)-(self.nzHeight/2))*(-1);
+							self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
+						}
+						else{ //negative margin
+
+						}
+						break;
+					case 3: //done        
+						self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize*2)); //DONE 3,9
+						self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
+						break;      
+					case 4: //done  
+						self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+						self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
+						break;
+					case 5: //done  
+						self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+						self.windowOffsetLeft =(self.nzWidth-self.zoomWindow.width()-(self.options.borderSize*2)); //DONE - 5,15
+						break;
+					case 6: 
+						if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
+							self.windowOffsetTop = (self.nzHeight);  //DONE - 4,5,6,7,8
+
+							self.windowOffsetLeft =((self.options.zoomWindowWidth/2)-(self.nzWidth/2)+(self.options.borderSize*2))*(-1);  
+						}
+						else{ //negative margin
+
+						}
+
+
+						break;
+					case 7: //done  
+						self.windowOffsetTop = (self.nzHeight);  //DONE - 4,5,6,7,8
+						self.windowOffsetLeft = 0; //DONE 7, 13
+						break;
+					case 8: //done  
+						self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+						self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1);  //DONE 8,9,10,11,12
+						break;
+					case 9:  //done  
+						self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize*2)); //DONE 3,9
+						self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1);  //DONE 8,9,10,11,12
+						break;
+					case 10: 
+						if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
+
+							self.windowOffsetTop = ((self.options.zoomWindowHeight/2)-(self.nzHeight/2))*(-1);
+							self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1);  //DONE 8,9,10,11,12
+						}
+						else{ //negative margin
+
+						}
+						break;
+					case 11: 
+						self.windowOffsetTop = (self.options.zoomWindowOffety);
+						self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1);  //DONE 8,9,10,11,12
+						break;
+					case 12: //done  
+						self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
+						self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1);  //DONE 8,9,10,11,12
+						break;
+					case 13: //done  
+						self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
+						self.windowOffsetLeft =(0); //DONE 7, 13
+						break;
+					case 14: 
+						if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
+							self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
+
+							self.windowOffsetLeft =((self.options.zoomWindowWidth/2)-(self.nzWidth/2)+(self.options.borderSize*2))*(-1);  
+						}
+						else{ //negative margin
+
+						}
+
+						break;
+					case 15://done   
+						self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
+						self.windowOffsetLeft =(self.nzWidth-self.zoomWindow.width()-(self.options.borderSize*2)); //DONE - 5,15
+						break;
+					case 16:  //done  
+						self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
+						self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
+						break;            
+					default: //done  
+						self.windowOffsetTop = (self.options.zoomWindowOffety);//DONE - 1
+					self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
+					} 
+				} //end isNAN
+				else{
+					//WE CAN POSITION IN A CLASS - ASSUME THAT ANY STRING PASSED IS
+					self.externalContainer = $('#'+self.options.zoomWindowPosition);
+					self.externalContainerWidth = self.externalContainer.width();
+					self.externalContainerHeight = self.externalContainer.height();
+					self.externalContainerOffset = self.externalContainer.offset();
+
+					self.windowOffsetTop = self.externalContainerOffset.top;//DONE - 1
+					self.windowOffsetLeft =self.externalContainerOffset.left; //DONE 1, 2, 3, 4, 16
+
+				}
+				self.isWindowSet = true;
+				self.windowOffsetTop = self.windowOffsetTop + self.options.zoomWindowOffety;
+				self.windowOffsetLeft = self.windowOffsetLeft + self.options.zoomWindowOffetx;
+
+				self.zoomWindow.css({ top: self.windowOffsetTop});
+				self.zoomWindow.css({ left: self.windowOffsetLeft});
+
+				if(self.options.zoomType == "inner") {
+					self.zoomWindow.css({ top: 0});
+					self.zoomWindow.css({ left: 0});
+
+				}   
+
+
+				self.windowLeftPos = String(((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * (-1));   
+				self.windowTopPos = String(((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * (-1));
+				if(self.Etoppos){self.windowTopPos = 0;}
+				if(self.Eloppos){self.windowLeftPos = 0;}     
+				if(self.Eboppos){self.windowTopPos = (self.largeHeight/self.currentZoomLevel-self.zoomWindow.height())*(-1);  } 
+				if(self.Eroppos){self.windowLeftPos = ((self.largeWidth/self.currentZoomLevel-self.zoomWindow.width())*(-1));}    
+
+				//stops micro movements
+				if(self.fullheight){
+					self.windowTopPos = 0;
+
+				}
+				if(self.fullwidth){
+					self.windowLeftPos = 0;
+
+				}
+				//set the css background position 
+
+
+				if(self.options.zoomType == "window" || self.options.zoomType == "inner") {
+
+					if(self.zoomLock == 1){
+						//overrides for images not zoomable
+						if(self.widthRatio <= 1){
+
+							self.windowLeftPos = 0;
+						}
+						if(self.heightRatio <= 1){ 
+							self.windowTopPos = 0;
+						}
+					}
+					// adjust images less than the window height
+
+					if (self.options.zoomType == "window") {
+						if (self.largeHeight < self.options.zoomWindowHeight) {
+
+							self.windowTopPos = 0;
+						}
+						if (self.largeWidth < self.options.zoomWindowWidth) {
+							self.windowLeftPos = 0;
+						}
+					}
+
+					//set the zoomwindow background position
+					if (self.options.easing){
+
+						//     if(self.changeZoom){
+						//           clearInterval(self.loop);
+						//           self.changeZoom = false;
+						//           self.loop = false;
+
+						//            }
+						//set the pos to 0 if not set
+						if(!self.xp){self.xp = 0;}
+						if(!self.yp){self.yp = 0;}  
+						//if loop not already started, then run it 
+						if (!self.loop){           
+							self.loop = setInterval(function(){                
+								//using zeno's paradox    
+
+								self.xp += (self.windowLeftPos  - self.xp) / self.options.easingAmount; 
+								self.yp += (self.windowTopPos  - self.yp) / self.options.easingAmount;
+								if(self.scrollingLock){
+
+
+									clearInterval(self.loop);
+									self.xp = self.windowLeftPos;
+									self.yp = self.windowTopPos            
+
+									self.xp = ((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * (-1);
+									self.yp = (((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * (-1));                         
+
+									if(self.changeBgSize){    
+										if(self.nzHeight>self.nzWidth){  
+											if(self.options.zoomType == "lens"){      
+												self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+											}   
+											self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+										}
+										else{   
+											if(self.options.zoomType != "lens"){      
+												self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+											}            
+											self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });            
+
+										}
+
+										/*
+             if(!self.bgxp){self.bgxp = self.largeWidth/self.newvalue;}
+						if(!self.bgyp){self.bgyp = self.largeHeight/self.newvalue ;}  
+                 if (!self.bgloop){   
+                 	self.bgloop = setInterval(function(){   
+
+                 self.bgxp += (self.largeWidth/self.newvalue  - self.bgxp) / self.options.easingAmount; 
+								self.bgyp += (self.largeHeight/self.newvalue  - self.bgyp) / self.options.easingAmount;
+
+           self.zoomWindow.css({ "background-size": self.bgxp + 'px ' + self.bgyp + 'px' });
+
+
+                  }, 16);
+
+                 }
+										 */
+										self.changeBgSize = false;
+									}
+
+									self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
+									self.scrollingLock = false;
+									self.loop = false;
+
+								}
+								else if (Math.round(Math.abs(self.xp - self.windowLeftPos) + Math.abs(self.yp - self.windowTopPos)) < 1) {
+									//stops micro movements
+									clearInterval(self.loop);
+									self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
+									self.loop = false;
+								}
+								else{
+									if(self.changeBgSize){    
+										if(self.nzHeight>self.nzWidth){ 
+											if(self.options.zoomType == "lens"){      
+												self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+											}         
+											self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+										}
+										else{                 
+											if(self.options.zoomType != "lens"){     
+												self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
+											}      
+											self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });            
+										}
+										self.changeBgSize = false;
+									}                   
+
+									self.zoomWindow.css({ backgroundPosition: self.xp + 'px ' + self.yp + 'px' });
+								}       
+							}, 16);
+						}
+					}   
+					else{    
+						if(self.changeBgSize){  
+							if(self.nzHeight>self.nzWidth){  
+								if(self.options.zoomType == "lens"){      
+									self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+								} 
+
+								self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
+							}
+							else{     
+								if(self.options.zoomType == "lens"){      
+									self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
+								} 
+								if((self.largeHeight/self.newvaluewidth) < self.options.zoomWindowHeight){ 
+
+									self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });            
+								}
+								else{
+
+									self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });   
+								}
+
+							}
+							self.changeBgSize = false;
+						}     
+
+						self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });       
+					}
+				} 
+			},
+			setTintPosition: function(e){
+				var self = this;
+				self.nzOffset = self.$elem.offset();
+				self.tintpos = String(((e.pageX - self.nzOffset.left)-(self.zoomLens.width() / 2)) * (-1)); 
+				self.tintposy = String(((e.pageY - self.nzOffset.top) - self.zoomLens.height() / 2) * (-1));	
+				if(self.Etoppos){
+					self.tintposy = 0;
+				}
+				if(self.Eloppos){
+					self.tintpos=0;
+				}     
+				if(self.Eboppos){
+					self.tintposy = (self.nzHeight-self.zoomLens.height()-(self.options.lensBorderSize*2))*(-1);
+				} 
+				if(self.Eroppos){
+					self.tintpos = ((self.nzWidth-self.zoomLens.width()-(self.options.lensBorderSize*2))*(-1));
+				}    
+				if(self.options.tint) {
+					//stops micro movements
+					if(self.fullheight){
+						self.tintposy = 0;
+
+					}
+					if(self.fullwidth){ 
+						self.tintpos = 0;
+
+					}   
+					self.zoomTintImage.css({'left': self.tintpos+'px'});
+					self.zoomTintImage.css({'top': self.tintposy+'px'});
+				}
+			},
+
+			swaptheimage: function(smallimage, largeimage){
+				var self = this;
+				var newImg = new Image(); 
+
+				if(self.options.loadingIcon){
+					self.spinner = $('<div style="background: url(\''+self.options.loadingIcon+'\') no-repeat center;height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;z-index: 2000;position: absolute; background-position: center center;"></div>');
+					self.$elem.after(self.spinner);
+				}
+
+				self.options.onImageSwap(self.$elem);
+
+				newImg.onload = function() {
+					self.largeWidth = newImg.width;
+					self.largeHeight = newImg.height;
+					self.zoomImage = largeimage;
+					self.zoomWindow.css({ "background-size": self.largeWidth + 'px ' + self.largeHeight + 'px' });
+					self.swapAction(smallimage, largeimage);
+					return;              
+				}          
+				newImg.src = largeimage; // this must be done AFTER setting onload
+
+			},
+			swapAction: function(smallimage, largeimage){
+
+
+				var self = this;    
+
+				var newImg2 = new Image(); 
+				newImg2.onload = function() {
+					//re-calculate values
+					self.nzHeight = newImg2.height;
+					self.nzWidth = newImg2.width;
+					self.options.onImageSwapComplete(self.$elem);
+
+					self.doneCallback();  
+					return;      
+				}          
+				newImg2.src = smallimage; 
+
+				//reset the zoomlevel to that initially set in options
+				self.currentZoomLevel = self.options.zoomLevel;
+				self.options.maxZoomLevel = false;
+
+				//swaps the main image
+				//self.$elem.attr("src",smallimage);
+				//swaps the zoom image     
+				if(self.options.zoomType == "lens") {
+					self.zoomLens.css({ backgroundImage: "url('" + largeimage + "')" }); 
+				}
+				if(self.options.zoomType == "window") {
+					self.zoomWindow.css({ backgroundImage: "url('" + largeimage + "')" }); 
+				}
+				if(self.options.zoomType == "inner") {
+					self.zoomWindow.css({ backgroundImage: "url('" + largeimage + "')" }); 
+				} 
+
+
+
+				self.currentImage = largeimage;
+
+				if(self.options.imageCrossfade){
+					var oldImg = self.$elem;
+					var newImg = oldImg.clone();         
+					self.$elem.attr("src",smallimage)
+					self.$elem.after(newImg);
+					newImg.stop(true).fadeOut(self.options.imageCrossfade, function() {
+						$(this).remove();         
+					});
+
+					//       				if(self.options.zoomType == "inner"){
+					//remove any attributes on the cloned image so we can resize later
+					self.$elem.width("auto").removeAttr("width");
+					self.$elem.height("auto").removeAttr("height");
+					//   }
+
+					oldImg.fadeIn(self.options.imageCrossfade);
+
+					if(self.options.tint && self.options.zoomType != "inner") {
+
+						var oldImgTint = self.zoomTintImage;
+						var newImgTint = oldImgTint.clone();         
+						self.zoomTintImage.attr("src",largeimage)
+						self.zoomTintImage.after(newImgTint);
+						newImgTint.stop(true).fadeOut(self.options.imageCrossfade, function() {
+							$(this).remove();         
+						});
+
+
+
+						oldImgTint.fadeIn(self.options.imageCrossfade);
+
+
+						//self.zoomTintImage.attr("width",elem.data("image"));
+
+						//resize the tint window
+						self.zoomTint.css({ height: self.$elem.height()});
+						self.zoomTint.css({ width: self.$elem.width()});
+					}    
+
+					self.zoomContainer.css("height", self.$elem.height());
+					self.zoomContainer.css("width", self.$elem.width());
+
+					if(self.options.zoomType == "inner"){ 
+						if(!self.options.constrainType){
+							self.zoomWrap.parent().css("height", self.$elem.height());
+							self.zoomWrap.parent().css("width", self.$elem.width());
+
+							self.zoomWindow.css("height", self.$elem.height());
+							self.zoomWindow.css("width", self.$elem.width());
+						}
+					} 
+
+					if(self.options.imageCrossfade){  
+						self.zoomWrap.css("height", self.$elem.height());
+						self.zoomWrap.css("width", self.$elem.width());
+					} 
+				}
+				else{
+					self.$elem.attr("src",smallimage); 
+					if(self.options.tint) {
+						self.zoomTintImage.attr("src",largeimage);
+						//self.zoomTintImage.attr("width",elem.data("image"));
+						self.zoomTintImage.attr("height",self.$elem.height());
+						//self.zoomTintImage.attr('src') = elem.data("image");
+						self.zoomTintImage.css({ height: self.$elem.height()}); 
+						self.zoomTint.css({ height: self.$elem.height()});
+
+					}
+					self.zoomContainer.css("height", self.$elem.height());
+					self.zoomContainer.css("width", self.$elem.width());
+
+					if(self.options.imageCrossfade){  
+						self.zoomWrap.css("height", self.$elem.height());
+						self.zoomWrap.css("width", self.$elem.width());
+					} 
+				}              
+				if(self.options.constrainType){     
+
+					//This will contrain the image proportions
+					if(self.options.constrainType == "height"){ 
+
+						self.zoomContainer.css("height", self.options.constrainSize);
+						self.zoomContainer.css("width", "auto");
+
+						if(self.options.imageCrossfade){  
+							self.zoomWrap.css("height", self.options.constrainSize);
+							self.zoomWrap.css("width", "auto"); 
+							self.constwidth = self.zoomWrap.width();
+
+
+						}
+						else{                  
+							self.$elem.css("height", self.options.constrainSize);
+							self.$elem.css("width", "auto");
+							self.constwidth = self.$elem.width();
+						} 
+
+						if(self.options.zoomType == "inner"){
+
+							self.zoomWrap.parent().css("height", self.options.constrainSize);
+							self.zoomWrap.parent().css("width", self.constwidth);   
+							self.zoomWindow.css("height", self.options.constrainSize);
+							self.zoomWindow.css("width", self.constwidth);    
+						}        
+						if(self.options.tint){
+							self.tintContainer.css("height", self.options.constrainSize);
+							self.tintContainer.css("width", self.constwidth);
+							self.zoomTint.css("height", self.options.constrainSize);
+							self.zoomTint.css("width", self.constwidth);
+							self.zoomTintImage.css("height", self.options.constrainSize);
+							self.zoomTintImage.css("width", self.constwidth); 
+						} 
+
+					}
+					if(self.options.constrainType == "width"){       
+						self.zoomContainer.css("height", "auto");
+						self.zoomContainer.css("width", self.options.constrainSize);
+
+						if(self.options.imageCrossfade){
+							self.zoomWrap.css("height", "auto");
+							self.zoomWrap.css("width", self.options.constrainSize);
+							self.constheight = self.zoomWrap.height();
+						}
+						else{            
+							self.$elem.css("height", "auto");
+							self.$elem.css("width", self.options.constrainSize); 
+							self.constheight = self.$elem.height();              
+						} 
+						if(self.options.zoomType == "inner"){
+							self.zoomWrap.parent().css("height", self.constheight);
+							self.zoomWrap.parent().css("width", self.options.constrainSize);   
+							self.zoomWindow.css("height", self.constheight);
+							self.zoomWindow.css("width", self.options.constrainSize);    
+						} 
+						if(self.options.tint){
+							self.tintContainer.css("height", self.constheight);
+							self.tintContainer.css("width", self.options.constrainSize);
+							self.zoomTint.css("height", self.constheight);
+							self.zoomTint.css("width", self.options.constrainSize);
+							self.zoomTintImage.css("height", self.constheight);
+							self.zoomTintImage.css("width", self.options.constrainSize); 
+						}   
+
+					}        
+
+
+				}
+
+			},
+			doneCallback: function(){
+
+				var self = this;
+				if(self.options.loadingIcon){
+					self.spinner.hide();     
+				}   
+
+				self.nzOffset = self.$elem.offset();
+				self.nzWidth = self.$elem.width();
+				self.nzHeight = self.$elem.height();
+
+				// reset the zoomlevel back to default
+				self.currentZoomLevel = self.options.zoomLevel;
+
+				//ratio of the large to small image
+				self.widthRatio = self.largeWidth / self.nzWidth;
+				self.heightRatio = self.largeHeight / self.nzHeight; 
+
+				//NEED TO ADD THE LENS SIZE FOR ROUND
+				// adjust images less than the window height
+				if(self.options.zoomType == "window") {
+
+					if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
+						lensHeight = self.nzHeight;  
+
+					}
+					else{
+						lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
+					}
+
+					if(self.options.zoomWindowWidth < self.options.zoomWindowWidth){
+						lensWidth = self.nzWidth;
+					}       
+					else{
+						lensWidth =  (self.options.zoomWindowWidth/self.widthRatio);
+					}
+
+
+					if(self.zoomLens){
+
+						self.zoomLens.css('width', lensWidth);    
+						self.zoomLens.css('height', lensHeight); 
+
+
+					}
+				}
+			},
+			getCurrentImage: function(){
+				var self = this;  
+				return self.zoomImage; 
+			}, 
+			getGalleryList: function(){
+				var self = this;   
+				//loop through the gallery options and set them in list for fancybox
+				self.gallerylist = [];
+				if (self.options.gallery){ 
+
+
+					$('#'+self.options.gallery + ' a').each(function() {
+
+						var img_src = '';
+						if($(this).data("zoom-image")){
+							img_src = $(this).data("zoom-image");
+						}
+						else if($(this).data("image")){
+							img_src = $(this).data("image");
+						}			
+						//put the current image at the start
+						if(img_src == self.zoomImage){
+							self.gallerylist.unshift({
+								href: ''+img_src+'',
+								title: $(this).find('img').attr("title")
+							});	
+						}
+						else{
+							self.gallerylist.push({
+								href: ''+img_src+'',
+								title: $(this).find('img').attr("title")
+							});
+						}
+
+
+					});
+				}                                                       
+				//if no gallery - return current image
+				else{
+					self.gallerylist.push({
+						href: ''+self.zoomImage+'',
+						title: $(this).find('img').attr("title")
+					}); 
+				}
+				return self.gallerylist;
+
+			},
+			changeZoomLevel: function(value){
+				var self = this;   
+
+				//flag a zoom, so can adjust the easing during setPosition     
+				self.scrollingLock = true;   
+
+				//round to two decimal places
+				self.newvalue = parseFloat(value).toFixed(2);
+				newvalue = parseFloat(value).toFixed(2);
+
+
+
+
+				//maxwidth & Maxheight of the image
+				maxheightnewvalue = self.largeHeight/((self.options.zoomWindowHeight / self.nzHeight) * self.nzHeight);     
+				maxwidthtnewvalue = self.largeWidth/((self.options.zoomWindowWidth / self.nzWidth) * self.nzWidth);   	
+
+
+
+
+				//calculate new heightratio
+				if(self.options.zoomType != "inner")
+				{
+					if(maxheightnewvalue <= newvalue){
+						self.heightRatio = (self.largeHeight/maxheightnewvalue) / self.nzHeight;
+						self.newvalueheight = maxheightnewvalue;
+						self.fullheight = true;
+
+					}
+					else{
+						self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight; 
+						self.newvalueheight = newvalue;
+						self.fullheight = false;
+
+					}
+
+
+//					calculate new width ratio
+
+					if(maxwidthtnewvalue <= newvalue){
+						self.widthRatio = (self.largeWidth/maxwidthtnewvalue) / self.nzWidth;
+						self.newvaluewidth = maxwidthtnewvalue;
+						self.fullwidth = true;
+
+					}
+					else{
+						self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth; 
+						self.newvaluewidth = newvalue;
+						self.fullwidth = false;
+
+					}
+					if(self.options.zoomType == "lens"){
+						if(maxheightnewvalue <= newvalue){
+							self.fullwidth = true;
+							self.newvaluewidth = maxheightnewvalue;
+
+						} else{
+							self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth; 
+							self.newvaluewidth = newvalue;
+
+							self.fullwidth = false;
+						}}
+				}
+
+
+
+				if(self.options.zoomType == "inner")
+				{
+					maxheightnewvalue = parseFloat(self.largeHeight/self.nzHeight).toFixed(2);     
+					maxwidthtnewvalue = parseFloat(self.largeWidth/self.nzWidth).toFixed(2);      
+					if(newvalue > maxheightnewvalue){
+						newvalue = maxheightnewvalue;
+					}
+					if(newvalue > maxwidthtnewvalue){
+						newvalue = maxwidthtnewvalue;
+					}      
+
+
+					if(maxheightnewvalue <= newvalue){
+
+
+						self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight; 
+						if(newvalue > maxheightnewvalue){
+							self.newvalueheight = maxheightnewvalue;
+						}else{
+							self.newvalueheight = newvalue;
+						}
+						self.fullheight = true;
+
+
+					}
+					else{
+
+
+
+						self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight; 
+
+						if(newvalue > maxheightnewvalue){
+
+							self.newvalueheight = maxheightnewvalue;
+						}else{
+							self.newvalueheight = newvalue;
+						}
+						self.fullheight = false;
+					}
+
+
+
+
+					if(maxwidthtnewvalue <= newvalue){   
+
+						self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth; 
+						if(newvalue > maxwidthtnewvalue){
+
+							self.newvaluewidth = maxwidthtnewvalue;
+						}else{
+							self.newvaluewidth = newvalue;
+						}
+
+						self.fullwidth = true;
+
+
+					}
+					else{  
+
+						self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth; 
+						self.newvaluewidth = newvalue;
+						self.fullwidth = false;
+					}        
+
+
+				} //end inner
+				scrcontinue = false;
+
+				if(self.options.zoomType == "inner"){
+
+					if(self.nzWidth >= self.nzHeight){
+						if( self.newvaluewidth <= maxwidthtnewvalue){
+							scrcontinue = true;
+						}
+						else{
+
+							scrcontinue = false;
+							self.fullheight = true;
+							self.fullwidth = true;
+						}
+					}
+					if(self.nzHeight > self.nzWidth){     
+						if( self.newvaluewidth <= maxwidthtnewvalue){
+							scrcontinue = true;
+						}
+						else{
+							scrcontinue = false;  
+
+							self.fullheight = true;
+							self.fullwidth = true;
+						}
+					}
+				}
+
+				if(self.options.zoomType != "inner"){
+					scrcontinue = true;
+				}
+
+				if(scrcontinue){
+
+
+
+					self.zoomLock = 0;
+					self.changeZoom = true;
+
+					//if lens height is less than image height
+
+
+					if(((self.options.zoomWindowHeight)/self.heightRatio) <= self.nzHeight){
+
+
+						self.currentZoomLevel = self.newvalueheight; 
+						if(self.options.zoomType != "lens" && self.options.zoomType != "inner") {
+							self.changeBgSize = true;
+
+							self.zoomLens.css({height: String((self.options.zoomWindowHeight)/self.heightRatio) + 'px' }) 
+						}
+						if(self.options.zoomType == "lens" || self.options.zoomType == "inner") {  
+							self.changeBgSize = true;  
+						}	
+
+
+					} 
+
+
+
+
+					if((self.options.zoomWindowWidth/self.widthRatio) <= self.nzWidth){
+
+
+
+						if(self.options.zoomType != "inner"){
+							if(self.newvaluewidth > self.newvalueheight)   {
+								self.currentZoomLevel = self.newvaluewidth;                 
+
+							}
+						}
+
+						if(self.options.zoomType != "lens" && self.options.zoomType != "inner") {
+							self.changeBgSize = true;
+
+							self.zoomLens.css({width: String((self.options.zoomWindowWidth)/self.widthRatio) + 'px' })
+						}
+						if(self.options.zoomType == "lens" || self.options.zoomType == "inner") {  
+							self.changeBgSize = true;
+						}	
+
+					}
+					if(self.options.zoomType == "inner"){
+						self.changeBgSize = true;  
+
+						if(self.nzWidth > self.nzHeight){
+							self.currentZoomLevel = self.newvaluewidth;
+						}
+						if(self.nzHeight > self.nzWidth){
+							self.currentZoomLevel = self.newvaluewidth;
+						}
+					}
+
+				}      //under
+
+				//sets the boundry change, called in setWindowPos
+				self.setPosition(self.currentLoc);
+				//
+			},
+			closeAll: function(){
+				if(self.zoomWindow){self.zoomWindow.hide();}
+				if(self.zoomLens){self.zoomLens.hide();}
+				if(self.zoomTint){self.zoomTint.hide();}
+			},
+			changeState: function(value){
+      	var self = this;
+				if(value == 'enable'){self.options.zoomEnabled = true;}
+				if(value == 'disable'){self.options.zoomEnabled = false;}
+
+			}
+
+	};
+
+
+
+
+	$.fn.elevateZoom = function( options ) {
+		return this.each(function() {
+			var elevate = Object.create( ElevateZoom );
+
+			elevate.init( options, this );
+
+			$.data( this, 'elevateZoom', elevate );
+
+		});
+	};
+
+	$.fn.elevateZoom.options = {
+			zoomActivation: "hover", // Can also be click (PLACEHOLDER FOR NEXT VERSION)
+      zoomEnabled: true, //false disables zoomwindow from showing
+			preloading: 1, //by default, load all the images, if 0, then only load images after activated (PLACEHOLDER FOR NEXT VERSION)
+			zoomLevel: 1, //default zoom level of image
+			scrollZoom: false, //allow zoom on mousewheel, true to activate
+			scrollZoomIncrement: 0.1,  //steps of the scrollzoom
+			minZoomLevel: false,
+			maxZoomLevel: false,
+			easing: false,
+			easingAmount: 12,
+			lensSize: 200,
+			zoomWindowWidth: 400,
+			zoomWindowHeight: 400,
+			zoomWindowOffetx: 0,
+			zoomWindowOffety: 0,
+			zoomWindowPosition: 1,
+			zoomWindowBgColour: "#fff",
+			lensFadeIn: false,
+			lensFadeOut: false,
+			debug: false,
+			zoomWindowFadeIn: false,
+			zoomWindowFadeOut: false,
+			zoomWindowAlwaysShow: false,
+			zoomTintFadeIn: false,
+			zoomTintFadeOut: false,
+			borderSize: 4,
+			showLens: true,
+			borderColour: "#888",
+			lensBorderSize: 1,
+			lensBorderColour: "#000",
+			lensShape: "square", //can be "round"
+			zoomType: "window", //window is default,  also "lens" available -
+			containLensZoom: false,
+			lensColour: "white", //colour of the lens background
+			lensOpacity: 0.4, //opacity of the lens
+			lenszoom: false,
+			tint: false, //enable the tinting
+			tintColour: "#333", //default tint color, can be anything, red, #ccc, rgb(0,0,0)
+			tintOpacity: 0.4, //opacity of the tint
+			gallery: false,
+			galleryActiveClass: "zoomGalleryActive",
+			imageCrossfade: false,
+			constrainType: false,  //width or height
+			constrainSize: false,  //in pixels the dimensions you want to constrain on
+			loadingIcon: false, //http://www.example.com/spinner.gif
+			cursor:"default", // user should set to what they want the cursor as, if they have set a click function
+			responsive:true,
+			onComplete: $.noop,
+      onDestroy: function() {},
+			onZoomedImageLoaded: function() {},
+			onImageSwap: $.noop,
+			onImageSwapComplete: $.noop
+	};
+
+})( jQuery, window, document );

+ 2025 - 0
static/fossil/js/jquery.ez-plus.js

@@ -0,0 +1,2025 @@
+// jscs:disable
+/* jshint -W071, -W074 */
+// jscs:enable
+/* globals jQuery */
+/*
+ * jQuery ezPlus 1.1.21
+ * Demo's and documentation:
+ * http://igorlino.github.io/elevatezoom-plus/
+ *
+ * licensed under MIT license.
+ * http://en.wikipedia.org/wiki/MIT_License
+ *
+ */
+
+if (typeof Object.create !== 'function') {
+    Object.create = function (obj) {
+        function F() {
+        }
+
+        F.prototype = obj;
+        return new F();
+    };
+}
+
+(function ($, window, document, undefined) {
+    var EZP = {
+        init: function (options, elem) {
+            var self = this;
+
+            self.elem = elem;
+            self.$elem = $(elem);
+
+            self.options = $.extend({}, $.fn.ezPlus.options, self.responsiveConfig(options || {}));
+
+            self.imageSrc = self.$elem.data(self.options.attrImageZoomSrc) ? self.$elem.data(self.options.attrImageZoomSrc) : self.$elem.attr('src');
+
+            if (!self.options.enabled) {
+                return;
+            }
+
+            //TINT OVERRIDE SETTINGS
+            if (self.options.tint) {
+                self.options.lensColour = 'transparent'; //colour of the lens background
+                self.options.lensOpacity = '1'; //opacity of the lens
+            }
+            //INNER OVERRIDE SETTINGS
+            if (self.options.zoomType === 'inner') {
+                self.options.showLens = false;
+            }
+
+            // LENS OVERRIDE SETTINGS
+            if (self.options.zoomType === 'lens') {
+                self.options.zoomWindowWidth = 0;
+            }
+
+            //UUID WHEN MISSING IDENTIFIER
+            if (self.options.zoomId === -1) {
+                self.options.zoomId = generateUUID();
+            }
+
+            //Remove alt on hover
+
+            self.$elem.parent().removeAttr('title').removeAttr('alt');
+
+            self.zoomImage = self.imageSrc;
+
+            self.refresh(1);
+
+            //Create the image swap from the gallery
+            var galleryEvent = self.options.galleryEvent + '.ezpspace';
+            galleryEvent += self.options.touchEnabled ? ' touchend.ezpspace' : '';
+            self.$galleries = $(self.options.gallery ? ('#' + self.options.gallery) : self.options.gallerySelector);
+            self.$galleries.on(galleryEvent, self.options.galleryItem, function (e) {
+
+                //Set a class on the currently active gallery image
+                if (self.options.galleryActiveClass) {
+                    $(self.options.galleryItem, self.$galleries).removeClass(self.options.galleryActiveClass);
+                    $(this).addClass(self.options.galleryActiveClass);
+                }
+                //stop any link on the a tag from working
+                if (this.tagName === 'A') {
+                    e.preventDefault();
+                }
+
+                //call the swap image function
+                if ($(this).data(self.options.attrImageZoomSrc)) {
+                    self.zoomImagePre = $(this).data(self.options.attrImageZoomSrc);
+                }
+                else {
+                    self.zoomImagePre = $(this).data('image');
+                }
+                self.swaptheimage($(this).data('image'), self.zoomImagePre);
+                if (this.tagName === 'A') {
+                    return false;
+                }
+            });
+            function generateUUID() {
+                var d = new Date().getTime();
+                var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                    var r = (d + Math.random() * 16) % 16 | 0; // jshint ignore:line
+                    d = Math.floor(d / 16); // jshint ignore:line
+                    return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); // jshint ignore:line
+                });
+                return uuid;
+            }
+        },
+        refresh: function (length) {
+            var self = this;
+
+            setTimeout(function () {
+                self.fetch(self.imageSrc, self.$elem, self.options.minZoomLevel);
+
+            }, length || self.options.refresh);
+        },
+        fetch: function (imgsrc, element, minZoom) {
+            //get the image
+            var self = this;
+            var newImg = new Image();
+            newImg.onload = function () {
+                //set the large image dimensions - used to calculte ratio's
+                if (newImg.width / element.width() <= minZoom) {
+                    self.largeWidth = element.width() * minZoom;
+                } else {
+                    self.largeWidth = newImg.width;
+                }
+                if (newImg.height / element.height() <= minZoom) {
+                    self.largeHeight = element.height() * minZoom;
+                } else {
+                    self.largeHeight = newImg.height;
+                }
+                //once image is loaded start the calls
+                self.startZoom();
+                self.currentImage = self.imageSrc;
+                //let caller know image has been loaded
+                self.options.onZoomedImageLoaded(self.$elem);
+            };
+            self.setImageSource(newImg, imgsrc); // this must be done AFTER setting onload
+
+            return;
+        },
+        setImageSource: function (image, src) {
+            //sets an image's source.
+            image.src = src;
+        },
+        startZoom: function () {
+            var self = this;
+            //get dimensions of the non zoomed image
+            self.nzWidth = self.$elem.width();
+            self.nzHeight = self.$elem.height();
+
+            //activated elements
+            self.isWindowActive = false;
+            self.isLensActive = false;
+            self.isTintActive = false;
+            self.overWindow = false;
+
+            //CrossFade Wrapper
+            if (self.options.imageCrossfade) {
+                var elementZoomWrapper = $('<div class="zoomWrapper"/>')
+                    .css({
+                        height: self.nzHeight,
+                        width: self.nzWidth
+                    });
+                self.zoomWrap = self.$elem.wrap(elementZoomWrapper);
+                self.$elem.css({
+                    position: 'absolute'
+                });
+            }
+
+            self.zoomLock = 1;
+            self.scrollingLock = false;
+            self.changeBgSize = false;
+            self.currentZoomLevel = self.options.zoomLevel;
+
+            //get offset of the non zoomed image
+            self.updateOffset(self);
+            //calculate the width ratio of the large/small image
+            self.widthRatio = (self.largeWidth / self.currentZoomLevel) / self.nzWidth;
+            self.heightRatio = (self.largeHeight / self.currentZoomLevel) / self.nzHeight;
+
+            function getWindowZoomStyle() {
+                return {
+                    display: 'none',
+                    position: 'absolute',
+                    height: self.options.zoomWindowHeight,
+                    width: self.options.zoomWindowWidth,
+                    border: '' + self.options.borderSize + 'px solid ' + self.options.borderColour,
+                    backgroundSize: '' + (self.largeWidth / self.currentZoomLevel) + 'px ' + (self.largeHeight / self.currentZoomLevel) + 'px',
+                    backgroundPosition: '0px 0px',
+                    backgroundRepeat: 'no-repeat',
+                    backgroundColor: '' + self.options.zoomWindowBgColour,
+                    overflow: 'hidden',
+                    zIndex: 100
+                };
+            }
+
+            //if window zoom
+            if (self.options.zoomType === 'window') {
+                self.zoomWindowStyle = getWindowZoomStyle();
+            }
+
+            function getInnerZoomStyle() {
+                //has a border been put on the image? Lets cater for this
+                var borderWidth = self.$elem.css('border-left-width');
+
+                return {
+                    display: 'none',
+                    position: 'absolute',
+                    height: self.nzHeight,
+                    width: self.nzWidth,
+                    marginTop: borderWidth,
+                    marginLeft: borderWidth,
+                    border: '' + self.options.borderSize + 'px solid ' + self.options.borderColour,
+                    backgroundPosition: '0px 0px',
+                    backgroundRepeat: 'no-repeat',
+                    cursor: self.options.cursor,
+                    overflow: 'hidden',
+                    zIndex: self.options.zIndex
+                };
+            }
+
+            //if inner  zoom
+            if (self.options.zoomType === 'inner') {
+                self.zoomWindowStyle = getInnerZoomStyle();
+            }
+
+            function getWindowLensStyle() {
+                // adjust images less than the window height
+
+                if (self.nzHeight < self.options.zoomWindowHeight / self.heightRatio) {
+                    self.lensHeight = self.nzHeight;
+                }
+                else {
+                    self.lensHeight = self.options.zoomWindowHeight / self.heightRatio;
+                }
+                if (self.largeWidth < self.options.zoomWindowWidth) {
+                    self.lensWidth = self.nzWidth;
+                }
+                else {
+                    self.lensWidth = self.options.zoomWindowWidth / self.widthRatio;
+                }
+
+                return {
+                    display: 'none',
+                    position: 'absolute',
+                    height: self.lensHeight,
+                    width: self.lensWidth,
+                    border: '' + self.options.lensBorderSize + 'px' + ' solid ' + self.options.lensBorderColour,
+                    backgroundPosition: '0px 0px',
+                    backgroundRepeat: 'no-repeat',
+                    backgroundColor: self.options.lensColour,
+                    opacity: self.options.lensOpacity,
+                    cursor: self.options.cursor,
+                    zIndex: 999,
+                    overflow: 'hidden'
+                };
+            }
+
+            //lens style for window zoom
+            if (self.options.zoomType === 'window') {
+                self.lensStyle = getWindowLensStyle();
+            }
+
+            //tint style
+            self.tintStyle = {
+                display: 'block',
+                position: 'absolute',
+                height: self.nzHeight,
+                width: self.nzWidth,
+                backgroundColor: self.options.tintColour,
+                opacity: 0
+            };
+
+            //lens style for lens zoom with optional round for modern browsers
+            self.lensRound = {};
+
+            if (self.options.zoomType === 'lens') {
+                self.lensStyle = {
+                    display: 'none',
+                    position: 'absolute',
+                    float: 'left',
+                    height: self.options.lensSize,
+                    width: self.options.lensSize,
+                    border: '' + self.options.borderSize + 'px solid ' + self.options.borderColour,
+                    backgroundPosition: '0px 0px',
+                    backgroundRepeat: 'no-repeat',
+                    backgroundColor: self.options.lensColour,
+                    cursor: self.options.cursor
+                };
+            }
+
+            //does not round in all browsers
+            if (self.options.lensShape === 'round') {
+                self.lensRound = {
+                    borderRadius: self.options.lensSize / 2 + self.options.borderSize
+                };
+            }
+
+            //create the div's                                                + ""
+            //self.zoomContainer = $('<div/>').addClass('zoomContainer').css({"position":"relative", "height":self.nzHeight, "width":self.nzWidth});
+
+            self.zoomContainer = $('<div class="zoomContainer" ' + 'uuid="' + self.options.zoomId + '"/>');
+            self.zoomContainer.css({
+                position: 'absolute',
+                top: self.nzOffset.top,
+                left: self.nzOffset.left,
+                height: self.nzHeight,
+                width: self.nzWidth,
+                zIndex: self.options.zIndex
+            });
+            if (self.$elem.attr('id')) {
+                self.zoomContainer.attr('id', self.$elem.attr('id') + '-zoomContainer');
+            }
+            $(self.options.zoomContainerAppendTo).append(self.zoomContainer);
+
+            //this will add overflow hidden and contrain the lens on lens mode
+            if (self.options.containLensZoom && self.options.zoomType === 'lens') {
+                self.zoomContainer.css('overflow', 'hidden');
+            }
+            if (self.options.zoomType !== 'inner') {
+                self.zoomLens = $('<div class="zoomLens"/>')
+                    .css($.extend({}, self.lensStyle, self.lensRound))
+                    .appendTo(self.zoomContainer)
+                    .click(function () {
+                        self.$elem.trigger('click');
+                    });
+
+                if (self.options.tint) {
+                    self.tintContainer = $('<div class="tintContainer"/>');
+                    self.zoomTint = $('<div class="zoomTint"/>').css(self.tintStyle);
+
+                    self.zoomLens.wrap(self.tintContainer);
+
+                    self.zoomTintcss = self.zoomLens.after(self.zoomTint);
+
+                    //if tint enabled - set an image to show over the tint
+
+                    self.zoomTintImage = $('<img src="' + self.$elem.attr('src') + '">')
+                        .css({
+                            position: 'absolute',
+                            top: 0,
+                            left: 0,
+                            height: self.nzHeight,
+                            width: self.nzWidth,
+                            maxWidth: 'none'
+                        })
+                        .appendTo(self.zoomLens)
+                        .click(function () {
+                            self.$elem.trigger('click');
+                        });
+                }
+            }
+
+            //create zoom window
+            var targetZoomContainer = isNaN(self.options.zoomWindowPosition) ? 'body' : self.zoomContainer;
+            self.zoomWindow = $('<div class="zoomWindow"/>')
+                .css($.extend({
+                    zIndex: 999,
+                    top: self.windowOffsetTop,
+                    left: self.windowOffsetLeft,
+                }, self.zoomWindowStyle))
+                .appendTo(targetZoomContainer).click(function () {
+                    self.$elem.trigger('click');
+                });
+            self.zoomWindowContainer = $('<div class="zoomWindowContainer" />')
+                .css({
+                    width: self.options.zoomWindowWidth
+                });
+            self.zoomWindow.wrap(self.zoomWindowContainer);
+
+            if (self.options.zoomType === 'lens') {
+                self.zoomLens.css({
+                    backgroundImage: 'url("' + self.imageSrc + '")'
+                });
+            }
+            if (self.options.zoomType === 'window') {
+                self.zoomWindow.css({
+                    backgroundImage: 'url("' + self.imageSrc + '")'
+                });
+            }
+            if (self.options.zoomType === 'inner') {
+                self.zoomWindow.css({
+                    backgroundImage: 'url("' + self.imageSrc + '")'
+                });
+            }
+
+            /*-------------------END THE ZOOM WINDOW AND LENS----------------------------------*/
+            if (self.options.touchEnabled) {
+                //touch events
+                self.$elem.on('touchmove.ezpspace', function (e) {
+                    e.preventDefault();
+                    var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
+                    self.setPosition(touch);
+                });
+                self.zoomContainer.on('touchmove.ezpspace', function (e) {
+                    self.setElements('show');
+                    e.preventDefault();
+                    var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
+                    self.setPosition(touch);
+
+                });
+                self.zoomContainer.on('touchend.ezpspace', function (e) {
+                    self.showHideWindow('hide');
+                    if (self.options.showLens) {
+                        self.showHideLens('hide');
+                    }
+                    if (self.options.tint && self.options.zoomType !== 'inner') {
+                        self.showHideTint('hide');
+                    }
+                });
+
+                self.$elem.on('touchend.ezpspace', function (e) {
+                    self.showHideWindow('hide');
+                    if (self.options.showLens) {
+                        self.showHideLens('hide');
+                    }
+                    if (self.options.tint && self.options.zoomType !== 'inner') {
+                        self.showHideTint('hide');
+                    }
+                });
+                if (self.options.showLens) {
+                    self.zoomLens.on('touchmove.ezpspace', function (e) {
+
+                        e.preventDefault();
+                        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
+                        self.setPosition(touch);
+                    });
+
+                    self.zoomLens.on('touchend.ezpspace', function (e) {
+                        self.showHideWindow('hide');
+                        if (self.options.showLens) {
+                            self.showHideLens('hide');
+                        }
+                        if (self.options.tint && self.options.zoomType !== 'inner') {
+                            self.showHideTint('hide');
+                        }
+                    });
+                }
+            }
+            //Needed to work in IE
+            self.$elem.on('mousemove.ezpspace', function (e) {
+                if (self.overWindow === false) {
+                    self.setElements('show');
+                }
+                //make sure on orientation change the setposition is not fired
+                if (self.lastX !== e.clientX || self.lastY !== e.clientY) {
+                    self.setPosition(e);
+                    self.currentLoc = e;
+                }
+                self.lastX = e.clientX;
+                self.lastY = e.clientY;
+
+            });
+
+            self.zoomContainer.on('click.ezpspace touchstart.ezpspace', self.options.onImageClick);
+
+            self.zoomContainer.on('mousemove.ezpspace', function (e) {
+                if (self.overWindow === false) {
+                    self.setElements('show');
+                }
+                mouseMoveZoomHandler(e);
+            });
+
+            function mouseMoveZoomHandler(e) {
+                //self.overWindow = true;
+                //make sure on orientation change the setposition is not fired
+                if (self.lastX !== e.clientX || self.lastY !== e.clientY) {
+                    self.setPosition(e);
+                    self.currentLoc = e;
+                }
+                self.lastX = e.clientX;
+                self.lastY = e.clientY;
+            }
+
+            var elementToTrack = null;
+            if (self.options.zoomType !== 'inner') {
+                elementToTrack = self.zoomLens;
+            }
+            if (self.options.tint && self.options.zoomType !== 'inner') {
+                elementToTrack = self.zoomTint;
+            }
+            if (self.options.zoomType === 'inner') {
+                elementToTrack = self.zoomWindow;
+            }
+
+            //register the mouse tracking
+            if (elementToTrack) {
+                elementToTrack.on('mousemove.ezpspace', mouseMoveZoomHandler);
+            }
+
+            //  lensFadeOut: 500,  zoomTintFadeIn
+            self.zoomContainer.add(self.$elem).mouseenter(function () {
+                if (self.overWindow === false) {
+                    self.setElements('show');
+                }
+            }).mouseleave(function () {
+                if (!self.scrollLock) {
+                    self.setElements('hide');
+                    self.options.onDestroy(self.$elem);
+                }
+            });
+            //end ove image
+
+            if (self.options.zoomType !== 'inner') {
+                self.zoomWindow.mouseenter(function () {
+                    self.overWindow = true;
+                    self.setElements('hide');
+                }).mouseleave(function () {
+                    self.overWindow = false;
+                });
+            }
+            //end ove image
+
+            // var delta = parseInt(e.originalEvent.wheelDelta || -e.originalEvent.detail);
+
+            //      $(this).empty();
+            //    return false;
+
+            //fix for initial zoom setting
+            //if (self.options.zoomLevel !== 1) {
+            //    	self.changeZoomLevel(self.currentZoomLevel);
+            //}
+            //set the min zoomlevel
+            if (self.options.minZoomLevel) {
+                self.minZoomLevel = self.options.minZoomLevel;
+            }
+            else {
+                self.minZoomLevel = self.options.scrollZoomIncrement * 10;
+            }
+
+            if (self.options.scrollZoom) {
+                //see compatibility of mouse events at https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel
+                self.zoomContainer.add(self.$elem).on('wheel DOMMouseScroll MozMousePixelScroll', function (e) {
+                    // in IE there is issue with firing of mouseleave - So check whether still scrolling
+                    // and on mouseleave check if scrolllock
+                    self.scrollLock = true;
+                    clearTimeout($.data(this, 'timer'));
+                    $.data(this, 'timer', setTimeout(function () {
+                        self.scrollLock = false;
+                        //do something
+                    }, 250));
+
+                    var theEvent = e.originalEvent.deltaY || e.originalEvent.detail * -1;
+
+                    //this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
+                    //   e.preventDefault();
+
+                    e.stopImmediatePropagation();
+                    e.stopPropagation();
+                    e.preventDefault();
+
+                    if (theEvent === 0) {
+                        // fixes last event inversion bug
+                        return false;
+                    }
+                    var nextZoomLevel;
+                    if (theEvent / 120 > 0) {
+                        nextZoomLevel = parseFloat(self.currentZoomLevel) - self.options.scrollZoomIncrement;
+                        //scrolling up
+                        if (nextZoomLevel >= parseFloat(self.minZoomLevel)) {
+                            self.changeZoomLevel(nextZoomLevel);
+                        }
+                    }
+                    else {
+                        //scrolling down
+
+                        //Check if it has to maintain original zoom window aspect ratio or not
+                        if ((!self.fullheight && !self.fullwidth) || !self.options.mantainZoomAspectRatio) {
+                            nextZoomLevel = parseFloat(self.currentZoomLevel) + self.options.scrollZoomIncrement;
+
+                            if (self.options.maxZoomLevel) {
+                                if (nextZoomLevel <= self.options.maxZoomLevel) {
+                                    self.changeZoomLevel(nextZoomLevel);
+                                }
+                            }
+                            else {
+                                //andy
+                                self.changeZoomLevel(nextZoomLevel);
+                            }
+                        }
+                    }
+                    return false;
+                });
+            }
+        },
+        destroy: function () {
+            var self = this;
+            self.$elem.off('.ezpspace');
+            self.$galleries.off('.ezpspace');
+            $(self.zoomContainer).remove();
+            if (self.options.loadingIcon && !!self.spinner && !!self.spinner.length) {
+                self.spinner.remove();
+                delete self.spinner;
+            }
+        },
+        getIdentifier: function () {
+            var self = this;
+            return self.options.zoomId;
+        },
+        setElements: function (type) {
+            var self = this;
+            if (!self.options.zoomEnabled) {
+                return false;
+            }
+            if (type === 'show') {
+                if (self.isWindowSet) {
+                    if (self.options.zoomType === 'inner') {
+                        self.showHideWindow('show');
+                    }
+                    if (self.options.zoomType === 'window') {
+                        self.showHideWindow('show');
+                    }
+                    if (self.options.showLens) {
+                        self.showHideLens('show');
+                    }
+                    if (self.options.tint && self.options.zoomType !== 'inner') {
+                        self.showHideTint('show');
+                    }
+                }
+            }
+
+            if (type === 'hide') {
+                if (self.options.zoomType === 'window') {
+                    self.showHideWindow('hide');
+                }
+                if (!self.options.tint) {
+                    self.showHideWindow('hide');
+                }
+                if (self.options.showLens) {
+                    self.showHideLens('hide');
+                }
+                if (self.options.tint) {
+                    self.showHideTint('hide');
+                }
+            }
+        },
+        setPosition: function (e) {
+
+            var self = this;
+
+            if (!self.options.zoomEnabled) {
+                return false;
+            }
+
+            //recaclc offset each time in case the image moves
+            //this can be caused by other on page elements
+            self.nzHeight = self.$elem.height();
+            self.nzWidth = self.$elem.width();
+            self.updateOffset(self);
+
+            if (self.options.tint && self.options.zoomType !== 'inner') {
+                self.zoomTint.css({
+                    top: 0,
+                    left: 0
+                });
+            }
+            //set responsive
+            //will checking if the image needs changing before running this code work faster?
+            if (self.options.responsive && !self.options.scrollZoom) {
+                if (self.options.showLens) {
+                    var lensHeight, lensWidth;
+                    if (self.nzHeight < self.options.zoomWindowWidth / self.widthRatio) {
+                        self.lensHeight = self.nzHeight;
+                    }
+                    else {
+                        self.lensHeight = self.options.zoomWindowHeight / self.heightRatio;
+                    }
+                    if (self.largeWidth < self.options.zoomWindowWidth) {
+                        self.lensWidth = self.nzWidth;
+                    }
+                    else {
+                        self.lensWidth = (self.options.zoomWindowWidth / self.widthRatio);
+                    }
+                    self.widthRatio = self.largeWidth / self.nzWidth;
+                    self.heightRatio = self.largeHeight / self.nzHeight;
+                    if (self.options.zoomType !== 'lens') {
+                        //possibly dont need to keep recalcalculating
+                        //if the lens is heigher than the image, then set lens size to image size
+                        if (self.nzHeight < self.options.zoomWindowWidth / self.widthRatio) {
+                            self.lensHeight = self.nzHeight;
+
+                        }
+                        else {
+                            self.lensHeight = self.options.zoomWindowHeight / self.heightRatio;
+                        }
+
+                        if (self.nzWidth < self.options.zoomWindowHeight / self.heightRatio) {
+                            self.lensWidth = self.nzWidth;
+                        }
+                        else {
+                            self.lensWidth = self.options.zoomWindowWidth / self.widthRatio;
+                        }
+
+                        self.zoomLens.css({
+                            width: self.lensWidth,
+                            height: self.lensHeight
+                        });
+
+                        if (self.options.tint) {
+                            self.zoomTintImage.css({
+                                width: self.nzWidth,
+                                height: self.nzHeight
+                            });
+                        }
+
+                    }
+                    if (self.options.zoomType === 'lens') {
+                        self.zoomLens.css({
+                            width: self.options.lensSize,
+                            height: self.options.lensSize
+                        });
+                    }
+                    //end responsive image change
+                }
+            }
+
+            //container fix
+            self.zoomContainer.css({
+                top: self.nzOffset.top,
+                left: self.nzOffset.left,
+                width: self.nzWidth,  // new code
+                height: self.nzHeight // new code
+            });
+            self.mouseLeft = parseInt(e.pageX - self.nzOffset.left);
+            self.mouseTop = parseInt(e.pageY - self.nzOffset.top);
+            //calculate the Location of the Lens
+
+            //calculate the bound regions - but only if zoom window
+            if (self.options.zoomType === 'window') {
+                var zoomLensHeight = self.zoomLens.height() / 2;
+                var zoomLensWidth = self.zoomLens.width() / 2;
+                self.Etoppos = (self.mouseTop < 0 + zoomLensHeight);
+                self.Eboppos = (self.mouseTop > self.nzHeight - zoomLensHeight - (self.options.lensBorderSize * 2));
+                self.Eloppos = (self.mouseLeft < 0 + zoomLensWidth);
+                self.Eroppos = (self.mouseLeft > (self.nzWidth - zoomLensWidth - (self.options.lensBorderSize * 2)));
+            }
+            //calculate the bound regions - but only for inner zoom
+            if (self.options.zoomType === 'inner') {
+                self.Etoppos = (self.mouseTop < ((self.nzHeight / 2) / self.heightRatio));
+                self.Eboppos = (self.mouseTop > (self.nzHeight - ((self.nzHeight / 2) / self.heightRatio)));
+                self.Eloppos = (self.mouseLeft < 0 + (((self.nzWidth / 2) / self.widthRatio)));
+                self.Eroppos = (self.mouseLeft > (self.nzWidth - (self.nzWidth / 2) / self.widthRatio - (self.options.lensBorderSize * 2)));
+            }
+
+            // if the mouse position of the slider is one of the outerbounds, then hide  window and lens
+            if (self.mouseLeft < 0 || self.mouseTop < 0 || self.mouseLeft > self.nzWidth || self.mouseTop > self.nzHeight) {
+                self.setElements('hide');
+                return;
+            }
+            //else continue with operations
+            else {
+                //lens options
+                if (self.options.showLens) {
+                    //		self.showHideLens('show');
+                    //set background position of lens
+                    self.lensLeftPos = Math.floor(self.mouseLeft - self.zoomLens.width() / 2);
+                    self.lensTopPos = Math.floor(self.mouseTop - self.zoomLens.height() / 2);
+                }
+                //adjust the background position if the mouse is in one of the outer regions
+
+                //Top region
+                if (self.Etoppos) {
+                    self.lensTopPos = 0;
+                }
+                //Left Region
+                if (self.Eloppos) {
+                    self.windowLeftPos = 0;
+                    self.lensLeftPos = 0;
+                    self.tintpos = 0;
+                }
+                //Set bottom and right region for window mode
+                if (self.options.zoomType === 'window') {
+                    if (self.Eboppos) {
+                        self.lensTopPos = Math.max((self.nzHeight) - self.zoomLens.height() - (self.options.lensBorderSize * 2), 0);
+                    }
+                    if (self.Eroppos) {
+                        self.lensLeftPos = (self.nzWidth - (self.zoomLens.width()) - (self.options.lensBorderSize * 2));
+                    }
+                }
+                //Set bottom and right region for inner mode
+                if (self.options.zoomType === 'inner') {
+                    if (self.Eboppos) {
+                        self.lensTopPos = Math.max(((self.nzHeight) - (self.options.lensBorderSize * 2)), 0);
+                    }
+                    if (self.Eroppos) {
+                        self.lensLeftPos = (self.nzWidth - (self.nzWidth) - (self.options.lensBorderSize * 2));
+                    }
+                }
+                //if lens zoom
+                if (self.options.zoomType === 'lens') {
+
+                    self.windowLeftPos = ((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomLens.width() / 2) * -1;
+                    self.windowTopPos = ((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomLens.height() / 2) * -1;
+                    self.zoomLens.css({
+                        backgroundPosition: '' + self.windowLeftPos + 'px ' + self.windowTopPos + 'px'
+                    });
+
+                    if (self.changeBgSize) {
+                        if (self.nzHeight > self.nzWidth) {
+                            if (self.options.zoomType === 'lens') {
+                                self.zoomLens.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvalueheight) + 'px ' +
+                                    (self.largeHeight / self.newvalueheight) + 'px'
+                                });
+                            }
+
+                            self.zoomWindow.css({
+                                backgroundSize: '' +
+                                (self.largeWidth / self.newvalueheight) + 'px ' +
+                                (self.largeHeight / self.newvalueheight) + 'px'
+                            });
+                        }
+                        else {
+                            if (self.options.zoomType === 'lens') {
+                                self.zoomLens.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                    (self.largeHeight / self.newvaluewidth) + 'px'
+                                });
+                            }
+                            self.zoomWindow.css({
+                                backgroundSize: '' +
+                                (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                (self.largeHeight / self.newvaluewidth) + 'px'
+                            });
+                        }
+                        self.changeBgSize = false;
+                    }
+
+                    self.setWindowPosition(e);
+                }
+                //if tint zoom
+                if (self.options.tint && self.options.zoomType !== 'inner') {
+                    self.setTintPosition(e);
+                }
+                //set the css background position
+                if (self.options.zoomType === 'window') {
+                    self.setWindowPosition(e);
+                }
+                if (self.options.zoomType === 'inner') {
+                    self.setWindowPosition(e);
+                }
+                if (self.options.showLens) {
+                    if (self.fullwidth && self.options.zoomType !== 'lens') {
+                        self.lensLeftPos = 0;
+                    }
+                    self.zoomLens.css({
+                        left: self.lensLeftPos,
+                        top: self.lensTopPos
+                    });
+                }
+
+            } //end else
+        },
+        showHideZoomContainer: function (change) {
+            var self = this;
+            if (change === 'show') {
+                if (self.zoomContainer) {
+                    self.zoomContainer.show();
+                }
+            }
+            if (change === 'hide') {
+                if (self.zoomContainer) {
+                    self.zoomContainer.hide();
+                }
+            }
+        },
+        showHideWindow: function (change) {
+            var self = this;
+            if (change === 'show') {
+                if (!self.isWindowActive && self.zoomWindow) {
+                    self.options.onShow(self);
+                    if (self.options.zoomWindowFadeIn) {
+                        self.zoomWindow.stop(true, true, false).fadeIn(self.options.zoomWindowFadeIn);
+                    }
+                    else {
+                        self.zoomWindow.show();
+                    }
+                    self.isWindowActive = true;
+                }
+            }
+            if (change === 'hide') {
+                if (self.isWindowActive) {
+                    if (self.options.zoomWindowFadeOut) {
+                        self.zoomWindow.stop(true, true).fadeOut(self.options.zoomWindowFadeOut, function () {
+                            if (self.loop) {
+                                //stop moving the zoom window when zoom window is faded out
+                                clearInterval(self.loop);
+                                self.loop = false;
+                            }
+                        });
+                    }
+                    else {
+                        self.zoomWindow.hide();
+                    }
+                    self.options.onHide(self);
+                    self.isWindowActive = false;
+                }
+            }
+        },
+        showHideLens: function (change) {
+            var self = this;
+            if (change === 'show') {
+                if (!self.isLensActive) {
+                    if (self.zoomLens) {
+                        if (self.options.lensFadeIn) {
+                            self.zoomLens.stop(true, true, false).fadeIn(self.options.lensFadeIn);
+                        }
+                        else {
+                            self.zoomLens.show();
+                        }
+                    }
+                    self.isLensActive = true;
+                }
+            }
+            if (change === 'hide') {
+                if (self.isLensActive) {
+                    if (self.zoomLens) {
+                        if (self.options.lensFadeOut) {
+                            self.zoomLens.stop(true, true).fadeOut(self.options.lensFadeOut);
+                        }
+                        else {
+                            self.zoomLens.hide();
+                        }
+                    }
+                    self.isLensActive = false;
+                }
+            }
+        },
+        showHideTint: function (change) {
+            var self = this;
+            if (change === 'show') {
+                if (!self.isTintActive && self.zoomTint) {
+
+                    if (self.options.zoomTintFadeIn) {
+                        self.zoomTint.css('opacity', self.options.tintOpacity).animate().stop(true, true).fadeIn('slow');
+                    }
+                    else {
+                        self.zoomTint.css('opacity', self.options.tintOpacity).animate();
+                        self.zoomTint.show();
+                    }
+                    self.isTintActive = true;
+                }
+            }
+            if (change === 'hide') {
+                if (self.isTintActive) {
+
+                    if (self.options.zoomTintFadeOut) {
+                        self.zoomTint.stop(true, true).fadeOut(self.options.zoomTintFadeOut);
+                    }
+                    else {
+                        self.zoomTint.hide();
+                    }
+                    self.isTintActive = false;
+                }
+            }
+        },
+
+        setLensPosition: function (e) {
+        },
+
+        setWindowPosition: function (e) {
+            //return obj.slice( 0, count );
+            var self = this;
+
+            if (!isNaN(self.options.zoomWindowPosition)) {
+
+                switch (self.options.zoomWindowPosition) {
+                    case 1: //done
+                        self.windowOffsetTop = (self.options.zoomWindowOffsetY);//DONE - 1
+                        self.windowOffsetLeft = (+self.nzWidth); //DONE 1, 2, 3, 4, 16
+                        break;
+                    case 2:
+                        if (self.options.zoomWindowHeight > self.nzHeight) { //positive margin
+
+                            self.windowOffsetTop = ((self.options.zoomWindowHeight / 2) - (self.nzHeight / 2)) * (-1);
+                            self.windowOffsetLeft = (self.nzWidth); //DONE 1, 2, 3, 4, 16
+                        }
+                        else { //negative margin
+                            $.noop();
+                        }
+                        break;
+                    case 3: //done
+                        self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize * 2)); //DONE 3,9
+                        self.windowOffsetLeft = (self.nzWidth); //DONE 1, 2, 3, 4, 16
+                        break;
+                    case 4: //done
+                        self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+                        self.windowOffsetLeft = (self.nzWidth); //DONE 1, 2, 3, 4, 16
+                        break;
+                    case 5: //done
+                        self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+                        self.windowOffsetLeft = (self.nzWidth - self.zoomWindow.width() - (self.options.borderSize * 2)); //DONE - 5,15
+                        break;
+                    case 6:
+                        if (self.options.zoomWindowHeight > self.nzHeight) { //positive margin
+                            self.windowOffsetTop = (self.nzHeight);  //DONE - 4,5,6,7,8
+
+                            self.windowOffsetLeft = ((self.options.zoomWindowWidth / 2) - (self.nzWidth / 2) + (self.options.borderSize * 2)) * (-1);
+                        }
+                        else { //negative margin
+                            $.noop();
+                        }
+
+                        break;
+                    case 7: //done
+                        self.windowOffsetTop = (self.nzHeight);  //DONE - 4,5,6,7,8
+                        self.windowOffsetLeft = 0; //DONE 7, 13
+                        break;
+                    case 8: //done
+                        self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
+                        self.windowOffsetLeft = (self.zoomWindow.width() + (self.options.borderSize * 2)) * (-1);  //DONE 8,9,10,11,12
+                        break;
+                    case 9:  //done
+                        self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize * 2)); //DONE 3,9
+                        self.windowOffsetLeft = (self.zoomWindow.width() + (self.options.borderSize * 2)) * (-1);  //DONE 8,9,10,11,12
+                        break;
+                    case 10:
+                        if (self.options.zoomWindowHeight > self.nzHeight) { //positive margin
+
+                            self.windowOffsetTop = ((self.options.zoomWindowHeight / 2) - (self.nzHeight / 2)) * (-1);
+                            self.windowOffsetLeft = (self.zoomWindow.width() + (self.options.borderSize * 2)) * (-1);  //DONE 8,9,10,11,12
+                        }
+                        else { //negative margin
+                            $.noop();
+                        }
+                        break;
+                    case 11:
+                        self.windowOffsetTop = (self.options.zoomWindowOffsetY);
+                        self.windowOffsetLeft = (self.zoomWindow.width() + (self.options.borderSize * 2)) * (-1);  //DONE 8,9,10,11,12
+                        break;
+                    case 12: //done
+                        self.windowOffsetTop = (self.zoomWindow.height() + (self.options.borderSize * 2)) * (-1); //DONE 12,13,14,15,16
+                        self.windowOffsetLeft = (self.zoomWindow.width() + (self.options.borderSize * 2)) * (-1);  //DONE 8,9,10,11,12
+                        break;
+                    case 13: //done
+                        self.windowOffsetTop = (self.zoomWindow.height() + (self.options.borderSize * 2)) * (-1); //DONE 12,13,14,15,16
+                        self.windowOffsetLeft = (0); //DONE 7, 13
+                        break;
+                    case 14:
+                        if (self.options.zoomWindowHeight > self.nzHeight) { //positive margin
+                            self.windowOffsetTop = (self.zoomWindow.height() + (self.options.borderSize * 2)) * (-1); //DONE 12,13,14,15,16
+
+                            self.windowOffsetLeft = ((self.options.zoomWindowWidth / 2) - (self.nzWidth / 2) + (self.options.borderSize * 2)) * (-1);
+                        }
+                        else { //negative margin
+                            $.noop();
+                        }
+                        break;
+                    case 15://done
+                        self.windowOffsetTop = (self.zoomWindow.height() + (self.options.borderSize * 2)) * (-1); //DONE 12,13,14,15,16
+                        self.windowOffsetLeft = (self.nzWidth - self.zoomWindow.width() - (self.options.borderSize * 2)); //DONE - 5,15
+                        break;
+                    case 16:  //done
+                        self.windowOffsetTop = (self.zoomWindow.height() + (self.options.borderSize * 2)) * (-1); //DONE 12,13,14,15,16
+                        self.windowOffsetLeft = (self.nzWidth); //DONE 1, 2, 3, 4, 16
+                        break;
+                    default: //done
+                        self.windowOffsetTop = (self.options.zoomWindowOffsetY);//DONE - 1
+                        self.windowOffsetLeft = (self.nzWidth); //DONE 1, 2, 3, 4, 16
+                }
+            } //end isNAN
+            else {
+                // For BC purposes, treat passed element as ID if element not found
+                self.externalContainer = $(self.options.zoomWindowPosition);
+                if (!self.externalContainer.length) {
+                    self.externalContainer = $('#' + self.options.zoomWindowPosition);
+                }
+
+                self.externalContainerWidth = self.externalContainer.width();
+                self.externalContainerHeight = self.externalContainer.height();
+                self.externalContainerOffset = self.externalContainer.offset();
+
+                self.windowOffsetTop = self.externalContainerOffset.top;//DONE - 1
+                self.windowOffsetLeft = self.externalContainerOffset.left; //DONE 1, 2, 3, 4, 16
+
+            }
+            self.isWindowSet = true;
+            self.windowOffsetTop = self.windowOffsetTop + self.options.zoomWindowOffsetY;
+            self.windowOffsetLeft = self.windowOffsetLeft + self.options.zoomWindowOffsetX;
+
+            self.zoomWindow.css({
+                top: self.windowOffsetTop,
+                left: self.windowOffsetLeft
+            });
+
+            if (self.options.zoomType === 'inner') {
+                self.zoomWindow.css({
+                    top: 0,
+                    left: 0
+                });
+
+            }
+
+            self.windowLeftPos = ((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * -1;
+            self.windowTopPos = ((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * -1;
+            if (self.Etoppos) {
+                self.windowTopPos = 0;
+            }
+            if (self.Eloppos) {
+                self.windowLeftPos = 0;
+            }
+            if (self.Eboppos) {
+                self.windowTopPos = (self.largeHeight / self.currentZoomLevel - self.zoomWindow.height()) * (-1);
+            }
+            if (self.Eroppos) {
+                self.windowLeftPos = ((self.largeWidth / self.currentZoomLevel - self.zoomWindow.width()) * (-1));
+            }
+
+            //stops micro movements
+            if (self.fullheight) {
+                self.windowTopPos = 0;
+            }
+            if (self.fullwidth) {
+                self.windowLeftPos = 0;
+            }
+
+            //set the css background position
+            if (self.options.zoomType === 'window' || self.options.zoomType === 'inner') {
+
+                if (self.zoomLock === 1) {
+                    //overrides for images not zoomable
+                    if (self.widthRatio <= 1) {
+                        self.windowLeftPos = 0;
+                    }
+                    if (self.heightRatio <= 1) {
+                        self.windowTopPos = 0;
+                    }
+                }
+                // adjust images less than the window height
+
+                if (self.options.zoomType === 'window') {
+                    if (self.largeHeight < self.options.zoomWindowHeight) {
+                        self.windowTopPos = 0;
+                    }
+                    if (self.largeWidth < self.options.zoomWindowWidth) {
+                        self.windowLeftPos = 0;
+                    }
+                }
+                //set the zoomwindow background position
+                if (self.options.easing) {
+
+                    //     if(self.changeZoom){
+                    //           clearInterval(self.loop);
+                    //           self.changeZoom = false;
+                    //           self.loop = false;
+
+                    //            }
+                    //set the pos to 0 if not set
+                    if (!self.xp) {
+                        self.xp = 0;
+                    }
+                    if (!self.yp) {
+                        self.yp = 0;
+                    }
+                    var interval = 16;
+                    if (Number.isInteger(parseInt(self.options.easing))) {
+                        interval = parseInt(self.options.easing);
+                    }
+                    //if loop not already started, then run it
+                    if (!self.loop) {
+                        self.loop = setInterval(function () {
+                            //using zeno's paradox
+
+                            self.xp += (self.windowLeftPos - self.xp) / self.options.easingAmount;
+                            self.yp += (self.windowTopPos - self.yp) / self.options.easingAmount;
+                            if (self.scrollingLock) {
+
+                                clearInterval(self.loop);
+                                self.xp = self.windowLeftPos;
+                                self.yp = self.windowTopPos;
+
+                                self.xp = ((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * (-1);
+                                self.yp = (((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * (-1));
+
+                                if (self.changeBgSize) {
+                                    if (self.nzHeight > self.nzWidth) {
+                                        if (self.options.zoomType === 'lens') {
+                                            self.zoomLens.css({
+                                                backgroundSize: '' +
+                                                    (self.largeWidth / self.newvalueheight) + 'px ' +
+                                                    (self.largeHeight / self.newvalueheight) + 'px'
+                                            });
+                                        }
+                                        self.zoomWindow.css({
+                                            backgroundSize: '' +
+                                                (self.largeWidth / self.newvalueheight) + 'px ' +
+                                                (self.largeHeight / self.newvalueheight) + 'px'
+                                        });
+                                    }
+                                    else {
+                                        if (self.options.zoomType !== 'lens') {
+                                            self.zoomLens.css({
+                                                backgroundSize: '' +
+                                                    (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                                    (self.largeHeight / self.newvalueheight) + 'px'
+                                            });
+                                        }
+                                        self.zoomWindow.css({
+                                            backgroundSize: '' +
+                                                (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                                (self.largeHeight / self.newvaluewidth) + 'px'
+                                        });
+                                    }
+
+                                    /*
+                                     if(!self.bgxp){self.bgxp = self.largeWidth/self.newvalue;}
+                                     if(!self.bgyp){self.bgyp = self.largeHeight/self.newvalue ;}
+                                     if (!self.bgloop){
+                                     self.bgloop = setInterval(function(){
+
+                                     self.bgxp += (self.largeWidth/self.newvalue  - self.bgxp) / self.options.easingAmount;
+                                     self.bgyp += (self.largeHeight/self.newvalue  - self.bgyp) / self.options.easingAmount;
+
+                                     self.zoomWindow.css('background-size', self.bgxp + 'px ' + self.bgyp + 'px' );
+
+
+                                     }, 16);
+
+                                     }
+                                     */
+                                    self.changeBgSize = false;
+                                }
+
+                                self.zoomWindow.css({
+                                    backgroundPosition: '' + self.windowLeftPos + 'px ' + self.windowTopPos + 'px'
+                                });
+                                self.scrollingLock = false;
+                                self.loop = false;
+
+                            }
+                            else if (Math.round(Math.abs(self.xp - self.windowLeftPos) + Math.abs(self.yp - self.windowTopPos)) < 1) {
+                                //stops micro movements
+                                clearInterval(self.loop);
+                                self.zoomWindow.css({
+                                    backgroundPosition: '' + self.windowLeftPos + 'px ' + self.windowTopPos + 'px'
+                                });
+                                self.loop = false;
+                            }
+                            else {
+                                if (self.changeBgSize) {
+                                    if (self.nzHeight > self.nzWidth) {
+                                        if (self.options.zoomType === 'lens') {
+                                            self.zoomLens.css({
+                                                backgroundSize: '' +
+                                                (self.largeWidth / self.newvalueheight) + 'px ' +
+                                                (self.largeHeight / self.newvalueheight) + 'px'
+                                            });
+                                        }
+                                        self.zoomWindow.css({
+                                            backgroundSize: '' +
+                                            (self.largeWidth / self.newvalueheight) + 'px ' +
+                                            (self.largeHeight / self.newvalueheight) + 'px'
+                                        });
+                                    }
+                                    else {
+                                        if (self.options.zoomType !== 'lens') {
+                                            self.zoomLens.css({
+                                                backgroundSize: '' +
+                                                (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                                (self.largeHeight / self.newvaluewidth) + 'px'
+                                            });
+                                        }
+                                        self.zoomWindow.css({
+                                            backgroundSize: '' +
+                                            (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                            (self.largeHeight / self.newvaluewidth) + 'px'
+                                        });
+                                    }
+                                    self.changeBgSize = false;
+                                }
+
+                                self.zoomWindow.css({
+                                    backgroundPosition: '' + self.xp + 'px ' + self.yp + 'px'
+                                });
+                            }
+                        }, interval);
+                    }
+                }
+                else {
+                    if (self.changeBgSize) {
+                        if (self.nzHeight > self.nzWidth) {
+                            if (self.options.zoomType === 'lens') {
+                                self.zoomLens.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvalueheight) + 'px ' +
+                                    (self.largeHeight / self.newvalueheight) + 'px'
+                                });
+                            }
+
+                            self.zoomWindow.css({
+                                backgroundSize: '' +
+                                (self.largeWidth / self.newvalueheight) + 'px ' +
+                                (self.largeHeight / self.newvalueheight) + 'px'
+                            });
+                        }
+                        else {
+                            if (self.options.zoomType === 'lens') {
+                                self.zoomLens.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                    (self.largeHeight / self.newvaluewidth) + 'px'
+                                });
+                            }
+                            if ((self.largeHeight / self.newvaluewidth) < self.options.zoomWindowHeight) {
+
+                                self.zoomWindow.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvaluewidth) + 'px ' +
+                                    (self.largeHeight / self.newvaluewidth) + 'px'
+                                });
+                            }
+                            else {
+
+                                self.zoomWindow.css({
+                                    backgroundSize: '' +
+                                    (self.largeWidth / self.newvalueheight) + 'px ' +
+                                    (self.largeHeight / self.newvalueheight) + 'px'
+                                });
+                            }
+
+                        }
+                        self.changeBgSize = false;
+                    }
+
+                    self.zoomWindow.css({
+                        backgroundPosition: '' +
+                        self.windowLeftPos + 'px ' +
+                        self.windowTopPos + 'px'
+                    });
+                }
+            }
+        },
+
+        setTintPosition: function (e) {
+            var self = this;
+            var zoomLensWidth = self.zoomLens.width();
+            var zoomLensHeight = self.zoomLens.height();
+            self.updateOffset(self);
+            self.tintpos = ((e.pageX - self.nzOffset.left) - (zoomLensWidth / 2)) * -1;
+            self.tintposy = ((e.pageY - self.nzOffset.top) - zoomLensHeight / 2) * -1;
+            if (self.Etoppos) {
+                self.tintposy = 0;
+            }
+            if (self.Eloppos) {
+                self.tintpos = 0;
+            }
+            if (self.Eboppos) {
+                self.tintposy = (self.nzHeight - zoomLensHeight - (self.options.lensBorderSize * 2)) * (-1);
+            }
+            if (self.Eroppos) {
+                self.tintpos = ((self.nzWidth - zoomLensWidth - (self.options.lensBorderSize * 2)) * (-1));
+            }
+            if (self.options.tint) {
+                //stops micro movements
+                if (self.fullheight) {
+                    self.tintposy = 0;
+
+                }
+                if (self.fullwidth) {
+                    self.tintpos = 0;
+
+                }
+                self.zoomTintImage.css({
+                    left: self.tintpos,
+                    top: self.tintposy
+                });
+            }
+        },
+
+        swaptheimage: function (smallimage, largeimage) {
+            var self = this;
+            var newImg = new Image();
+
+            if (self.options.loadingIcon && !self.spinner) {
+                var styleAttr = {
+                    background: 'url("' + self.options.loadingIcon + '") no-repeat',
+                    height: self.nzHeight,
+                    width: self.nzWidth,
+                    zIndex: 2000,
+                    position: 'absolute',
+                    backgroundPosition: 'center center',
+                };
+                if (self.options.zoomType === 'inner') {
+                    styleAttr.setProperty('top', 0);
+                }
+                self.spinner = $('<div class="ezp-spinner"></div>')
+                  .css(styleAttr);
+                self.$elem.after(self.spinner);
+            } else if (self.spinner) {
+                self.spinner.show();
+            }
+
+            self.options.onImageSwap(self.$elem);
+
+            newImg.onload = function () {
+                self.largeWidth = newImg.width;
+                self.largeHeight = newImg.height;
+                self.zoomImage = largeimage;
+                self.zoomWindow.css({
+                    backgroundSize: '' + self.largeWidth + 'px ' + self.largeHeight + 'px'
+                });
+
+                self.swapAction(smallimage, largeimage);
+                return;
+            };
+            self.setImageSource(newImg, largeimage);  // this must be done AFTER setting onload
+        },
+
+        swapAction: function (smallimage, largeimage) {
+            var self = this;
+            var elemWidth = self.$elem.width();
+            var elemHeight = self.$elem.height();
+            var newImg2 = new Image();
+            newImg2.onload = function () {
+                //re-calculate values
+                self.nzHeight = newImg2.height;
+                self.nzWidth = newImg2.width;
+                self.options.onImageSwapComplete(self.$elem);
+
+                self.doneCallback();
+                return;
+            };
+            self.setImageSource(newImg2, smallimage);
+
+            //reset the zoomlevel to that initially set in options
+            self.currentZoomLevel = self.options.zoomLevel;
+            self.options.maxZoomLevel = false;
+
+            //swaps the main image
+            //self.$elem.attr('src',smallimage);
+            //swaps the zoom image
+            if (self.options.zoomType === 'lens') {
+                self.zoomLens.css('background-image', 'url("' + largeimage + '")');
+            }
+            if (self.options.zoomType === 'window') {
+                self.zoomWindow.css('background-image', 'url("' + largeimage + '")');
+            }
+            if (self.options.zoomType === 'inner') {
+                self.zoomWindow.css('background-image', 'url("' + largeimage + '")');
+            }
+
+            self.currentImage = largeimage;
+
+            if (self.options.imageCrossfade) {
+                var oldImg = self.$elem;
+                var newImg = oldImg.clone();
+                self.$elem.attr('src', smallimage);
+                self.$elem.after(newImg);
+                newImg.stop(true).fadeOut(self.options.imageCrossfade, function () {
+                    $(this).remove();
+                });
+
+                // if(self.options.zoomType === 'inner'){
+                //remove any attributes on the cloned image so we can resize later
+                self.$elem.width('auto').removeAttr('width');
+                self.$elem.height('auto').removeAttr('height');
+                //   }
+
+                oldImg.fadeIn(self.options.imageCrossfade);
+
+                if (self.options.tint && self.options.zoomType !== 'inner') {
+
+                    var oldImgTint = self.zoomTintImage;
+                    var newImgTint = oldImgTint.clone();
+                    self.zoomTintImage.attr('src', largeimage);
+                    self.zoomTintImage.after(newImgTint);
+                    newImgTint.stop(true).fadeOut(self.options.imageCrossfade, function () {
+                        $(this).remove();
+                    });
+
+                    oldImgTint.fadeIn(self.options.imageCrossfade);
+
+                    //self.zoomTintImage.attr('width',elem.data('image'));
+
+                    //resize the tint window
+                    self.zoomTint.css({
+                        height: elemHeight,
+                        width: elemWidth
+                    });
+                }
+
+                self.zoomContainer.css({
+                    'height': elemHeight,
+                    'width': elemWidth
+                });
+
+                if (self.options.zoomType === 'inner') {
+                    if (!self.options.constrainType) {
+                        self.zoomWrap.parent().css({
+                            'height': elemHeight,
+                            'width': elemWidth
+                        });
+
+                        self.zoomWindow.css({
+                            'height': elemHeight,
+                            'width': elemWidth
+                        });
+                    }
+                }
+
+                if (self.options.imageCrossfade) {
+                    self.zoomWrap.css({
+                        'height': elemHeight,
+                        'width': elemWidth
+                    });
+                }
+            }
+            else {
+                self.$elem.attr('src', smallimage);
+                if (self.options.tint) {
+                    self.zoomTintImage.attr('src', largeimage);
+                    //self.zoomTintImage.attr('width',elem.data('image'));
+                    self.zoomTintImage.attr('height', elemHeight);
+                    //self.zoomTintImage.attr('src') = elem.data('image');
+                    self.zoomTintImage.css('height', elemHeight);
+                    self.zoomTint.css('height', elemHeight);
+
+                }
+                self.zoomContainer.css({
+                    'height': elemHeight,
+                    'width': elemWidth
+                });
+
+                if (self.options.imageCrossfade) {
+                    self.zoomWrap.css({
+                        'height': elemHeight,
+                        'width': elemWidth
+                    });
+                }
+            }
+            if (self.options.constrainType) {
+
+                //This will contrain the image proportions
+                if (self.options.constrainType === 'height') {
+
+                    var autoWDimension = {
+                        'height': self.options.constrainSize,
+                        'width': 'auto'
+                    };
+                    self.zoomContainer.css(autoWDimension);
+
+                    if (self.options.imageCrossfade) {
+                        self.zoomWrap.css(autoWDimension);
+                        self.constwidth = self.zoomWrap.width();
+                    }
+                    else {
+                        self.$elem.css(autoWDimension);
+                        self.constwidth = elemWidth;
+                    }
+
+                    var constWDim = {
+                        'height': self.options.constrainSize,
+                        'width': self.constwidth
+                    };
+                    if (self.options.zoomType === 'inner') {
+
+                        self.zoomWrap.parent().css(constWDim);
+                        self.zoomWindow.css(constWDim);
+                    }
+                    if (self.options.tint) {
+                        self.tintContainer.css(constWDim);
+                        self.zoomTint.css(constWDim);
+                        self.zoomTintImage.css(constWDim);
+                    }
+
+                }
+                if (self.options.constrainType === 'width') {
+                    var autoHDimension = {
+                        'height': 'auto',
+                        'width': self.options.constrainSize
+                    };
+                    self.zoomContainer.css(autoHDimension);
+
+                    if (self.options.imageCrossfade) {
+                        self.zoomWrap.css(autoHDimension);
+                        self.constheight = self.zoomWrap.height();
+                    }
+                    else {
+                        self.$elem.css(autoHDimension);
+                        self.constheight = elemHeight;
+                    }
+
+                    var constHDim = {
+                        'height': self.constheight,
+                        'width': self.options.constrainSize
+                    };
+                    if (self.options.zoomType === 'inner') {
+                        self.zoomWrap.parent().css(constHDim);
+                        self.zoomWindow.css(constHDim);
+                    }
+                    if (self.options.tint) {
+                        self.tintContainer.css(constHDim);
+                        self.zoomTint.css(constHDim);
+                        self.zoomTintImage.css(constHDim);
+                    }
+                }
+            }
+        },
+
+        doneCallback: function () {
+            var self = this;
+            if (self.options.loadingIcon && !!self.spinner && !!self.spinner.length) {
+                self.spinner.hide();
+            }
+
+            self.updateOffset(self);
+            self.nzWidth = self.$elem.width();
+            self.nzHeight = self.$elem.height();
+
+            // reset the zoomlevel back to default
+            self.currentZoomLevel = self.options.zoomLevel;
+
+            //ratio of the large to small image
+            self.widthRatio = self.largeWidth / self.nzWidth;
+            self.heightRatio = self.largeHeight / self.nzHeight;
+
+            //NEED TO ADD THE LENS SIZE FOR ROUND
+            // adjust images less than the window height
+            if (self.options.zoomType === 'window') {
+
+                if (self.nzHeight < self.options.zoomWindowHeight / self.heightRatio) {
+                    self.lensHeight = self.nzHeight;
+
+                }
+                else {
+                    self.lensHeight = self.options.zoomWindowHeight / self.heightRatio;
+                }
+
+                if (self.nzWidth < self.options.zoomWindowWidth) {
+                    self.lensWidth = self.nzWidth;
+                }
+                else {
+                    self.lensWidth = self.options.zoomWindowWidth / self.widthRatio;
+                }
+
+                if (self.zoomLens) {
+                    self.zoomLens.css({
+                        'width': self.lensWidth,
+                        'height': self.lensHeight
+                    });
+                }
+            }
+        },
+
+        getCurrentImage: function () {
+            var self = this;
+            return self.zoomImage;
+        },
+
+        getGalleryList: function () {
+            var self = this;
+            //loop through the gallery options and set them in list for fancybox
+            self.gallerylist = [];
+            if (self.options.gallery) {
+                $('#' + self.options.gallery + ' a').each(function () {
+
+                    var imgSrc = '';
+                    if ($(this).data(self.options.attrImageZoomSrc)) {
+                        imgSrc = $(this).data(self.options.attrImageZoomSrc);
+                    }
+                    else if ($(this).data('image')) {
+                        imgSrc = $(this).data('image');
+                    }
+                    //put the current image at the start
+                    if (imgSrc === self.zoomImage) {
+                        self.gallerylist.unshift({
+                            href: '' + imgSrc + '',
+                            title: $(this).find('img').attr('title')
+                        });
+                    }
+                    else {
+                        self.gallerylist.push({
+                            href: '' + imgSrc + '',
+                            title: $(this).find('img').attr('title')
+                        });
+                    }
+                });
+            }
+            //if no gallery - return current image
+            else {
+                self.gallerylist.push({
+                    href: '' + self.zoomImage + '',
+                    title: $(this).find('img').attr('title')
+                });
+            }
+            return self.gallerylist;
+        },
+
+        changeZoomLevel: function (value) {
+            var self = this;
+
+            //flag a zoom, so can adjust the easing during setPosition
+            self.scrollingLock = true;
+
+            //round to two decimal places
+            self.newvalue = parseFloat(value).toFixed(2);
+            var newvalue = self.newvalue;
+
+            //maxwidth & Maxheight of the image
+            var maxheightnewvalue = self.largeHeight / ((self.options.zoomWindowHeight / self.nzHeight) * self.nzHeight);
+            var maxwidthtnewvalue = self.largeWidth / ((self.options.zoomWindowWidth / self.nzWidth) * self.nzWidth);
+
+            //calculate new heightratio
+            if (self.options.zoomType !== 'inner') {
+                if (maxheightnewvalue <= newvalue) {
+                    self.heightRatio = (self.largeHeight / maxheightnewvalue) / self.nzHeight;
+                    self.newvalueheight = maxheightnewvalue;
+                    self.fullheight = true;
+                }
+                else {
+                    self.heightRatio = (self.largeHeight / newvalue) / self.nzHeight;
+                    self.newvalueheight = newvalue;
+                    self.fullheight = false;
+                }
+
+                // calculate new width ratio
+
+                if (maxwidthtnewvalue <= newvalue) {
+                    self.widthRatio = (self.largeWidth / maxwidthtnewvalue) / self.nzWidth;
+                    self.newvaluewidth = maxwidthtnewvalue;
+                    self.fullwidth = true;
+                }
+                else {
+                    self.widthRatio = (self.largeWidth / newvalue) / self.nzWidth;
+                    self.newvaluewidth = newvalue;
+                    self.fullwidth = false;
+                }
+                if (self.options.zoomType === 'lens') {
+                    if (maxheightnewvalue <= newvalue) {
+                        self.fullwidth = true;
+                        self.newvaluewidth = maxheightnewvalue;
+                    } else {
+                        self.widthRatio = (self.largeWidth / newvalue) / self.nzWidth;
+                        self.newvaluewidth = newvalue;
+
+                        self.fullwidth = false;
+                    }
+                }
+            }
+
+            if (self.options.zoomType === 'inner') {
+                maxheightnewvalue = parseFloat(self.largeHeight / self.nzHeight).toFixed(2);
+                maxwidthtnewvalue = parseFloat(self.largeWidth / self.nzWidth).toFixed(2);
+                if (newvalue > maxheightnewvalue) {
+                    newvalue = maxheightnewvalue;
+                }
+                if (newvalue > maxwidthtnewvalue) {
+                    newvalue = maxwidthtnewvalue;
+                }
+
+                if (maxheightnewvalue <= newvalue) {
+                    self.heightRatio = (self.largeHeight / newvalue) / self.nzHeight;
+                    if (newvalue > maxheightnewvalue) {
+                        self.newvalueheight = maxheightnewvalue;
+                    } else {
+                        self.newvalueheight = newvalue;
+                    }
+                    self.fullheight = true;
+                }
+                else {
+                    self.heightRatio = (self.largeHeight / newvalue) / self.nzHeight;
+
+                    if (newvalue > maxheightnewvalue) {
+
+                        self.newvalueheight = maxheightnewvalue;
+                    } else {
+                        self.newvalueheight = newvalue;
+                    }
+                    self.fullheight = false;
+                }
+
+                if (maxwidthtnewvalue <= newvalue) {
+
+                    self.widthRatio = (self.largeWidth / newvalue) / self.nzWidth;
+                    if (newvalue > maxwidthtnewvalue) {
+
+                        self.newvaluewidth = maxwidthtnewvalue;
+                    } else {
+                        self.newvaluewidth = newvalue;
+                    }
+
+                    self.fullwidth = true;
+                }
+                else {
+                    self.widthRatio = (self.largeWidth / newvalue) / self.nzWidth;
+                    self.newvaluewidth = newvalue;
+                    self.fullwidth = false;
+                }
+            } //end inner
+            var scrcontinue = false;
+
+            if (self.options.zoomType === 'inner') {
+                if (self.nzWidth >= self.nzHeight) {
+                    if (self.newvaluewidth <= maxwidthtnewvalue) {
+                        scrcontinue = true;
+                    }
+                    else {
+                        scrcontinue = false;
+                        self.fullheight = true;
+                        self.fullwidth = true;
+                    }
+                }
+                if (self.nzHeight > self.nzWidth) {
+                    if (self.newvaluewidth <= maxwidthtnewvalue) {
+                        scrcontinue = true;
+                    }
+                    else {
+                        scrcontinue = false;
+                        self.fullheight = true;
+                        self.fullwidth = true;
+                    }
+                }
+            }
+
+            if (self.options.zoomType !== 'inner') {
+                scrcontinue = true;
+            }
+
+            if (scrcontinue) {
+                self.zoomLock = 0;
+                self.changeZoom = true;
+
+                //if lens height is less than image height
+                if (((self.options.zoomWindowHeight) / self.heightRatio) <= self.nzHeight) {
+                    self.currentZoomLevel = self.newvalueheight;
+                    if (self.options.zoomType !== 'lens' && self.options.zoomType !== 'inner') {
+                        self.changeBgSize = true;
+                        self.zoomLens.css({
+                            height: self.options.zoomWindowHeight / self.heightRatio
+                        });
+                    }
+                    if (self.options.zoomType === 'lens' || self.options.zoomType === 'inner') {
+                        self.changeBgSize = true;
+                    }
+                }
+
+                if ((self.options.zoomWindowWidth / self.widthRatio) <= self.nzWidth) {
+                    if (self.options.zoomType !== 'inner') {
+                        if (self.newvaluewidth > self.newvalueheight) {
+                            self.currentZoomLevel = self.newvaluewidth;
+                        }
+                    }
+
+                    if (self.options.zoomType !== 'lens' && self.options.zoomType !== 'inner') {
+                        self.changeBgSize = true;
+
+                        self.zoomLens.css({
+                            width: self.options.zoomWindowWidth / self.widthRatio
+                        });
+                    }
+                    if (self.options.zoomType === 'lens' || self.options.zoomType === 'inner') {
+                        self.changeBgSize = true;
+                    }
+
+                }
+                if (self.options.zoomType === 'inner') {
+                    self.changeBgSize = true;
+
+                    if (self.nzWidth > self.nzHeight) {
+                        self.currentZoomLevel = self.newvaluewidth;
+                    }
+                    else if (self.nzHeight >= self.nzWidth) {
+                        self.currentZoomLevel = self.newvaluewidth;
+                    }
+                }
+            }      //under
+
+            //sets the boundry change, called in setWindowPos
+            self.setPosition(self.currentLoc);
+            //
+        },
+
+        closeAll: function () {
+            var self = this;
+            if (self.zoomWindow) {
+                self.zoomWindow.hide();
+            }
+            if (self.zoomLens) {
+                self.zoomLens.hide();
+            }
+            if (self.zoomTint) {
+                self.zoomTint.hide();
+            }
+        },
+        updateOffset: function (self) {
+            if (self.options.zoomContainerAppendTo !== 'body') {
+                self.nzOffset = self.$elem.offset();
+                var appendedPosition = $(self.options.zoomContainerAppendTo).offset();
+                self.nzOffset.top = self.$elem.offset().top - appendedPosition.top;
+                self.nzOffset.left = self.$elem.offset().left - appendedPosition.left;
+
+            } else {
+                self.nzOffset = self.$elem.offset();
+            }
+        },
+
+        changeState: function (value) {
+            var self = this;
+            if (value === 'enable') {
+                self.options.zoomEnabled = true;
+            }
+            if (value === 'disable') {
+                self.options.zoomEnabled = false;
+            }
+        },
+
+        responsiveConfig: function (options) {
+            if (options.respond && options.respond.length > 0) {
+                return $.extend({}, options, this.configByScreenWidth(options));
+            }
+            return options;
+        },
+
+        configByScreenWidth: function (options) {
+            var screenWidth = $(window).width();
+
+            var config = $.grep(options.respond, function (item) {
+                var range = item.range.split('-');
+                return (screenWidth >= range[0]) && (screenWidth <= range[1]);
+            });
+
+            if (config.length > 0) {
+                return config[0];
+            } else {
+                return options;
+            }
+        }
+    };
+
+    $.fn.ezPlus = function (options) {
+        return this.each(function () {
+            var elevate = Object.create(EZP);
+
+            elevate.init(options, this);
+
+            $.data(this, 'ezPlus', elevate);
+
+        });
+    };
+
+    $.fn.ezPlus.options = {
+        attrImageZoomSrc: 'zoom-image', // attribute to plugin use for zoom
+        borderColour: '#888',
+        borderSize: 4,
+        constrainSize: false,  //in pixels the dimensions you want to constrain on
+        constrainType: false,  //width or height
+        containLensZoom: false,
+        cursor: 'inherit', // user should set to what they want the cursor as, if they have set a click function
+        debug: false,
+        easing: false,
+        easingAmount: 12,
+        enabled: true,
+
+        gallery: false,
+        galleryActiveClass: 'zoomGalleryActive',
+        gallerySelector: false,
+        galleryItem: 'a',
+        galleryEvent: 'click',
+
+        imageCrossfade: false,
+
+        lensBorderColour: '#000',
+        lensBorderSize: 1,
+        lensColour: 'white', //colour of the lens background
+        lensFadeIn: false,
+        lensFadeOut: false,
+        lensOpacity: 0.4, //opacity of the lens
+        lensShape: 'square', //can be 'round'
+        lensSize: 200,
+        lenszoom: false,
+
+        loadingIcon: true, //http://www.example.com/spinner.gif
+
+        // This change will allow to decide if you want to decrease
+        // zoom of one of the dimensions once the other reached it's top value,
+        // or keep the aspect ratio, default behaviour still being as always,
+        // allow to continue zooming out, so it keeps retrocompatibility.
+        mantainZoomAspectRatio: false,
+        maxZoomLevel: false,
+        minZoomLevel: 1.01,
+        //minZoomLevel: false,
+
+        onComplete: $.noop,
+        onDestroy: $.noop,
+        onImageClick: $.noop,
+        onImageSwap: $.noop,
+        onImageSwapComplete: $.noop,
+        onShow: $.noop,
+        onHide: $.noop,
+        onZoomedImageLoaded: $.noop,
+
+        preloading: 1, //by default, load all the images, if 0, then only load images after activated (PLACEHOLDER FOR NEXT VERSION)
+        respond: [],
+        responsive: true,
+        scrollZoom: false, //allow zoom on mousewheel, true to activate
+        scrollZoomIncrement: 0.1,  //steps of the scrollzoom
+        showLens: true,
+        tint: false, //enable the tinting
+        tintColour: '#333', //default tint color, can be anything, red, #ccc, rgb(0,0,0)
+        tintOpacity: 0.4, //opacity of the tint
+        touchEnabled: true,
+
+        zoomActivation: 'hover', // Can also be click (PLACEHOLDER FOR NEXT VERSION)
+        zoomContainerAppendTo: 'body', //zoom container parent selector
+        zoomId: -1, // identifier for the zoom container
+        zoomLevel: 1, //default zoom level of image
+        zoomTintFadeIn: false,
+        zoomTintFadeOut: false,
+        zoomType: 'window', //window is default,  also 'lens' available -
+        zoomWindowAlwaysShow: false,
+        zoomWindowBgColour: '#fff',
+        zoomWindowFadeIn: false,
+        zoomWindowFadeOut: false,
+        zoomWindowHeight: 400,
+        zoomWindowOffsetX: 0,
+        zoomWindowOffsetY: 0,
+        zoomWindowPosition: 1, //Possible values: 1-16, but we can also position with a selector string.
+        zoomWindowWidth: 400,
+        zoomEnabled: true, //false disables zoomwindow from showing
+        zIndex: 999
+    };
+
+})(window.jQuery, window, document);

+ 50 - 6
static/fossil/js/script.js

@@ -36,9 +36,13 @@ function toggleFullscreen(elem) {
 
 $(function() {
 
-    $("#front-quality-text").text( ($("#img-front").width()  / parseInt($("#top-count").text())).toFixed(2).toString() + "%");
-    $("#top-quality-text").text( ($("#img-top").width()  / parseInt($("#front-count").text())).toFixed(2).toString() + "%");
-    $("#left-quality-text").text(  ($("#placeholder-left").width()  / parseInt($("#front-count").text())).toFixed(2).toString() + "%"); 
+    //$("#front-quality-text").text( ($("#img-front").width()  / parseInt($("#top-count").text())).toFixed(2).toString() + "%");
+    //$("#top-quality-text").text( ($("#img-top").width()  / parseInt($("#front-count").text())).toFixed(2).toString() + "%");
+    //$("#left-quality-text").text(  ($("#placeholder-left").width()  / parseInt($("#front-count").text())).toFixed(2).toString() + "%"); 
+    
+    $("#front-quality-text").text("Size: 25%");
+    $("#top-quality-text").text("Size: 25%");
+    $("#left-quality-text").text("Size: 25%");
 
     $( "#slider-left" ).slider({
         range: "max",
@@ -51,6 +55,11 @@ $(function() {
             var id = $( "select option:selected" ).val();
             $("#left-text").text(ui.value);
             // update image src
+            // data-zoom-image
+            //$("#placeholder-left").attr("data-zoom-image", "img?id="+id+"&name="+name+"&type=left-resized&counter="+(ui.value-1));
+            var imageUrl = "img?id="+id+"&name="+name+"&type=left&counter="+(ui.value-1);
+            $("#placeholder-left-zoomContainer > .zoomWindowContainer > div").css('background-image', 'url("' + imageUrl + '")');
+            //$("#placeholder-left-zoomContainer > .zoomLens").css('background-image', 'url("' + imageUrl + '")');
             $("#placeholder-left").attr("src", "img?id="+id+"&name="+name+"&type=left-resized&counter="+(ui.value-1));
         }
     });
@@ -66,6 +75,10 @@ $(function() {
             var id = $( "select option:selected" ).val();
             $("#front-text").text(ui.value);
             // update image src
+            var imageUrl = "img?id="+id+"&name="+name+"&type=front&counter="+(ui.value-1);
+            $("#img-front-zoomContainer > .zoomWindowContainer > div").css('background-image', 'url("' + imageUrl + '")');
+            //$("#img-front-zoomContainer > .zoomLens").css('background-image', 'url("' + imageUrl + '")');
+            //$("#img-front").attr("data-zoom-image", "img?id="+id+"&name="+name+"&type=left-resized&counter="+(ui.value-1));
             $("#img-front").attr("src", "img?id="+id+"&name="+name+"&type=front-resized&counter="+(ui.value-1));
         }
     });
@@ -81,6 +94,9 @@ $(function() {
             var id = $( "select option:selected" ).val();
             $("#top-text").text(ui.value);
             // update image src
+            var imageUrl = "img?id="+id+"&name="+name+"&type=top&counter="+(ui.value-1);
+            $("#img-top-zoomContainer > .zoomWindowContainer > div").css('background-image', 'url("' + imageUrl + '")');
+            //$("#img-top-zoomContainer > .zoomLens").css('background-image', 'url("' + imageUrl + '")');
             $("#img-top").attr("src", "img?id="+id+"&name="+name+"&type=top-resized&counter="+(ui.value-1));
         }
     });
@@ -130,9 +146,9 @@ $(function() {
                 $("#img-top").attr("src", "img?id="+index+"&name="+name+"&type=top-resized&counter="+(top_index-1));
                 $("#img-front").attr("src", "img?id="+index+"&name="+name+"&type=front-resized&counter="+(front_index-1));
             
-                $("#front-quality-text").text( " " + ($("#img-front").width() / response.front_count).toFixed(2).toString() + "%");
-                $("#top-quality-text").text(" " + ($("#img-top").width()  / response.top_count).toFixed(2).toString() + "%");
-                $("#left-quality-text").text(" " + ($("#placeholder-left").width()  / response.left_count).toFixed(2).toString() + "%"); 
+                //$("#front-quality-text").text( " " + ($("#img-front").width() / response.front_count).toFixed(2).toString() + "%");
+                //$("#top-quality-text").text(" " + ($("#img-top").width()  / response.top_count).toFixed(2).toString() + "%");
+                //$("#left-quality-text").text(" " + ($("#placeholder-left").width()  / response.left_count).toFixed(2).toString() + "%"); 
             
             },
             error: function () {
@@ -226,6 +242,7 @@ $(function() {
         $("#placeholder-left").attr("src", "img?id="+id+"&name="+name+"&type=left-resized&counter="+index.toString());
     });
 
+    /*
     document.getElementById("img-front").addEventListener("click", function() {
         console.log(this);
         toggleFullscreen(this);
@@ -240,5 +257,32 @@ $(function() {
         console.log(this);
         toggleFullscreen(this);
     });
+    */
 
+    $("#img-top").ezPlus({
+        zoomWindowPosition: 1,
+        scrollZoom: true,
+        zoomLevel: 0.1,
+        minZoomLevel: 0.1,
+        zoomWindowWidth: 400,
+        zoomWindowHeight: 400
+    });
+ 
+    $("#placeholder-left").ezPlus({
+        zoomWindowPosition: 9,
+        scrollZoom: true,
+        zoomLevel: 0.1,
+        minZoomLevel: 0.1,
+        zoomWindowWidth: 400,
+        zoomWindowHeight: 400
+    });
+
+    $("#img-front").ezPlus({
+        zoomWindowPosition: 11,
+        scrollZoom: true,
+        zoomLevel: 0.1,
+        minZoomLevel: 0.1,
+        zoomWindowWidth: 400,
+        zoomWindowHeight: 400
+    });
 });

+ 5 - 4
templates/index.html

@@ -97,7 +97,7 @@
         <div id="img-right">
             <div class="cont">
                 <img id="front-left" class="icon" src="{{ static_url("img/icon/left-arrow.svg") }}"/>
-                <span id="image-text">Front: <span id="front-text">1</span><span id="front-count-text"> (max: {{ front_count }}) </span><span id="front-quality-text"></span></span>
+                <span id="image-text">Front: <span id="front-text">1</span>&nbsp;&nbsp;&nbsp;&nbsp;<span id="front-quality-text"></span></span>
                 <img id="front-right" class="icon" src="{{ static_url("img/icon/right-arrow.svg") }}"/>
             </div>
 	        <div class="photowrapper">
@@ -109,17 +109,17 @@
         <div id="img-center">
             <div class="cont">
                 <img id="top-left" class="icon" src="{{ static_url("img/icon/left-arrow.svg") }}"/>
-                <span id="image-text">Top: <span id="top-text">1</span><span id="top-count-text"> (max: {{ top_count }}) </span><span id="top-quality-text"></span></span>
+                <span id="image-text">Top: <span id="top-text">1</span>&nbsp;&nbsp;&nbsp;&nbsp;<span id="top-quality-text"></span></span>
                 <img id="top-right" class="icon" src="{{ static_url("img/icon/right-arrow.svg") }}"/>
             </div>
 	        <div class="photowrapper">
-                <img id="img-top" src="img?id={{ index }}&name={{ name }}&type=top-resized&counter=0"/>
+                <img id="img-top" src="img?id={{ index }}&name={{ name }}&type=top-resized&counter=0" data-zoom-image="img?id={{ index }}&name={{ name }}&type=top-resized&counter=0" />
             </div>
 	        <div id="slider-center"></div><div class="slice-count" id="top-count">{{ top_count }}</div>
 
             <div class="cont">
                 <img id="left-left" class="icon" src="{{ static_url("img/icon/left-arrow.svg") }}"/>
-                <span id="image-text">Left: <span id="left-text">1</span><span id="left-count-text"> (max: {{ left_count }}) </span><span id="left-quality-text"></span></span>
+                <span id="image-text">Left: <span id="left-text">1</span>&nbsp;&nbsp;&nbsp;&nbsp;<span id="left-quality-text"></span></span>
                 <img id="left-right" class="icon" src="{{ static_url("img/icon/right-arrow.svg") }}"/>
             </div>
 	        <div class="photowrapper">
@@ -134,6 +134,7 @@
     <div id="footer">&copy;2017 A service provided by Ultra-fast Online Processing for Data-intensive Sciences group (UFO), https://ufo.kit.edu/</div>
 <script src="{{ static_url("js/jquery-1.12.4.min.js") }}"></script>
 <script src="{{ static_url("js/jquery-ui.min.js") }}"></script>
+<script src="{{ static_url("js/jquery.ez-plus.js") }}"></script>
 <script src="{{ static_url("js/script.js") }}"></script>
 </body>
 </html>