/**
 *---------------------------------------------------------------------------------------
 * @package       VirtuePlanet Framework for Joomla!
 *---------------------------------------------------------------------------------------
 * @copyright     Copyright (C) 2012-2018 VirtuePlanet Services LLP. All rights reserved.
 * @license       GNU General Public License version 2 or later; see LICENSE.txt
 * @authors       Abhishek Das
 * @email         info@virtueplanet.com
 * @link          https://www.virtueplanet.com
 *---------------------------------------------------------------------------------------
 */
//////////////////////////////////////////////////////////////////////////////////
// Cloud Zoom V1.0.2
// (c) 2010 by R Cecco. <http://www.professorcloud.com>
// MIT License
//
// Please retain this copyright header in all versions of the software
//////////////////////////////////////////////////////////////////////////////////
// Cloud Zoom V1.0.2 is modified for VP Framework
//////////////////////////////////////////////////////////////////////////////////
(function($) {
	$(document).ready(function() {
		$('.vpf-zoom, .vpf-zoom-gallery').CloudZoom()
	});

	function format(str) {
		for (var i = 1; i < arguments.length; i++) {
			str = str.replace('%' + (i - 1), arguments[i])
		}
		return str
	}

	function CloudZoom(jWin, opts) {
		var sImg = $('img', jWin);
		var img1;
		var img2;
		var zoomDiv = null;
		var $mouseTrap = null;
		var lens = null;
		var $tint = null;
		var softFocus = null;
		var $ie6Fix = null;
		var zoomImage;
		var controlTimer = 0;
		var cw, ch;
		var destU = 0;
		var destV = 0;
		var currV = 0;
		var currU = 0;
		var filesLoaded = 0;
		var touchy = ("ontouchstart" in document.documentElement) || $('html').hasClass('touch') ? true : false;
		var m_latesttap;
		var mx, my;
		var ctx = this,
			zw;
		setTimeout(function() {
			if ($mouseTrap === null) {
				var w = jWin.width();
				jWin.parent().append(format('<div style="width:%0px;position:absolute;top:50%;left:%1px;text-align:center" class="vpf-zoom-loading" >Loading...</div>', w / 3, (w / 2) - (w / 6))).find(':last').stop(true, true).hide().fadeIn(200);
			}
		}, 200);
		var ie6FixRemove = function() {
			if ($ie6Fix !== null) {
				$ie6Fix.remove();
				$ie6Fix = null
			}
		};
		this.removeBits = function() {
			if (lens) {
				lens.remove();
				lens = null
			}
			if ($tint) {
				$tint.remove();
				$tint = null
			}
			if (softFocus) {
				softFocus.remove();
				softFocus = null
			}
			ie6FixRemove();
			$('.vpf-zoom-loading', jWin.parent()).stop(true, true).fadeOut(200).remove();
		};
		this.destroy = function() {
			jWin.data('zoom', null);
			if ($mouseTrap) {
				$mouseTrap.unbind();
				$mouseTrap.remove();
				$mouseTrap = null
			}
			if (zoomDiv) {
				zoomDiv.remove();
				zoomDiv = null
			}
			this.removeBits()
		};
		this.fadedOut = function() {
			if (zoomDiv) {
				zoomDiv.remove();
				zoomDiv = null
			}
			this.removeBits()
		};
		this.controlLoop = function() {
			if (lens) {
				var x = (mx - sImg.offset().left - (cw * 0.5)) >> 0;
				var y = (my - sImg.offset().top - (ch * 0.5)) >> 0;
				if (x < 0) {
					x = 0
				} else if (x > (sImg.outerWidth() - cw)) {
					x = (sImg.outerWidth() - cw)
				}
				if (y < 0) {
					y = 0
				} else if (y > (sImg.outerHeight() - ch)) {
					y = (sImg.outerHeight() - ch)
				}
				lens.css({
					left: x,
					top: y
				});
				lens.css('background-position', (-x) + 'px ' + (-y) + 'px');
				destU = (((x) / sImg.outerWidth()) * zoomImage.width) >> 0;
				destV = (((y) / sImg.outerHeight()) * zoomImage.height) >> 0;
				currU += (destU - currU) / opts.smoothMove;
				currV += (destV - currV) / opts.smoothMove;
				zoomDiv.css('background-position', (-(currU >> 0) + 'px ') + (-(currV >> 0) + 'px'))
			}
			controlTimer = setTimeout(function() {
				ctx.controlLoop()
			}, 30)
		};
		this.init2 = function(img, id) {
			filesLoaded++;
			if (id === 1) {
				zoomImage = img
			}
			if (filesLoaded === 2) {
				this.init()
			}
		};
		this.init = function() {
			$('.vpf-zoom-loading', jWin.parent()).remove();
			$mouseTrap = jWin.parent().append(format('<div class="mousetrap" style="background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDCQgqN0pFezEAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADUlEQVQI12NgYGBgAAAABQABXvMqOgAAAABJRU5ErkJggg==);z-index:97;position:absolute;width:%0px;height:%1px;left:%2px;top:%3px;"></div>', sImg.outerWidth(), sImg.outerHeight(), 0, 0)).find(':last');
			$mouseTrap.bind('touchmove mousemove', this, function(event) {
				mx = (typeof(event.originalEvent.touches) != 'undefined') ? event.originalEvent.touches[0].pageX : event.pageX;
				my = (typeof(event.originalEvent.touches) != 'undefined') ? event.originalEvent.touches[0].pageY : event.pageY;
			});
			$mouseTrap.bind('touchend mouseleave', this, function(event) {
				clearTimeout(controlTimer);
				if (lens) {
					lens.fadeOut(299)
				}
				if ($tint) {
					$tint.fadeOut(299)
				}
				if (softFocus) {
					softFocus.fadeOut(299)
				}
				zoomDiv.fadeOut(300, function() {
					ctx.fadedOut()
				});
				return false
			});
			$mouseTrap.bind('touchstart mouseenter', this, function(event) {
				//consider only one touch for zooming
				if (touchy) {
					event.preventDefault();
				}
				mx = (typeof(event.originalEvent.touches) != 'undefined') ? event.originalEvent.touches[0].pageX : event.pageX;
				my = (typeof(event.originalEvent.touches) != 'undefined') ? event.originalEvent.touches[0].pageY : event.pageY;
				zw = event.data;
				if (zoomDiv) {
					zoomDiv.stop(true, false);
					zoomDiv.remove()
				}
				var xPos = opts.adjustX,
					yPos = opts.adjustY;
				var siw = sImg.outerWidth();
				var sih = sImg.outerHeight();
				var w = opts.zoomWidth;
				var h = opts.zoomHeight;
				if (opts.zoomWidth == 'auto') {
					w = siw
				}
				if (opts.zoomHeight == 'auto') {
					h = sih
				}
				var appendTo = jWin.parent();
				switch (opts.position) {
					case 'top':
						yPos -= h;
						break;
					case 'right':
						xPos += siw;
						break;
					case 'bottom':
						yPos += sih;
						break;
					case 'left':
						xPos -= w;
						break;
					case 'inside':
						w = siw;
						h = sih;
						break;
					default:
						appendTo = $('#' + opts.position);
						if (!appendTo.length) {
							appendTo = jWin;
							xPos += siw;
							yPos += sih
						} else {
							w = appendTo.innerWidth();
							h = appendTo.innerHeight()
						}
				}
				zoomDiv = appendTo.append(format('<div id="vpf-zoom-big" class="vpf-zoom-big" style="display:none;position:absolute;left:%0px;top:%1px;width:%2px;height:%3px;background-image:url(\'%4\');z-index:96;"></div>', xPos, yPos, w, h, zoomImage.src)).find(':last');
				if (sImg.attr('title') && opts.showTitle) {
					zoomDiv.append(format('<div class="vpf-zoom-title">%0</div>', sImg.attr('title'))).find(':last').css('opacity', opts.titleOpacity)
				}
				if ($.browser.msie && $.browser.version < 7) {
					$ie6Fix = $('<iframe frameborder="0" src="#"></iframe>').css({
						position: "absolute",
						left: xPos,
						top: yPos,
						zIndex: 99,
						width: w,
						height: h
					}).insertBefore(zoomDiv)
				}
				zoomDiv.fadeIn(500);
				if (lens) {
					lens.remove();
					lens = null
				}
				cw = (sImg.outerWidth() / zoomImage.width) * zoomDiv.width();
				ch = (sImg.outerHeight() / zoomImage.height) * zoomDiv.height();
				lens = jWin.append(format('<div class="vpf-zoom-lens" style="display:none;z-index:95;position:absolute;width:%0px;height:%1px;"></div>', cw, ch)).find(':last');
				$mouseTrap.css('cursor', lens.css('cursor'));
				var noTrans = false;
				if (opts.tint) {
					lens.css('background', 'url("' + sImg.attr('src') + '")');
					$tint = jWin.append(format('<div style="display:none;position:absolute; left:0px; top:0px; width:%0px; height:%1px; background-color:%2;" />', sImg.outerWidth(), sImg.outerHeight(), opts.tint)).find(':last');
					$tint.css('opacity', opts.tintOpacity);
					noTrans = true;
					$tint.fadeIn(500)
				}
				if (opts.softFocus) {
					lens.css('background', 'url("' + sImg.attr('src') + '")');
					softFocus = jWin.append(format('<div style="position:absolute;display:none;top:2px; left:2px; width:%0px; height:%1px;" />', sImg.outerWidth() - 2, sImg.outerHeight() - 2, opts.tint)).find(':last');
					softFocus.css('background', 'url("' + sImg.attr('src') + '")');
					softFocus.css('opacity', 0.5);
					noTrans = true;
					softFocus.fadeIn(500)
				}
				if (!noTrans) {
					lens.css('opacity', opts.lensOpacity)
				}
				if (opts.position !== 'inside') {
					lens.fadeIn(500)
				}
				zw.controlLoop();
				return
			});
			if ($('#product-light-box-images').length) {
				$mouseTrap.bind('touchstart click', function(event) {
					if (touchy) {
						// Consider double tap for full zoom
						var now = new Date().getTime();
						var timesince = now - m_latesttap;
						if ((timesince < 600) && (timesince > 0)) {
							$('#product-light-box-images a.active').click();
						}
						m_latesttap = new Date().getTime();
					} else {
						$('#product-light-box-images a.active').click();
					}
				})
			}
		};
		img1 = new Image();
		$(img1).load(function() {
			ctx.init2(this, 0)
		});
		img1.src = sImg.attr('src');
		img2 = new Image();
		$(img2).load(function() {
			ctx.init2(this, 1)
		});
		img2.src = jWin.attr('href')
	}
	$.fn.CloudZoom = function(options) {
		try {
			document.execCommand("BackgroundImageCache", false, true)
		} catch (e) {}
		this.each(function() {
			var relOpts, opts;
			if ($(this).attr('rel')) {
				eval('var	a = {' + $(this).attr('rel') + '}');
				relOpts = a;
			} else {
				relOpts = {};
			}
			if ($(this).is('.vpf-zoom')) {
				$(this).css({
					'position': 'relative',
					'display': 'block'
				});
				$('img', $(this)).css({
					'display': 'block'
				});
				opts = $.extend({}, $.fn.CloudZoom.defaults, options);
				opts = $.extend({}, opts, relOpts);
				if (opts.position == 'inside') {
					opts.adjustX = 0;
					opts.adjustY = 0;
				}
				if (!$(this).parent().is('.vpf-zoom-wrap')) {
					$(this).wrap('<div class="vpf-zoom-wrap position-' + opts.position + '" style="top:0px;position:relative;"></div>')
				}
				$(this).data('zoom', new CloudZoom($(this), opts));
			} else if ($(this).is('.vpf-zoom-gallery')) {
				opts = $.extend({}, relOpts, options);
				$(this).data('relOpts', opts);
				$(this).bind('touchstart click', $(this), function(event) {
					$(this).parents('.product-thumb-carousel').find('.image-thumb').removeClass('active');
					$(this).parent('.image-thumb').addClass('active');
					if ($('#product-light-box-images').length) {
						$('#product-light-box-images').children('a[data-key="' + $(this).data('key') + '"]').addClass('active').siblings().removeClass('active');
					}
					var data = event.data.data('relOpts');
					$('#' + data.useZoom).data('zoom').destroy();
					$('#' + data.useZoom).attr('href', event.data.attr('href'));
					$('#' + data.useZoom + ' img').attr('src', event.data.data('relOpts').smallImage);
					$('#' + event.data.data('relOpts').useZoom).CloudZoom();
					return false
				})
			}
		});
		return this
	};
	$.fn.CloudZoom.defaults = {
		zoomWidth: 'auto',
		zoomHeight: 'auto',
		position: 'inside',
		tint: false,
		tintOpacity: 0.5,
		lensOpacity: 0.5,
		softFocus: false,
		smoothMove: 3,
		showTitle: true,
		titleOpacity: 0.5,
		adjustX: 0,
		adjustY: 0
	}
})(jQuery);