/**
 * Увеличение объектов
 *
 * @author Pavel Alexandrov <pavel@vmt.ru>
 * @copyright Copyright (c) 2010, Pavel Alexandrov
 * @license http://opensource.org/licenses/gpl-2.0.php The GNU Public License (GPL) Version 2, June 1991
 * @package JavaScript
 * @subpackage jQuery
 * @category plugin
 * @version 0.1
 */
//--------------------------------------------------
// Zooming
(function($){
//--------------------------------------------------
$.fn.zoom=function(o){
	var startTimer
	var opt={
		// Максимальная высота. Если задана высота, но не задана ширина, то ширина будет вычислена на основе пропорции
		height:0,
		// Максимальная ширина. Если задана ширина, но не задана высота, то высота будет вычислена на основе пропорции
		width:0,
		// Коэффициент увеличения по ширине. Имеет преимущество перед width
		zoomW:0,
		// Коэффициент увеличения по высоте. Имеет преимущество перед height
		zoomH:0,
		// Скорость анимации
		speed:300,
		// Задержка перед началом увеличения при наведении мыши
		delay:70,
		// Направление увеличения. center/top/bottom или { h:'', w:'' }
		dir:'center'
	}
	$.extend(opt,o)
	var selector=this
	var dir={h:.5,w:.5}
	if( typeof opt.dir!='string' && ( 'h' in opt.dir || 'w' in opt.dir ) ){
		$.extend(dir,opt.dir)
	}else{
		d=typeof opt.dir=='string'?opt.dir.split('-'):opt.dir
		$.each( d, function(i){
			switch( d[i] ){
				case 'top':
					dir.h=1
					break;
				case 'bottom':
					dir.h=0
					break;
				case 'left':
					dir.w=1
					break;
				case 'right':
					dir.w=0
					break;
			}
		})
	}
	//this.waitImages(build).fixPng()
	this.fixPng()
	build()
	//----------------------------------------------
	function build(){
		$(selector).each(function(){
			// Объект надругательства
			var obj=$(this)
			var link=null
			par=obj.parent()
			if( par[0].tagName=='A' ){
				link=par.attr('href');
			}
			obj.data('zoomdeny',false)
			var clone
			// Пытаемся получить значения zoom по классу
			zooming=/zoom-([\d-]+)/i.exec(obj.attr('class'))
			if( zooming ){
				zooming=zooming[1].split('-')
				zooming[1]=zooming[1]?zooming[1]:zooming[0]
			}
			// Смотрим, задано ли увеличение
			if( opt.height!=0 || opt.width!=0 || opt.zoomW!=0 || opt.zoomH!=0 || zooming ){
				// исходная позиция {left:'',top:''}
				var pos
				// высота и ширина элемента {h:'',w:'',mh:'',mw:''} mh макс. высота, mw макс. ширина
				var dim
				var started=false
				if( !zooming ){
					zooming=[]
					zooming[0]=opt.zoomH
					zooming[1]=opt.zoomW
				}
				dim={h:obj.height(),w:obj.width(),hk:zooming[0]/100,wk:zooming[1]/100,dh:dir.h,dw:dir.w}
				if( dim.h!=0 && dim.w!=0 ){
					if( dim.wk==0 && dim.hk==0 ){
						if( opt.height!=0 )dim.hk=opt.height/dim.h
						if( opt.width!=0 )dim.wk=opt.width/dim.w
					}
					if(dim.wk==0)dim.wk=dim.hk
					if(dim.hk==0)dim.hk=dim.wk
					dim.hk--
					dim.wk--
					obj
						.fixPng()
						.unbind('hover')
						.hover(
							function(e){
								if( !obj.data('zoomdeny') && !clone ){
									pos=obj.offset()
									clone=obj
										.clone(true)
										.addClass(obj.className)
										.css($.extend(dimension(obj),{position:'absolute',display:'block',cursor:obj.css('cursor'),marginTop:0,marginLeft:0},pos))
										.fixPng()
										.appendTo('body')
										.hover(
											function(){clone.css({zIndex:9}).stop(true).delay(opt.delay).animate({sizing:1},{duration:opt.speed,queue:true,step:function(x){zoomStep(x,dim)}})}
											,function(){clone.css({zIndex:8}).stop(true).animate({sizing:0},{duration:opt.speed,queue:true,step:function(x){zoomStep(x,dim)},complete:function(){zoomFinish()}})}
										)
									obj.css({visibility:'hidden'})
									e.stopPropagation()
									started=setTimeout(checkStarted,opt.delay+150)
								}
							},
							function(){}
						)
				}
			}
			//--------------------------------------------------
			function checkStarted(){
				clearTimeout(started);
				zoomFinish()
			}
			//--------------------------------------------------
			function zoomFinish(){
				started=null;clone.remove();clone=null;obj.css({visibility:'visible'})
			}
			//--------------------------------------------------
			function zoomStep(x,dim){
				if(started){
					clearTimeout(started)
					started=null
				}
				// Сброс зуммирования если всплыло событие запрета
				if( obj.data('zoomdeny') ){clone.stop(true);zoomFinish();return}
				var width=Math.round(dim.w+dim.w*x*dim.wk)
				var height=Math.round(dim.h+dim.h*x*dim.hk)
				pos=obj.offset()
				clone.css({width:width,height:height,top:pos.top-(height-dim.h)*dim.dh,left:pos.left-(width-dim.w)*dim.dw});
			}
		})
	}
	//--------------------------------------------------
	function dimension( obj ){
		var attr=['margin','padding'],sub=['Top','Right','Bottom','Left'],bor=['Width','Style','Color'],s={width:obj.width(),height:obj.height()}
		$.each(attr,function(a){
			$.each(sub,function(b){
				s[c=attr[a]+sub[b]]=obj.css(c)
			})
		})
		$.each(bor,function(a){
			$.each(sub,function(b){
				s[c='border'+sub[b]+bor[a]]=obj.css(c)
			})
		})
		return s
	}
}
//--------------------------------------------------
})(jQuery)

