? GR0V Shell

GR0V shell

Linux www.koreapackagetour.com 2.6.32-042stab145.3 #1 SMP Thu Jun 11 14:05:04 MSK 2020 x86_64

Path : /home/admin/public_html/old/happy2/modules/mod_jaslideshow/assets/script/
File Upload :
Current File : /home/admin/public_html/old/happy2/modules/mod_jaslideshow/assets/script/script.js

/**
 * ------------------------------------------------------------------------
 * JA Slideshow Module for Joomla 2.5
 * ------------------------------------------------------------------------
 * Copyright (C) 2004-2011 J.O.O.M Solutions Co., Ltd. All Rights Reserved.
 * @license - GNU/GPL, http://www.gnu.org/licenses/gpl.html
 * Author: J.O.O.M Solutions Co., Ltd
 * Websites: http://www.joomlart.com - http://www.joomlancers.com
 * ------------------------------------------------------------------------
 */


var JASlider = new Class({

	Implements: Options,
	
	options: {
		effects: [
			
			'slice-down-right',			//animate height and opacity
			'slice-down-left',
			'slice-up-right',
			'slice-up-left',

			'slice-down-right-offset', 			//have an offset for top or bottom, no animate height
			'slice-down-left-offset',
			'slice-up-right-offset',
			'slice-up-left-offset',
			
			'slice-updown-right',				//slide up alternate column
			'slice-updown-left',
			
			'slice-down-center-offset',
			'slice-up-center-offset',
			
			'slice-down-right-inv',				//look like above, slide from an offset, but use the current image instead of the new image
			'slice-down-left-inv',
			'slice-down-center-inv',
			'slice-up-right-inv',
			'slice-up-left-inv',
			'slice-up-center-inv',
			
			'slice-down-random',			//slide and offset fade
			'slice-up-random',
			
			'slice-down-left-wider', 		//slice, wider === fold
			'slice-down-right-wider',
			'slice-down-center-wider',
			
			'slide-in-left',
			'slide-in-right',
			'slide-in-up',
			'slide-in-down',
			'slide-in-left-inv',
			'slide-in-right-inv',
			'slide-in-up-inv',
			'slide-in-down-inv',
			
			'fade',
			'fade-four', //create 4 clone and set to offset of 100px from default possiton, animate to defaalt position and fadein
			
			'box-sort-random', //box, offset from random other position, and animate fade to it position, fadein
			'box-random',
			'box-rain-normal',
			'box-rain-reverse',
			'box-rain-normal-grow',
			'box-rain-reverse-grow',
			'box-rain-normal-jelly',
			'box-rain-reverse-jelly',
			
			'circle-out',
			'circle-in'//,
			//'circle-rotate'
		],
		
		slices: 10,
		boxCols: 8,
		boxRows: 4,
		
		animation: 'move', 							//[move, fade, random], move and fade for old compactible
		fbanim: 'fade',
		direction: 'horizontal', 					//[horizontal, vertical] - slide direction of main item for move animation
		
		interval: 5000,
		duration: 500,
		transition: Fx.Transitions.Quad.easeOut,
		
		repeat: true,								//animation repeat or not
		autoPlay: false,							//auto play
		
		mainWidth: 800,								//width of main item
		mainHeight: 400,
		
		rtl: window.isRTL,							//rtl
		
		startItem: 0,								//start item will be show
		
		thumbItems: 4,								//number of thumb item will be show
		thumbType: false, 							//false - no thumb, other [number, thumb], thumb will animate
		thumbWidth: 160,
		thumbHeight: 160,
		thumbSpaces: [0, 0],
		thumbOpacity: 0.8,
		thumbTrigger: 'click',
		thumbOrientation: 'horizontal',	//thumb orientation
		
		maskStyle: 1,							//0 - fix to main image, 1 - full size
		maskWidth: 360,							//mask - a div over the the main item - used to hold descriptions
		maskHeigth: 50,					
		maskOpacity: 0.8,						//mask opacity
		maskAlign: 'bottom',					//mask align
		maskTransitionStyle: 'opacity',			//mask transition style
		maskTransition: Fx.Transitions.linear,	//mask transition easing
		
		showDesc: false,						//show description or not
		descTrigger: 'always',					//[always, mouseover, load]
		
		showControl: false,						//show navigation controller [next, prev, play, playback]
		
		showNavBtn: false,	// show next prev, on main image image
		navBtnOpacity: 0.4,
		navBtnTrigger: 'click',
		
		showProgress: true,
		
		urls: false, // [] array of url of main items
		targets: false // [] same as urls, an array of target value such as, '_blank', 'parent', '' - default
	},

	blank: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==',
	
	initialize: function (element, options) {
		var slider = $(element);
		
		if(!slider){
			return false;
		}
		
		this.setOptions(options);
		
		var options = this.options,
			mainWrap = slider.getElement('.ja-slide-main-wrap'),
			mainFrame = slider.getElement('.ja-slide-main'),
			mainItems = slider.getElements('.ja-slide-item');
			
		if(!mainItems.length){
			return false;
		}
		
		var imgItems = mainItems.getElement('img').clean();
		if(mainItems.length != imgItems.length && options.animation == 'slice'){
			options.animation = options.fbanim;
		}
		
		if (options.animation !== 'move'){
			options.maskStyle = 0;
		}

		options.rtl = (typeof options.rtl == 'string') ? (typeof options.rtl == 'rtl') : !!(options.rtl);

		mainWrap.setStyles({
			'width': options.maskStyle ? '100%' : options.mainWidth,
			'height': options.mainHeight
		});
		
		mainItems.setStyles({
			'width': options.mainWidth,
			'height': options.mainHeight
		});
		
		var mainItemSpace = 0,
		isHorz = (options.direction == 'horizontal');
		
		if (options.maskStyle) {	//full size
			mainItemSpace = 10;
			mainItems.setStyle(isHorz ? 'margin-right' : 'margin-bottom',  mainItemSpace);
		}
		
		var mainItem = mainItems[0],
			mainItemSize = isHorz ? (mainItem.getWidth() + mainItem.getStyle('margin-left').toInt() + mainItem.getStyle('margin-right').toInt()) : (mainItem.getHeight() + mainItem.getStyle('margin-top').toInt() + mainItem.getStyle('margin-bottom').toInt()),
			rearSize = Math.ceil(((isHorz ? mainWrap.getWidth() : mainWrap.getHeight()) - mainItemSize) / 2),
			
			vars = {
				slider: slider,
				mainWrap: mainWrap,
				mainFrame: mainFrame,
				mainItems: mainItems,
				
				size: mainItemSize,
				rearSize: rearSize,
				offset: (options.maskStyle ? (rearSize - mainItemSize + mainItemSpace / 2) : 0) - (options.rtl ? mainItemSpace : 0),
				mainItemSpace: mainItemSpace,
				
				total: mainItems.length,
				curIdx: Math.min(options.startItem, mainItems.length - 1),
				nextIdx: -1,
				curImg: '',
				
				running: 0,
				stop: 0,
				timer: 0,
				
				sliceTime: Math.round(Math.max(70, options.duration / options.slices)),
				boxTime: Math.round(Math.max(50, options.duration / Math.max(options.boxCols, options.boxRows))),
				
				modes: (isHorz ? (options.rtl == 'rtl' ? ['right', 'width'] : ['left', 'width']) : ['top', 'height']),
				fxop: {
					duration: options.duration,
					transition: options.transition,
					link: 'cancel'
				}
			};
		
		this.vars = vars;
		
		//Description
		this.initMasker();
		
		//Get initial images
		if(options.animation == 'slice'){
			mainItems.setStyle('display', 'none');
			vars.mainItems = imgItems;
			vars.curImg = vars.mainItems[vars.curIdx];
			vars.sliceImg = new Element('img', {
				'src': vars.curImg.src
			}).inject(new Element('div', {
				'class': 'ja-slide-sliceimg'
			}).inject(vars.mainFrame, 'top'));
			
			var ofsParent = mainFrame.getOffsetParent() || mainWrap,
				opCoord = ofsParent.getCoordinates();
			
			//Set first background
			mainFrame.setStyles({
				position: 'relative',
				left: (opCoord.width - options.mainWidth) / 2 - ofsParent.getStyle('padding-left').toInt() - ofsParent.getStyle('border-left-width').toInt(),
				top: (opCoord.height - options.mainHeight) / 2 - ofsParent.getStyle('padding-top').toInt() - ofsParent.getStyle('border-top-width').toInt(),
				overflow: 'hidden',
				display: 'block',
				width: options.mainWidth,
				height: options.mainHeight
			});
		} 

		if(options.animation == 'move'){
			vars.offset -= mainFrame.getStyle('margin-left').toInt();
			
			if(options.maskStyle){
				mainItems[0].clone().inject(mainFrame);
				mainItems[vars.total - 1].clone().inject(mainFrame, 'top');
			}
			
			mainFrame.setStyle(vars.modes[1], vars.size * (vars.total + 2));
			
			vars.fx = new Fx.Tween(mainFrame, Object.append(Object.clone(vars.fxop), {
				onComplete: this.animFinished.bind(this)
			})).set(vars.modes[0], -vars.curIdx * vars.size + vars.offset);
		} 
		
		if(options.animation == 'fade'){
			var fadeop = Object.append(Object.clone(vars.fxop), {
				property: 'opacity',
				onComplete: function(item){
					if(item.getStyle('opacity') == '1'){
						this.animFinished();
					}
				}.bind(this)
			});
			
			mainItems.each(function(item){
				item.setStyles({
					position: 'absolute',
					top: 0,
					opacity: 0,
					zIndex: 1,
					visibility: 'visible'
				}).store('fx', new Fx.Tween(item, fadeop));
			})[vars.curIdx].setStyles({
				opacity: 1,
				zIndex: 10
			});
		}
	
		this.initMainItemAction();
		this.initMainCtrlButton();
		this.initThumbAction();
		this.initControlAction();
		this.initHoverBehavior();
		this.initProgressBar();
		this.initLoader();
		
		vars.direct = 'next';
		slider.setStyle('visibility', 'visible');
		
		this.prepare(false, vars.curIdx);
		this.animFinished();
    },
	
	stop: function(){
		clearInterval(this.vars.timer);
		this.vars.stop = 1;
		
		if(this.options.showProgress){			//stop the progress bar
			this.vars.progressFx.stop().set(0);
		}
	},
	
	prev: function(force){
		var vars = this.vars;
		if(vars.running && !force){
			return false;
		}
		this.prepare(force, vars.curIdx -1);
	},
	
	next: function(force){
		var vars = this.vars;
		if(vars.running && !force){
			return false;
		}
		this.prepare(force, vars.curIdx +1);
	},
	
	playback: function(force){
		this.vars.direct = 'prev';
		this.vars.stop = 0;
		this.prev(force);
	},
	
	play: function(force){
		this.vars.direct = 'next';
		this.vars.stop = 0;
		this.next(force);
	},
	
	start: function(){
		var vars = this.vars;
		
		clearTimeout(vars.timer);
		vars.timer = setTimeout(this[this.vars.direct].bind(this), this.options.interval)
	},

	imgload: function(img, idx){
		if(img.complete && img.naturalWidth !== undefined){
			this.load(idx);
			return;
		}

		var blank = this.blank,
			src = img.src,
			callback = function(){
				this.load(idx);
			}.bind(this),
			onload = function(){
				if(this.src === blank){
					return;
				}

				setTimeout(callback);
			};

		img.addEvent('load', onload).addEvent('error', onload);

		if(img.readyState || img.complete){
			img.src = blank;
			img.src = src;
		}
	},
	
	load: function(idx){
		var vars = this.vars;

		vars.mainItems[idx].store('loaded', 1);
	
		if(vars.nextIdx == idx){
			if(vars.loaderFx){
				vars.loaderFx.start(0);
			}
			
			this.run(false, idx);
		} else if(vars.nextIdx == -1 && vars.loaderFx){
			vars.loaderFx.start(0);
		}
	},
	
	prepare: function(force, idx){
		var vars = this.vars,
			options = this.options;
			
		if(options.animation === 'slice' && vars.running){
			return false;
		}
		
		if(idx >= vars.total){ 
			idx = 0;
		}
		
		if(idx < 0){
			idx = vars.total - 1;
		}
		
		var	curImg = vars.mainItems[idx];
		if(curImg.get('tag') != 'img'){
			curImg = curImg.getElement('img');
		}
		
		if(!curImg){
			return this.run(force, idx);
		}
		
		vars.nextIdx = idx;
		
		if(curImg.retrieve('loaded')){
			if(idx == vars.curIdx){
				return false;
			}
		
			this.run(force, idx);
		}
		
		else{
			
			if(vars.loaderFx){
				vars.loader.setStyle('display', 'block');
				vars.loaderFx.start('opacity', 0.3);
			}
			
			this.imgload(curImg, idx);
		}
	},
	
	run: function(force, idx){
		var vars = this.vars,
			options = this.options;
			
		if(vars.curIdx == idx){
			return false;
		}
			
		if(this[options.animation]){
			this[options.animation](force, idx);
		}else{
			this.fade(force, idx);
		}
		
		if (vars.thumbMaskFx) {
			if (idx <= vars.thumbStartIdx || idx >= vars.thumbStartIdx + options.thumbItems - 1) {
				vars.thumbStartIdx = Math.max(0, Math.min(idx - options.thumbItems + 2, vars.total - options.thumbItems));
				
				vars.thumbBoxFx.start(-vars.thumbStartIdx * vars.thumbStep);
				if(vars.handleBoxFx){
					vars.handleBoxFx.start(-vars.thumbStartIdx * vars.thumbStep);
				}
			}
			
			vars.thumbMaskFx.start((idx - vars.thumbStartIdx) * vars.thumbStep - 2000);
			vars.thumbItems.removeClass('active')[idx].addClass('active');
			if(vars.handleItems.length){
				vars.handleItems.removeClass('active')[idx].addClass('active');
			}
		}
		
		if (options.descTrigger === 'load' && options.showDesc) {
			this.hideDescription();
		}
		
		if(options.showProgress){
			vars.progressFx.stop().set(0);
		}
	},
	
	move: function(force, idx){
		var vars = this.vars;
			
		vars.curIdx = idx;
		vars.fx.start(vars.modes[0], -idx * vars.size + vars.offset);
	},
	
	fade: function(force, idx){
		var options = this.options,
			vars = this.vars;
			
		if(idx != vars.curIdx){
			var itemOff = vars.mainItems[vars.curIdx],
				itemOn = vars.mainItems[idx];
				
			itemOff.setStyle('zIndex', 1).retrieve('fx').start(0);
			itemOn.setStyle('zIndex', 10).retrieve('fx').start(1);
		}
		
		vars.curIdx = idx;
	},
	
	slice: function(force, idx){
	
		var options = this.options,
			vars = this.vars,
			container = vars.mainFrame,
			oldImg = vars.curImg;
		
		//Set vars.curImg
		vars.curIdx = idx;
		vars.curImg = vars.mainItems[vars.curIdx];
		
		// Remove any slices & boxs from last transition
		container.getChildren('.ja-slice').destroy();
		container.getChildren('.ja-box').destroy();
		
		//Generate random effect
		var	effect = options.effects[Math.floor(Math.random() * (options.effects.length))];
		if(effect == undefined){
			effect = 'fade';
		}
		
		//Run effects
		var effects = effect.split('-'),
			callfun = 'anim' + effects[0].capitalize();

		if(this[callfun]){
		
			vars.running = true;
			this[callfun](effects, oldImg, vars.curImg);
		}
	},
	
	animFinished: function(){ 
		var options = this.options,
			vars = this.vars;
			
		vars.running = false;
		
		//Trigger the afterChange callback
		if (options.showDesc) {
			this.swapDescription();
			
			if (options.descTrigger === 'load') {
				this.showDescription();
			}
		}
		
		if (!vars.stop && (options.autoPlay && (vars.curIdx < vars.total -1 || options.repeat == 'true'))) {
			this.start();
			
			if(options.showProgress){
				vars.progressFx.start(vars.progressWidth);
			}
		}
	},
	
	createSlice: function(img){
		var options = this.options,
			vars = this.vars,
			container = vars.mainFrame;
			
		return new Element('div', {
			'class': 'ja-slice',
			'styles': {
				display: 'block',
				position: 'absolute',
				left: 0,
				width: options.mainWidth,
				height: options.mainHeight, 
				opacity: 0,
				zIndex: 10
			}
		}).adopt(new Element('img', {
			'src': img.src,
			'styles': {
				width: options.mainWidth,
				height: options.mainHeight 
			}
		})).inject(container);
	},

	createSlices: function(img, height, opacity){
		var options = this.options,
			vars = this.vars,
			container = vars.mainFrame,
			width = Math.round(options.mainWidth / options.slices),
			slices = [];
			
		for(var i = 0; i < options.slices; i++){
			var sliceWidth = i == options.slices - 1 ? (options.mainWidth - width * i) : width;
				
			slices.push(new Element('div', {
				'class': 'ja-slice',
				'styles': {
					position: 'absolute',
					left: i * width,
					width: sliceWidth,
					height: height, 
					opacity: opacity,
					zIndex: 10
				}
			}).adopt(new Element('img', {
				'src': img.src,
				'styles': {
					left: -(i * width),
					width: options.mainWidth,
					height: options.mainHeight 
				}
			})));
		}
		
		container.adopt(slices);
		
		return slices;
	},
	
	createBoxes: function(img, opacity){
		var options = this.options,
			vars = this.vars,
			container = vars.mainFrame,
			width = Math.round(options.mainWidth / options.boxCols),
			height = Math.round(options.mainHeight / options.boxRows),
			bwidth,
			bheight,
			boxes = [];
			
		for(var rows = 0; rows < options.boxRows; rows++){
			bheight = rows == options.boxRows - 1 ? options.mainHeight - height * rows : height;
			
			for(var cols = 0; cols < options.boxCols; cols++){
				bwidth = cols == options.boxCols - 1 ? options.mainWidth - width * cols : width;
				
				boxes.push(new Element('div', {
					'class': 'ja-box',
					'styles': {
						position: 'absolute',
						opacity: opacity,
						left: width * cols, 
						top: height * rows,
						width: bwidth,
						height: bheight,
						zIndex: 10
					}
				}).adopt(new Element('img', {
					'src': img.src,
					'styles': {
						left: -(width * cols),
						top: -(height * rows),
						width: options.mainWidth,
						height: options.mainHeight 
					}
				})));
			}
		}
		
		container.adopt(boxes);
		
		return boxes;
	},
	
	createCircles: function(img, opacity){
		var options = this.options,
			vars = this.vars,
			container = vars.mainFrame,
			size = 100,
			radius = Math.ceil(Math.sqrt(Math.pow((options.mainWidth), 2) + Math.pow((options.mainHeight), 2))),
			total = Math.ceil(radius / 100),
			left, top, elm,
			circles = [];
			
		for(var i = 0; i < total; i++){
			left = Math.round((options.mainWidth - size) / 2);
			top = Math.round((options.mainHeight - size) / 2);
		
			elm = new Element('div', {
				'class': 'ja-box',
				'styles': {
					position: 'absolute',
					opacity: opacity,
					left: left, 
					top: top,
					width: size,
					height: size,
					zIndex: 10
				}
			}).adopt(new Element('img', {
				'src': img.src,
				'styles': {
					left: -left,
					top: -top,
					width: options.mainWidth,
					height: options.mainHeight 
				}
			}));
			
			this.css3(elm, {
				'border-radius': radius + 'px'
			});
			
			circles.push(elm);
			
			size += 100;
		}
		
		container.adopt(circles);
		
		return circles;
	},
	
	animSlice: function(effects, oldImg, curImg){
		var options = this.options,
			vars = this.vars,			
			img = curImg,
			height = 0,
			opacity = 0;
			
		if(effects[3] == 'inv'){
			img = oldImg;
			height = options.mainHeight;
			opacity = 1;
		}
		
		//set the background
		vars.sliceImg.set('src', effects[3] == 'inv' ? vars.curImg.src : oldImg.src);
		
		var slices = this.createSlices(img, height, opacity),
			styleOn = { height: options.mainHeight - height, opacity: 1 - opacity / 2},
			last = slices.length -1,
			timeBuff = 100;
		
		// by default, animate is sequence from left to right
		if(effects[2] == 'left'){		// reverse the direction, so animation is sequence from right to left
			slices = slices.reverse();
		} else if(effects[2] == 'random'){	// so randomly
			this.shuffle(slices);
		}
		
		if(effects[3] == 'offset'){										//have offset style - we will not animate height, so set it to fullheight, we animate 'top' or 'bottom' property
			var property = effects[1] == 'up' ? 'top' : 'bottom';
			
			delete styleOn.height;
			styleOn[property] = 0;
			
			$$(slices).setStyle(property, '250px').setStyle('height', options.mainHeight);
		}
		
		else if(effects[1] == 'updown'){
			for(var k = 0, kl = slices.length; k < kl; k++){
				$(slices[k]).setStyle((k & 1) == 0 ? 'top' : 'bottom', '0px');
			}
		}
		
		else if(effects[1] == 'down'){
			$$(slices).setStyle('top', '0px');
		}

		else if(effects[1] == 'up'){
			$$(slices).setStyle('bottom', '0px');
		}
		
		if(effects[3] == 'wider'){
			slices.each(function(slice, i){
				var fxop = vars.fxop,
					orgWidth = slice.getWidth();
					
				slice.setStyles({
					'width': 0,
					'height': options.mainHeight
				});
				
				if(i == last){
					fxop = Object.clone(vars.fxop);
					fxop.onComplete = this.animFinished.bind(this);
				}
				
				setTimeout(function(){
					new Fx.Morph(slice, fxop).start({
						width: orgWidth,
						opacity: 1
					});
				}, timeBuff);
				
				timeBuff += vars.sliceTime;
			}, this);
		}
		else if(effects[2] == 'center'){
			var center = (last) / 2;
			slices.each(function(slice, i){
				var fxop = vars.fxop,
					delay = Math.abs(center - i) * 100;
				
				if(i == last){
					fxop = Object.clone(vars.fxop);
					fxop.onComplete = this.animFinished.bind(this);
				}
				
				setTimeout(function(){
					new Fx.Morph(slice, fxop).start(styleOn);
				}, delay);
				
			}, this);
		} else {
			slices.each(function(slice, i){
				var fxop = vars.fxop;
				if(i == last){
					fxop = Object.clone(vars.fxop);
					fxop.onComplete = this.animFinished.bind(this);
				}
				
				setTimeout(function(){
					new Fx.Morph(slice, fxop).start(styleOn);
				}, timeBuff);
				
				timeBuff += vars.sliceTime;
			}, this);
		}
	},
	
	animBox: function(effects, oldImg, curImg){
		var options = this.options,
			vars = this.vars,
			img = vars.curImg,
			height = 0,
			opacity = 0;
			
		if(effects[3] == 'jelly'){
			img = oldImg;
			opacity = 1;
		}
		
		vars.sliceImg.set('src', effects[3] == 'jelly' ? curImg.src : oldImg.src);
		
		var boxes = this.createBoxes(img, opacity),
			last = options.boxCols * options.boxRows -1,
			boxTime = vars.boxTime,
			i = 0,
			timeBuff = 100;
		
		if(effects[1] == 'sort'){
			var width = Math.round(options.mainWidth / options.boxCols),
				height = Math.round(options.mainHeight / options.boxRows),
				boxTime = boxTime / 3;

			this.shuffle(boxes).each(function(box){
				var fxop = vars.fxop,
					styleOn = box.getStyles('top', 'left');
				
				if(i == last){
					fxop = Object.clone(vars.fxop);
					fxop.onComplete = this.animFinished.bind(this);
				}
				
				box.setStyles({
					top: Math.round(Math.random() * options.boxRows / 2) * height,
					left: Math.round(Math.random() * options.boxCols / 2) * width
				});
				
				styleOn['opacity'] = 1;
			
				setTimeout(function(){
					new Fx.Morph(box, fxop).start(styleOn);
				}, timeBuff);
			
				timeBuff += boxTime;
				i++;
			}, this);
		}
		
		else if(effects[1] == 'random'){
			boxTime = boxTime / 3;
			
			this.shuffle(boxes).each(function(box){
				var fxop = vars.fxop;
				if(i == last){
					fxop = Object.clone(vars.fxop);
					fxop.onComplete = this.animFinished.bind(this);
				}
			
				setTimeout(function(){
					new Fx.Morph(box, fxop).start({ opacity: 1 });
				}, timeBuff);
			
				timeBuff += boxTime;
				i++;
			}, this);
		}
		else if(effects[1] == 'rain'){
			var rowIndex = 0,
				colIndex = 0,
				arr2d = [];
			
			// Split boxes into 2D array
			arr2d[rowIndex] = [];
			
			if(effects[2] == 'reverse'){
				boxes = boxes.reverse();
			}
			
			boxes.each(function(box){
				arr2d[rowIndex][colIndex] = box;
				colIndex++;
				if(colIndex == options.boxCols){
					rowIndex++;
					colIndex = 0;
					arr2d[rowIndex] = [];
				}
			});
			
			// Run animation
			var slider = this;
			for(var cols = 0; cols < (options.boxCols * 2); cols++){
				var prevCol = cols;
				for(var rows = 0; rows < options.boxRows; rows++){
					if(prevCol >= 0 && prevCol < options.boxCols){
						
						(function(row, col, time, i) {
							var box = $(arr2d[row][col]),
								w = box.getWidth(),
								h = box.getHeight(),
								fxop = vars.fxop;
							
							if(i == last){
								fxop = Object.clone(vars.fxop);
								fxop.onComplete = slider.animFinished.bind(slider);
							}
							
							if(effects[3] == 'grow'){
								box.setStyles({
									width: 0,
									height: 0
								});
							}
							
							else if(effects[3] == 'jelly'){
								w = 0;
								h = 0;
							}
							
							setTimeout(function(){
								new Fx.Morph(box, fxop).start({ opacity: 1 - opacity, width: w, height: h });
							}, time);
						
						})(rows, prevCol, timeBuff, i);
						i++;
					}
					prevCol--;
				}
				timeBuff += boxTime;
			}
		}
	},
	
	animSlide: function(effects, oldImg, curImg){
		
		var options = this.options,
			vars = this.vars,
			img = curImg;
		
		if(effects[3] == 'inv'){
			img = oldImg;
		}
		
		vars.sliceImg.set('src', effects[3] == 'inv' ? curImg.src : oldImg.src);
		
		var slice = this.createSlice(img),
			fxop = Object.clone(vars.fxop),
			mapOn = { left: 'left', right: 'right', up: 'top', down: 'bottom' },
			mapOff = { left: 'right', right: 'left', up: 'bottom', down: 'top' },
			value = ['left', 'right'].contains(effects[2]) ? options.mainWidth : options.mainHeight,
			styleOn = { opacity: 1},
			styleOff = { opacity: 0.5 };
			
		styleOff[mapOn[effects[2]]] = -value;
		styleOff[mapOff[effects[2]]] = '';
		
		styleOn[mapOn[effects[2]]] = 0;
		
		if(effects[3] == 'inv'){
			styleOn.opacity = 0.5;
			styleOn[mapOn[effects[2]]] = - value;
			
			styleOff.opacity = 1;
			styleOff[mapOn[effects[2]]] = 0;
			styleOff[mapOff[effects[2]]] = '';
		}
		
		slice.setStyles(styleOff);
			
		fxop.onComplete = this.animFinished.bind(this);
		
		new Fx.Morph(slice, fxop).start(styleOn);
	},
	
	animCircle: function(effects, oldImg, curImg){
		
		var options = this.options,
			vars = this.vars,
			img = curImg,
			opacity = 0;
		
		if(effects[1] == 'in'){
			img = oldImg;
			opacity = 1;
		}
		
		vars.sliceImg.set('src', effects[1] == 'in' ? curImg.src : oldImg.src);
		
		var circles = this.createCircles(img, opacity),
			timeBuff = 100,
			last = circles.length -1;
			
		if(effects[1] == 'in'){
			circles = circles.reverse();
		}
		
		circles.each(function(circle, i){
			var fxoptions = vars.fxop;
			if(i == last){
				fxoptions = Object.clone(vars.fxop);
				fxoptions.onComplete = this.animFinished.bind(this);
			}
			
			setTimeout(function(){
				new Fx.Morph(circle, fxoptions).start({opacity: 1 - opacity});
			}, timeBuff);
			
			timeBuff += vars.boxTime;
		}, this);
	},
	
	animFade: function(effects, oldImg, curImg){
		
		var vars = this.vars,
			slice = this.createSlice(curImg),
			fxop = Object.clone(vars.fxop),
			styleOn = {
				opacity: 1
			};
			
		vars.sliceImg.set('src', oldImg.src);
		
		fxop.onComplete = this.animFinished.bind(this);
		
		if(effects[1] == 'four'){
			var	tr = slice.clone(),
				bl = slice.clone(),
				br = slice.clone(),
				style = 'background-position';
				
			vars.mainFrame.adopt(this.shuffle([bl, br, tr]));	//the order here can affect the effect
			
			slice.setStyle(style, '-100px -100px');
			tr.setStyle(style, '100px -100px');
			bl.setStyle(style, '-100px 100px');
			br.setStyle(style, '100px 100px');
			
			styleOn[style] = '0px 0px';
			
			[tr, bl, br].each(function(fslice){
				new Fx.Morph(fslice, vars.fxop).start(styleOn);
			});
		}
		
		new Fx.Morph(slice, fxop).start(styleOn);
	},
	
	shuffle: function(arr){
		for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
		return arr;
	},
	
	css3: function(elms, props) {
		var css = {},
			prefixes = ['moz', 'ms', 'o', 'webkit'];
		
		for(var prop in props) {
			// Add the vendor specific versions
			for(var i=0; i<prefixes.length; i++){
				css['-'+prefixes[i]+'-'+prop] = props[prop];
			}
			
			// Add the actual version	
			css[prop] = props[prop];
		}
		
		elms.setStyles(css);
		
		return elms;
	},
	
	showDescription: function(){
		var vars = this.vars;
		
		vars.maskDescFx.start(vars.maskValueOn);
	},
	
	hideDescription: function(){
		var vars = this.vars;
		
		vars.maskDescFx.start(vars.maskValueOff);
	},
	
	swapDescription: function(){
		var vars = this.vars;
			
		vars.maskDesc.getElements('.ja-slide-desc').dispose();
		if (typeOf(vars.desciptions[vars.curIdx]) == 'element'){
			vars.desciptions[vars.curIdx].inject(vars.maskDesc);
		}
	},
	
	initMasker: function(){
		var options = this.options,
			vars = this.vars,
			slider = vars.slider,
			maskDesc = slider.getElement('.maskDesc');
			
		if(!maskDesc){
			return;
		}
		
		if (options.showDesc) {
			maskDesc.setStyles({
				'display': 'block',
				'position': 'absolute',
				'width': options.maskWidth,
				'height': options.maskHeigth,
				'opacity': options.maskOpacity
			});
		
			if (options.animation === 'move' && options.maskStyle) {
				//options.maskAlign = 'left';
				options.maskTransitionStyle = 'opacity';
			}
			
			maskDesc.setStyle(options.maskAlign, Math.max(0, vars.rearSize,options.edgemargin));
			
			var descs = vars.desciptions || slider.getElements('.ja-slide-desc'),
				property = options.maskTransitionStyle == 'opacity' ?  'opacity' : options.maskAlign,
				valueOn = property == 'opacity' ? options.maskOpacity : 1 + options.edgemargin,
				valueOff = property == 'opacity' ? 0.001 : (options.maskAlign == 'top' || options.maskAlign == 'bottom' ? -options.maskHeigth : -options.maskWidth),
				
				maskDescFx = new Fx.Tween(maskDesc, {
					property: property,
					duration: 400,
					transition: options.maskTransition,
					link: 'cancel'
				});

			if (options.descTrigger === 'mouseover') {
				$$([maskDesc, vars.mainFrame]).addEvents({
					'mouseenter': this.showDescription.bind(this),
					'mouseleave': this.hideDescription.bind(this)
				});
				
				maskDescFx.set(valueOff);
			} else {
				maskDesc.setStyle('opacity', options.maskOpacity);
			}
			
			Object.append(vars, {
				maskValueOn: valueOn,
				maskValueOff: valueOff,
				maskDescFx: maskDescFx,
				maskDesc: maskDesc,
				desciptions: descs
			});
			
		} else {
			maskDesc.setStyle('display', 'none');
		}
	},
	
	initThumbAction: function () {
		var options = this.options,
			vars = this.vars;
		
		var thumbWrap = vars.slider.getElement('.ja-slide-thumbs-wrap');
		if(!thumbWrap){
			return false;
		}
		
		if (options.thumbType) {
			var thumbMask = thumbWrap.getElement('.ja-slide-thumbs-mask'),
				thumbBox = thumbWrap.getElement('.ja-slide-thumbs'),
				thumbItems = vars.thumbItems || thumbBox.getElements('.ja-slide-thumb'),
				handleBox = thumbWrap.getElement('.ja-slide-thumbs-handles'),
				handleItems = vars.handleItems || handleBox.getChildren(),
				
				isHorz = (options.thumbOrientation == 'horizontal'),
				thumbAnimStyle = isHorz ? 'left' : 'top',
				thumbStep = isHorz ? options.thumbWidth + options.thumbSpaces[0] : options.thumbHeight + options.thumbSpaces[1],
				thumbStartIdx = typeof vars.thumbStartIdx != 'undefined' ? vars.thumbStartIdx : Math.max(0, Math.min(vars.curIdx - options.thumbItems + 2, vars.total - options.thumbItems)),
				fxoptions = Object.clone(vars.fxop);
				
			fxoptions.property = thumbAnimStyle;
			
			var	thumbMaskFx = new Fx.Tween(thumbMask, fxoptions),
				thumbBoxFx = new Fx.Tween(thumbBox, fxoptions).set(-thumbStartIdx * thumbStep),
				handleBoxFx = null;
		
			if(handleItems.length){
				handleBoxFx = new Fx.Tween(handleBox, fxoptions).set(-thumbStartIdx * thumbStep);
			}
			
			$$([thumbBox, handleBox]).setStyle('left', 0);
			[handleItems, thumbItems].each(function(items){
				if(items.length){
					items.setStyles({
						'width': options.thumbWidth,
						'height': options.thumbHeight,
						'margin-right': options.thumbSpaces[0],
						'margin-bottom': options.thumbSpaces[1]
					}).removeClass('active')[vars.curIdx].addClass('active');
				}
			});
			
			if(vars.slider.hasClass('ja-articles')){
				handleItems.setStyles({
					'opacity':'0.001',
					'background':'#FFF'
				});
			}
			
			thumbMask.setStyle(isHorz ? 'width' : 'height', 5000).setStyle(thumbAnimStyle, thumbStartIdx * thumbStep - 2000),
			thumbWrap.setStyles(isHorz ? { 
				'width': thumbStep * options.thumbItems - options.thumbSpaces[0],
				'height': options.thumbHeight
			} : { 
				'width': options.thumbWidth,
				'height': thumbStep * options.thumbItems - options.thumbSpaces[1]
			});
			
			$$([thumbWrap.getElement('.ja-slide-thumbs-mask-left'), thumbWrap.getElement('.ja-slide-thumbs-mask-right')]).setStyles({
				'width': isHorz ? 2000 : options.thumbWidth,
				'height': isHorz ? options.thumbHeight : 2000,
				'opacity': options.thumbOpacity
			});
			
			thumbWrap.getElement('.ja-slide-thumbs-mask-center').setStyles({
				'width': options.thumbWidth,
				'height': options.thumbHeight,
				'opacity': options.thumbOpacity
			});
			
			handleItems.each(function(item, idx){
				   item.addEvent(options.thumbTrigger, function(){
					 this.prepare(true, idx);
				   }.bind(this))
				}, this);
				
			handleBox.addEvent('mousewheel', function (e) {
				if (e.wheel < 0) {
					e.stop();
					this.next(true);
				} else {
					e.stop();
					this.prev(true);
				}
			}.bind(this));
			
			Object.append(vars, {
				thumbStartIdx: thumbStartIdx,
				thumbStep: thumbStep,
				thumbMaskFx: thumbMaskFx,
				thumbBoxFx: thumbBoxFx,
				handleBoxFx: handleBoxFx,				
				thumbItems: thumbItems,
				handleItems: handleItems
			});
			
		} else {
			thumbWrap.setStyle('display', 'none');
		}
	},

	initControlAction: function () {
		var options = this.options,
			slider = this.vars.slider,
			controls = ['prev', 'play', 'stop', 'playback', 'next'],
			btnarr;
			
		for (var j = 0, jl = controls.length; j < jl; j++) {
			if(this[controls[j]]){
				btnarr = slider.getElements('.ja-slide-' + controls[j]);
				
				for (var i = 0, il = btnarr.length; i < il; i++) {
					btnarr[i].addEvent(options.navBtnTrigger, this[controls[j]].bind(this, true))
							.addEvent(options.navBtnTrigger, function(){this.blur();});
				}
			}
		}
	},
	
	initMainCtrlButton: function(){
		var options = this.options,
			vars = this.vars,
			mainWrap = vars.mainWrap,
			mainCtrlBtns = $$([mainWrap.getElement('.ja-slide-prev'), mainWrap.getElement('.ja-slide-next')]);
			
		if(options.showNavBtn){
			
			mainCtrlBtns.setStyles({
				'opacity': options.navBtnOpacity,
				'width': options.direction == 'horizontal' ? Math.max(vars.rearSize - vars.mainItemSpace / 2, 0) : options.mainWidth,
				'height': options.direction == 'horizontal' ? options.mainHeight : Math.max(0, vars.rearSize - vars.mainItemSpace / 2)
			}).removeEvents('mouseenter').removeEvents('mouseleave').addEvents({
				'mouseenter': function () {
					this.setStyle('opacity', options.navBtnOpacity / 2);
				},
				'mouseleave': function () {
					this.setStyle('opacity', options.navBtnOpacity);
				}
			});
			
		} else {
			mainCtrlBtns.setStyle('display', 'none');
		}
	},
	
	initMainItemAction: function(){
		var options = this.options;

		if (options.urls) {
			var vars = this.vars,
				anchor = function(from, limit){
					if(!limit){
						limit = vars.slider;
					}

					while(from && from != limit){
						if(from.get('tag').toLowerCase() == 'a'){
							return from;
						}
						
						from = from.getParent();
					}

					return null;
				},

				handle = function(e){
					var index = vars.mainItems.indexOf(this);
						
					if(index == -1){
						index = vars.curIdx;
					}
					
					var url = options.urls[index],
						target = options.targets[index],
						link = anchor(e.target);

					if(link){
						return true;
					}

					if (url) {
						e.stop();
						
						if (target == '_blank'){
							window.open(url, 'JAWindow');
						} else {
							window.location.href = url;
						}
					}
					
					return false;
				};
			
			$$([vars.mainFrame, vars.maskDesc].append(Array.from(vars.mainItems))).addEvent('click', handle);
		}
	},
	
	initHoverBehavior: function(){	
		var vars = this.vars,
			slider = vars.slider,
			buttons = [],
			controls = ['prev', 'play', 'stop', 'playback', 'next'];
			
		for (var j = 0, jl = controls.length; j < jl; j++) {
			buttons.append(Array.from(slider.getElements('.ja-slide-' + controls[j])));
		}
		
		buttons.append(Array.from(vars.handleItems));
		
		$$(buttons).addEvents({
			'mouseenter': function () {
				this.addClass('hover');
			},
			'mouseleave': function () {
				this.removeClass('hover');
			}
		});
	},
	
	initProgressBar: function(){
		var options = this.options,
			vars = this.vars,
			progress = vars.slider.getElement('.ja-slide-progress');
			
		if(!progress){
			options.showProgress = false;
			
			return false;
		}
		
		if(options.showProgress){
			Object.append(vars, {
				progressWidth: options.mainWidth,
				progressFx: new Fx.Tween(progress, {
					property: 'width',
					duration: options.interval - options.duration,
					transition: Fx.Transition.Linear,
					link: 'cancel'
				})	
			});
		} else {
			progress.setStyle('display', 'none');
		}
	},
	
	initLoader: function(){
		var vars = this.vars,
			loader = vars.slider.getElement('.ja-slide-loader');
			
		if(!loader){
			return false;
		}
		
		Object.append(vars, {
			loader: loader,
			loaderFx: new Fx.Tween(loader, {
				property: 'opacity',
				duration: 250,
				link: 'cancel'
			})
		});
	}
});

T1KUS90T
  root-grov@210.1.60.28:~$