(function($) {
	
	// plugin definition
	$.fn.jqImagePreview = function(options) {
	  // Extend our default options with those provided.
	  var opts = $.extend({}, $.fn.jqImagePreview.defaults, options);
	  opts.previewDomObj =  $(opts.previewSel);
	  if(!opts.previewDomObj) return false;
	  // iterate and process each matched element
	  return this.each(function() {  

		 function updatePosition(e){
			if((e.pageY + opts.yOffset + opts.previewDomObj.height()) > ($(window).height() + $(window).scrollTop()))
				opts.previewDomObj.css("top",(e.pageY - opts.previewDomObj.height() - opts.yOffset ) + "px");
			else
				opts.previewDomObj.css("top",(e.pageY + opts.yOffset) + "px");
			
			if((e.pageX + opts.xOffset + opts.previewDomObj.width()) > ($(window).width() + $(window).scrollLeft()))
				opts.previewDomObj.css("left",(e.pageX - opts.previewDomObj.width() - opts.xOffset) + "px");
			else
				opts.previewDomObj.css("left",(e.pageX + opts.xOffset) + "px");
		 }
		  
		  var hoverPic = $(this);
		  //backup and remove title
		 hoverPic.data("title",hoverPic.attr("title"));
		 hoverPic.removeAttr("title");
		  
		  hoverPic.hover(
				function(e){
					e.preventDefault();
					hoverPic.data('timeout',setTimeout(function() {	
						var src = hoverPic.attr("previewImg");
						var width = hoverPic.attr("previewImgWidth");
						var height = hoverPic.attr("previewImgHeight");
						if(src){	
							// create Prewiev Image
							var img = new Image();
							var title = hoverPic.data("title");
							var event = e;
							
							//set the title
							if(title && opts.showTitle) opts.previewDomObj.find(opts.previewTitleSel).html(title).show();
							else opts.previewDomObj.find(opts.previewTitleSel).hide();
							// call this function after it's loaded
							img.onload = function() {
								//replace img
								var previewImg = opts.previewDomObj.find('img');
								previewImg.attr("src",src);
								if(width) previewImg.attr("width",width);
								if(height) previewImg.attr("height",height);
								//show or fade in PreviewDiv
								if(opts.fadeInTime > 0)  opts.previewDomObj.fadeIn(opts.fadeInTime);
								else 					 opts.previewDomObj.show();
							};
							// begin loading the image
							img.src = src;
						}
				     },opts.delayTime));
			    },
				function(e){
			    	clearTimeout(hoverPic.data('timeout'));
			    	//hoverPic.unbind('mousemove');
					if(opts.fadeOutTime > 0)	opts.previewDomObj.fadeOut(opts.fadeOutTime);
					else						opts.previewDomObj.hide();
			    }
			);//end hover
		  //register mousemove event
		 hoverPic.bind('mousemove',updatePosition);
	  });
	};
	// plugin defaults - added as a property on our plugin function
	$.fn.jqImagePreview.defaults = {
		previewSel: '#imgPreviewTooltip',
		previewTitleSel: '.imgTitle',
		showTitle: true,
		xOffset: 10,
		yOffset: 10,
		delayTime: 500,
		fadeInTime: 200,
		fadeOutTime: 0
		
	};
// end of closure
})(jQuery);
