/**
 * Coin Slider - Unique jQuery Image Slider
 * @version: 1.0 - (2010/04/04)
 * @requires jQuery v1.2.2 or later
 * @author Ivan Lazarevic
 * Examples and documentation at: http://workshop.rs/projects/coin-slider/

 * Licensed under MIT licence:
 *   http://www.opensource.org/licenses/mit-license.php
 **/

function checkForInt(value){
	tmpValue = Number(value);
	if(isNaN(tmpValue)){
		return value;
	} else {
		return tmpValue;
	}
}

(function($) {

	var params 		= new Array;
	var order		= new Array;
	var images		= new Array;
	var onclick     = new Array;
	var links		= new Array;
	var linksTarget = new Array;
	var titles		= new Array;
	var interval	= new Array;
	var imagePos	= new Array;
	var appInterval = new Array;
	var squarePos	= new Array;
	var reverse		= new Array;
	var isNewCarouselActive = GP.ReleaseControl.hasAccess('Revamp/UI/Frontpage/Games');

	$.fn.coinslider= $.fn.CoinSlider = function(options){
		if(navigator.userAgent.search('(Windows NT 5.1)|(Windows XP)') != -1){
			options = {
				width: isNewCarouselActive ? 420 : 645, // width of slider panel
				height: isNewCarouselActive ? 580 : 350, // height of slider panel
				spw: 1, // squares per width
				sph: 1, // squares per height
				delay: 5000, // delay between images in ms
				sDelay: 10, // delay beetwen squares in ms
				opacity: 1, // opacity of title and navigation
				titleSpeed: 500, // speed of title appereance in ms
				effect: '', // random, swirl, rain, straight
				navigation: true, // prev next and buttons
				links : true, // show images as links
				hoverPause: true // pause on hover
			};
		}
		init = function(el){
			for(var index in options){
				options[index] = checkForInt(options[index]);
			}

			order[el.id] 		= new Array();	// order of square appereance
			images[el.id]		= new Array();
			onclick[el.id]      = new Array();
			links[el.id]		= new Array();
			linksTarget[el.id]	= new Array();
			titles[el.id]		= new Array();
			imagePos[el.id]		= 0;
			squarePos[el.id]	= 0;
			reverse[el.id]		= 1;
			options = options
			params[el.id] = $.extend({}, $.fn.coinslider.defaults, options);

			// create images, links and titles arrays
			$.each($('#'+el.id+' img'), function(i,item){
				images[el.id][i] 		= $(item).attr('src');
				onclick[el.id][i]       = $(item).parent().attr('onclick') ? $(item).parent().attr('onclick') : '';
				links[el.id][i] 		= $(item).parent().is('a') ? $(item).parent().attr('href') : '';
				linksTarget[el.id][i] 	= $(item).parent().is('a') ? $(item).parent().attr('target') : '';
				titles[el.id][i] 		= $(item).next().is('span') ? $(item).next().html() : '';
				$(item).hide();
				$(item).next().hide();
			});

			var height = isNewCarouselActive ? 580 : 314;

			// set panel
			$(el).css({
				'background-image':'url('+images[el.id][0]+')',
				'width': params[el.id].width,
				'height': height + 'px',
				'max-height': height + 'px',
				'position': 'relative',
				'background-position': 'top left',
				'background-size': isNewCarouselActive ? 'contain' : 'auto',
			}).wrap("<div class='coin-slider' id='coin-slider-"+el.id+"' />");


			// create title bar
			$('#'+el.id).append("<div class='cs-title' id='cs-title-"+el.id+"' style='z-index: 200;'></div>");

			$.setFields(el);

			if(params[el.id].navigation)
				$.setNavigation(el);

			$.transition(el,0);
			$.transitionCall(el);

		}

		// squares positions
		$.setFields = function(el){

			tWidth = sWidth = parseInt(params[el.id].width/params[el.id].spw);
			tHeight = sHeight = parseInt(params[el.id].height/params[el.id].sph);

			counter = sLeft = sTop = 0;
			tgapx = gapx = params[el.id].width - params[el.id].spw*sWidth;
			tgapy = gapy = params[el.id].height - params[el.id].sph*sHeight;

			for(i=1;i <= params[el.id].sph;i++){
				gapx = tgapx;

				if(gapy > 0){
					gapy--;
					sHeight = tHeight+1;
				} else {
					sHeight = tHeight;
				}

				for(j=1; j <= params[el.id].spw; j++){

					if(gapx > 0){
						gapx--;
						sWidth = tWidth+1;
					} else {
						sWidth = tWidth;
					}

					order[el.id][counter] = i+''+j;
					counter++;

					if(params[el.id].links) {
						$('#'+el.id).append("<a" + (links[el.id][0] ? ' href="'+links[el.id][0]+'"' : '') + (onclick[el.id][0] ? ' onclick="'+onclick[el.id][0]+'"' : '') + " class='cs-"+el.id+"' id='cs-"+el.id+i+j+"' style='width:"+sWidth+"px; height:"+sHeight+"px; float: left; position: absolute;'></a>");
					}
					else {
						$('#' + el.id).append("<div class='cs-" + el.id + "'" + (onclick[el.id][0] ? " onclick=" + onclick[el.id][0] : "") + " id='cs-" + el.id + i + j + "' style='width:" + sWidth + "px; height:" + sHeight + "px; float: left; position: absolute;'></div>");
					}

					// positioning squares
					$("#cs-"+el.id+i+j).css({
						'background-position': -sLeft +'px '+(-sTop+'px'),
						'left' : sLeft ,
						'top': sTop
					});

					sLeft += sWidth;
				}

				sTop += sHeight;
				sLeft = 0;

			}


			$('.cs-'+el.id).mouseover(function(){
				$('#cs-navigation-'+el.id).show();
			});

			$('.cs-'+el.id).mouseout(function(){
				$('#cs-navigation-'+el.id).hide();
			});

			$('#cs-title-'+el.id).mouseover(function(){
				$('#cs-navigation-'+el.id).show();
			});

			$('#cs-title-'+el.id).mouseout(function(){
				$('#cs-navigation-'+el.id).hide();
			});

			if(params[el.id].hoverPause){
				$('.cs-'+el.id).mouseover(function(){
					params[el.id].pause = true;
				});

				$('.cs-'+el.id).mouseout(function(){
					params[el.id].pause = false;
				});

				$('#cs-title-'+el.id).mouseover(function(){
					params[el.id].pause = true;
				});

				$('#cs-title-'+el.id).mouseout(function(){
					params[el.id].pause = false;
				});
			}


		};


		$.transitionCall = function(el){
			clearInterval(interval[el.id]);
			delay = parseInt(params[el.id].delay) + params[el.id].spw*params[el.id].sph*params[el.id].sDelay;
			interval[el.id] = setInterval(function() { $.transition(el)  }, delay);
		}

		// transitions
		$.transition = function(el,direction){

			if(params[el.id].pause == true) return;

			$.effect(el);

			squarePos[el.id] = 0;
			appInterval[el.id] = setInterval(function() { $.appereance(el,order[el.id][squarePos[el.id]])  },params[el.id].sDelay);

			$(el).css({ 'background-image': 'url('+images[el.id][imagePos[el.id]]+')' });

			if(typeof(direction) == "undefined")
				imagePos[el.id]++;
			else
			if(direction == 'prev')
				imagePos[el.id]--;
			else
				imagePos[el.id] = direction;

			if  (imagePos[el.id] == images[el.id].length) {
				imagePos[el.id] = 0;
			}

			if (imagePos[el.id] == -1){
				imagePos[el.id] = images[el.id].length-1;
			}

			$('.cs-button-'+el.id).removeClass('cs-active');
			$('#cs-button-'+el.id+"-"+(imagePos[el.id]+1)).addClass('cs-active');

			if(titles[el.id][imagePos[el.id]]){
				$('#cs-title-'+el.id).css({ 'opacity' : 0 }).animate({ 'opacity' : params[el.id].opacity }, params[el.id].titleSpeed);
				$('#cs-title-'+el.id).html(titles[el.id][imagePos[el.id]]);
			} else {
				$('#cs-title-'+el.id).css('opacity',0);
			}

		};

		$.appereance = function(el,sid){
			$('.cs-'+el.id)
				.attr('href',links[el.id][imagePos[el.id]])
				.attr('target',linksTarget[el.id][imagePos[el.id]])
				.attr('onclick', onclick[el.id][imagePos[el.id]]);

			if (squarePos[el.id] == params[el.id].spw*params[el.id].sph) {
				clearInterval(appInterval[el.id]);
				return;
			}

			$('#cs-'+el.id+sid).css({ opacity: 0, 'background-image': 'url('+images[el.id][imagePos[el.id]]+')' });
			$('#cs-'+el.id+sid).animate({ opacity: 1 }, 300);
			squarePos[el.id]++;

		};

		// navigation
		$.setNavigation = function(el){
			// create prev and next 
			$(el).append("<div id='cs-navigation-"+el.id+"'></div>");
			$('#cs-navigation-'+el.id).hide();

			$('#cs-navigation-'+el.id).append("<a href='#' id='cs-prev-"+el.id+"' class='cs-prev'>prev</a>");
			$('#cs-navigation-'+el.id).append("<a href='#' id='cs-next-"+el.id+"' class='cs-next'>next</a>");
			$('#cs-prev-'+el.id).css({
				'position' 	: 'absolute',
				'top'		: params[el.id].height/2 - 15,
				'left'		: 0,
				'z-index' 	: 391,
				'line-height': '30px',
				'opacity'	: params[el.id].opacity
			}).click( function(e){
				e.preventDefault();
				$.transition(el,'prev');
				$.transitionCall(el);
			}).mouseover( function(){ $('#cs-navigation-'+el.id).show() });

			$('#cs-next-'+el.id).css({
				'position' 	: 'absolute',
				'top'		: params[el.id].height/2 - 15,
				'right'		: 0,
				'z-index' 	: 1001,
				'line-height': '30px',
				'opacity'	: params[el.id].opacity
			}).click( function(e){
				e.preventDefault();
				$.transition(el);
				$.transitionCall(el);
			}).mouseover( function(){ $('#cs-navigation-'+el.id).show() });

			// image buttons
			$("<div id='cs-buttons-"+el.id+"' class='cs-buttons'></div>").appendTo($('#newCarouselHolder'));


			for(k=1;k<images[el.id].length+1;k++){
				$('#cs-buttons-'+el.id).append("<a href='#' class='cs-button-"+el.id+"' id='cs-button-"+el.id+"-"+k+"'>"+k+"</a>");
			}

			$.each($('.cs-button-'+el.id), function(i,item){
				$(item).click( function(e){
					$('.cs-button-'+el.id).removeClass('cs-active');
					$(this).addClass('cs-active');
					e.preventDefault();
					$.transition(el,i);
					$.transitionCall(el);
				})
			});

			$('#cs-navigation-'+el.id+' a').mouseout(function(){
				$('#cs-navigation-'+el.id).hide();
				params[el.id].pause = false;
			});

		}




		// effects
		$.effect = function(el){

			effA = ['random','swirl','rain','straight'];
			if(params[el.id].effect == '')
				eff = effA[Math.floor(Math.random()*(effA.length))];
			else
				eff = params[el.id].effect;

			order[el.id] = new Array();

			if(eff == 'random'){
				counter = 0;
				for(i=1;i <= params[el.id].sph;i++){
					for(j=1; j <= params[el.id].spw; j++){
						order[el.id][counter] = i+''+j;
						counter++;
					}
				}
				$.random(order[el.id]);
			}

			if(eff == 'rain')	{
				$.rain(el);
			}

			if(eff == 'swirl')
				$.swirl(el);

			if(eff == 'straight')
				$.straight(el);

			reverse[el.id] *= -1;
			if(reverse[el.id] > 0){
				order[el.id].reverse();
			}

		}


		// shuffle array function
		$.random = function(arr) {

			var i = arr.length;
			if ( i == 0 ) return false;
			while ( --i ) {
				var j = Math.floor( Math.random() * ( i + 1 ) );
				var tempi = arr[i];
				var tempj = arr[j];
				arr[i] = tempj;
				arr[j] = tempi;
			}
		}

		//swirl effect by milos popovic
		$.swirl = function(el){

			var n = params[el.id].sph;
			var m = params[el.id].spw;

			var x = 1;
			var y = 1;
			var going = 0;
			var num = 0;
			var c = 0;

			var dowhile = true;

			while(dowhile) {

				num = (going==0 || going==2) ? m : n;

				for (i=1;i<=num;i++){

					order[el.id][c] = x+''+y;
					c++;

					if(i!=num){
						switch(going){
							case 0 : y++; break;
							case 1 : x++; break;
							case 2 : y--; break;
							case 3 : x--; break;

						}
					}
				}

				going = (going+1)%4;

				switch(going){
					case 0 : m--; y++; break;
					case 1 : n--; x++; break;
					case 2 : m--; y--; break;
					case 3 : n--; x--; break;
				}

				check = $.max(n,m) - $.min(n,m);
				if(m<=check && n<=check)
					dowhile = false;

			}
		}

		// rain effect
		$.rain = function(el){
			var n = params[el.id].sph;
			var m = params[el.id].spw;

			var c = 0;
			var to = to2 = from = 1;
			var dowhile = true;


			while(dowhile){

				for(i=from;i<=to;i++){
					order[el.id][c] = i+''+parseInt(to2-i+1);
					c++;
				}

				to2++;

				if(to < n && to2 < m && n<m){
					to++;
				}

				if(to < n && n>=m){
					to++;
				}

				if(to2 > m){
					from++;
				}

				if(from > to) dowhile= false;

			}

		}

		// straight effect
		$.straight = function(el){
			counter = 0;
			for(i=1;i <= params[el.id].sph;i++){
				for(j=1; j <= params[el.id].spw; j++){
					order[el.id][counter] = i+''+j;
					counter++;
				}

			}
		}

		$.min = function(n,m){
			if (n>m) return m;
			else return n;
		}

		$.max = function(n,m){
			if (n<m) return m;
			else return n;
		}

		this.each (
			function(){ init(this); }
		);


	};


	// default values
	$.fn.coinslider.defaults = {
		width: isNewCarouselActive ? 420 : 645, // width of slider panel
		height: isNewCarouselActive ? 580 : 350, // height of slider panel
		spw: 7, // squares per width
		sph: 5, // squares per height
		delay: 5000, // delay between images in ms
		sDelay: 10, // delay beetwen squares in ms
		opacity: 1, // opacity of title and navigation
		titleSpeed: 500, // speed of title appereance in ms
		effect: '', // random, swirl, rain, straight
		navigation: true, // prev next and buttons
		links : true, // show images as links 
		hoverPause: true // pause on hover		
	};

})(jQuery);
