/**
 * "Крутилка" объектов в виде блоков
 *
 * @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
 * @subpackage
 * @category JavaScript
 * @version 0.1
 */
/**
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * ЕСЛИ В IE НЕ ЗАДАНА ШИРИНА ПРИ horizontal, ТО УСТАВАНЛИВАЕТСЯ В 100%
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */
(function($){
	$.fn.slider=function(o){
		//-----------------------------------------------------------
		// item - идентификатор элементов слайдера
		// type - тип слайдера. horizontal - горизонтальный, vertical - вертикальный. По умолчанию горизонтальный
		// speed - скорость прокрутки одного элемента слайдера
		//
		// TODO align - выравнивание слайдера, если он меньше блока в который заключен. Пока только center и то так себе...
		// TODO position - положение слайдера если он больше ширины страницы. center - по центу
		// TODO scroll - тип скроллинга: click - по нажатию (на один элемент), hover - по нанаведению (непрерывно), auto - автоскроллинг (непрервно или по одному элементу с задержкой)
		// TODO caruosel - бесконечная прокрутка false - останавливаться на концах, true - бесконечно
		// TODO hideButton - скрытие соответствующей кнопок прокрутки при достижении границы прокрутки
		var opt=$.extend({ item:'.item', speed:500, align:'center', position:'left', type:'horizontal' },o)
		// [0] - метод с большой буквы
		// [1] - метод с малой буквы
		// [2]	- float элементов слайдера
		// [3] - параметр сдвига при скроллинге
		var param=[['Height','height','none','top'],['Width','width','left','left']]
		// Объект надругательства
		var obj=$(this)
		if( obj.length==0 )return this
		// Параметры надругательства
		var dim={ checkAnimation:false, mainSize:0,maskSize:0, maxPos:0, step:0, itemsCount:0,itemsSize:0, maxItemSize:0,lastItem:null, blockObj:null, arrowSize:{l:0,r:0}, type:Number( opt.type!='vertical' ) }
		dim.par=param[dim.type]
		// Разметка стрелок
		var arrowString='<div class="slidea%1" style="float:'+dim.par[2]+';%2">&nbsp;</div>'
		// Загрузка картинок и png в IE
		$(this).waitImages(build).fixPng()
		//-----------------------------------------------------------
		// Проверка анимации
		function checkAnimation(){
			if( dim.checkAnimation ){
				var margin=dim.type==1?'Left':'Top',pMask=$('.slidemask',obj).offset()[dim.par[3]],pm=Math.ceil(pMask+dim.maskSize)
				$(opt.item,obj).each(function(){
					var p=$(this).offset()[dim.par[3]]-parseFloat( $(this).css('margin'+margin) )
					$(this).data('zoomdeny', pMask>p || pm<Math.floor(p+$(this).outerWidth(true)) )
				})
			}
		}
		//-----------------------------------------------------------
		// Проверка необходимости стрелок прокрутки
		function checkArrowVisibility(){
			var maskParam
			dim.mainSize=obj['inner'+dim.par[0]]();
			var maskParam=dim.mainSize<dim.itemsSize?{size:dim.mainSize-dim.arrowSize.l-dim.arrowSize.r,flt:dim.par[2],display:'block'}:{size:dim.mainSize,display:'none',flt:'none'}
			$('.slidewrap',obj).css(dim.par[1],dim.mainSize==maskParam.size?(dim.mainSize+5)+'px':dim.mainSize*1.2).find('.slidemask').css(dim.par[1],dim.maskSize=maskParam.size).css({'float':maskParam.flt})
			$('.slideblock',obj).css(dim.par[1],dim.mainSize>=maskParam.size?dim.itemsSize+5:dim.mainSize*1.2)
			$.each( dim.arrowSize, function(i){$('.slidea'+i,obj).css({display:maskParam.display})})
			dim.maxPos=dim.lastItem.position()[dim.par[3]]+dim.lastItem['outer'+dim.par[0]](true)-dim.maskSize
			// Проверяем позицию
			if( dim.mainSize>dim.itemsSize ){
				dim.blockObj.css(dim.par[3],null)
			}else if( dim.blockObj.position()[dim.par[3]]<-dim.maxPos ){
				dim.blockObj.css(dim.par[3],-dim.maxPos)
			}
			checkAnimation()
			return false
		}
		//-----------------------------------------------------------
		//
		function build(){
			var arrowPar=Number(!dim.type),blocks='<div class="slide%1" style="position:relative;overflow:hidden;'
			// Фиксим обработку не заданной ширины в IE
			if( $.browser.msie && dim.type==1 ){
				if( obj[0].currentStyle.width=='auto' ){
					obj[0].style.width='100%'
				}
			}
			//dim.mainSize=obj['inner'+dim.par[0]]()
			dim.mainSize=obj['inner'+param[arrowPar][0]]()
			dim.itemsCount=$(opt.item,obj).each(function(){
				var s
				$(this).css({'float':dim.par[2]})
				$(this).css({position:"absolute",visibility:"hidden",display:"block"});
				dim.itemsSize+=$(this)['outer'+dim.par[0]](true)
				s=$(this)['outer'+param[arrowPar][0]](true)
				$(this).css({position:"",visibility:"",display:""});
				if( dim.maxItemSize<s ){
					dim.maxItemSize=s
				}
			}).length
			if(dim.type==0){
				dim.maxItemSize=dim.mainSize+3
			}
			if(dim.itemsCount==0)return;
			dim.lastItem=$(opt.item+':last',obj)
			obj
				.css({overflow:'hidden'})
				.wrapInner(blocks.sprintf('block')+($.browser.msie && dim.type==1?'height:'+dim.maxItemSize+'px':'')+';margin:0 auto" />')
				.wrapInner(blocks.sprintf('mask')+dim.par[0]+':'+dim.mainSize+'px;float:'+dim.par[2]+'" />')
				.wrapInner(blocks.sprintf('wrap')+'" style="position:relative;overflow:hidden;'+dim.par[0]+':'+(dim.mainSize*1.2)+'px" />')
				.find('.slidemask').before(arrowString.sprintf('l', param[arrowPar][1]+':'+dim.maxItemSize+'px') ).after(arrowString.sprintf('r', param[arrowPar][1]+':'+dim.maxItemSize+'px'))
			dim.blockObj=$('.slideblock',obj)
			dim.blockObj.css(dim.par[1],dim.itemsSize*1.2)
			if(opt.position=='center' && dim.itemsSize>dim.mainSize ){
				pos=(dim.mainSize-dim.itemsSize)/2
				dim.blockObj.css(dim.par[3],pos)
			}
			$.each( dim.arrowSize, function(i){dim.arrowSize[i]=$('.slidea'+i,obj)['outer'+dim.par[0]](true)})
			// Шаг прокрутки
			checkArrowVisibility()
			dim.step=(dim.itemsSize==0 || dim.itemsCount==0)?0:opt.speed/(dim.itemsSize/dim.itemsCount)
			$('.slideal',obj).hover(
				function(){var anim=dim.type==1?{left:0}:{top:0};$(this).addClass('slidealh');dim.blockObj.stop().animate(anim,{duration:-(dim.blockObj.position()[dim.par[3]]*dim.step),easing:'linear'})}
				,function(){$(this).removeClass('slidealh');dim.blockObj.stop();checkAnimation()}
			)
			$('.slidear',obj).hover(
				function(){var anim=dim.type==1?{left:-dim.maxPos}:{top:-dim.maxPos};$(this).addClass('slidearh');dim.blockObj.stop().animate(anim,{duration:(dim.maxPos+dim.blockObj.position()[dim.par[3]])*dim.step,easing:'linear'})}
				,function(){$(this).removeClass('slidearh');dim.blockObj.stop();checkAnimation()}
			)
			$(window).resize(function(){checkArrowVisibility()});
			// Подключаем анимацию, если задана
			if( opt.animation ){
				switch( opt.animation[0] ){
					case 'zoom':
						if( $.fn.zoom ){
							$(opt.item,obj).zoom(opt.animation[1])
							dim.checkAnimation=true;
						}
						break;
				}
				checkAnimation()
			}
			$(obj).css('visibility','visible')
		}
		return this
	}
})(jQuery)

