if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {
var viewportmeta = document.querySelectorAll('meta[name="viewport"]')[0];
if (viewportmeta) {
viewportmeta.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0';
document.body.addEventListener('gesturestart', function() {
viewportmeta.content = 'width=device-width, minimum-scale=0.25, maximum-scale=1.6';
}, false);
}
}

// shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function(/* function */ callback, /* DOMElement */ element){
            window.setTimeout(callback, 1000 / 60);
          };
})();

resizeTimer = null;
var canvasWidth = 0;
var canvasHeight = 0;
//var ctx;
var rMultiplier = 0;
var widthWeighted = true;
var imgWidth = 1440;
var imgHeight = 900;
var imgRatio = 0;
var mOffsetX = 0;
var mOffsetY = 0;
//var canvasRatio = 0;

//cavnases stuff
var ctxs = new Array();
var images = new Array();
var cIndexCount = 0;
var prxs = new Array();

//slideshow stuff
var ssInterval;
var ssSpeed = 7000;
var curSlide = 0;
var prevSlide = 0;
var baseZIndex = 10;
// var ssAnimStartTime;
var ssAnimLastTime;
var ssAnimLastTime2; 

//transition stuff
var oa;
var stillMoving = 0;
var cinterval;
var triangles = 0;
var totalTriangles = 0;
var maxPerRow = 0;
var tArray;

//settings
var buildTriangleSpeed = 20;
var meas = 180; //square measurement
var threads = 2; // multi running threads
var opacitySpeed = 0.1;

var yes = true;
var ctx2;

//buildtriangle optimizations
var triCoords = new Array(); //0 - col, 1 - row, 2 - xstart, 3 - ystart

//ss controls
var ssNextNow = false;
var ssBuildingTriangles = false;
var ssPlaying = true;
var ssPrevNow = false;

//no canvas stuff
//Modernizr.canvas = false;
var nc_interval;
var nc_fadeSpeed = 600;

//setup loading
jQuery(".loader").css({
	"top":jQuery(window).height()/2-38,
	"display":"block"
});

jQuery(document).ready(function(){
	
	//with canvas
	if(Modernizr.canvas) {
	
		resizeBGImg("#slider li.first img", true);
		
		jQuery(window).resize(function(){
			if (resizeTimer) 
				clearTimeout(resizeTimer);
			resizeTimer = setTimeout("resizeStuff('#slider li.first img')", 100);
		});
		
		//
		resizeBgCover();
	
	}
	//no canvas
	else {
		resizeBGImg("#slider li img", true);
		
		jQuery(window).resize(function(){
			if (resizeTimer) 
				clearTimeout(resizeTimer);
			resizeTimer = setTimeout("resizeBGImg('#slider li.first img', true)", 100);
		});
		
	}
});

jQuery(window).load(function(){
	
	//with canvas
	if(Modernizr.canvas) {
	
		//create canvases
		jQuery("#slider li img").each(function(index){
			var ct = jQuery('<canvas class="ss-canvas canvas-'+cIndexCount+'">');
			var ctx = ct[0].getContext('2d');
			if(yes) {
				ctx2 = ctx;
				yes = false;
			}
			ctx.save();
			ctxs[cIndexCount] = ctx;
			images[cIndexCount] = jQuery(this);
			jQuery("#canvasContainer").append(ct);
			resizeCanvas(cIndexCount, false, true);
			
			//create pre-render
			var pr = jQuery('<canvas>');
			var prx = pr[0].getContext('2d');
			prxs[cIndexCount] = prx;
			jQuery("#preRendersContainer").append(pr);
			resizeCanvas(cIndexCount, true, false);
			//
			
			//show first slide
			if(cIndexCount == 0) {
				drawImage(ctx, images[0]);
				//resize background image back to original size
				jQuery("#slider li.first img").width(imgWidth).height(imgHeight).css({
					"margin-left":0,
					"margin-top":0
				});
			}
			
			cIndexCount++;
		});
		
		//set transition values
		calculateTransValues();
		//
		
		//remove loader
		jQuery(".loader").remove();
		
		//start slideshow
		//ssInterval = setInterval("nextSlide()", ssSpeed);	
		//ssAnimLastTime = Date.now();
		var d = new Date();
		ssAnimLastTime = d.getTime();
		requestAnimFrame(nextSlide);
		
		//setup ss buttons
		jQuery("#ssControls").css("display","inline");
		jQuery("#ssNext").click(function(){
			if(!ssBuildingTriangles)
				ssNextNow = true;
		});
		jQuery("#ssCur").click(function(){
			if(ssPlaying && !ssBuildingTriangles) {
				ssPlaying = false;
				jQuery(this).addClass("ssPlay").html("Play Slideshow").attr("title","Play Slideshow");
			}
			else {
				var d = new Date();
				ssAnimLastTime = d.getTime();
				ssPlaying = true;
				jQuery(this).removeClass("ssPlay").html("Pause Slideshow").attr("title","Pause Slideshow");
			}
		});
		jQuery("#ssPrev").click(function(){
			if(!ssBuildingTriangles)
				ssPrevNow = true;
		});
		//
		
	}
	//no canvas
	else {
		
		
		//prep slideshow
		jQuery("#slider li").each(function(){
			ctxs[cIndexCount] = jQuery(this);
			cIndexCount++;
		});
		
		//remove loader
		jQuery(".loader").remove();
		
		//setup ss buttons
		jQuery("#ssControls").css("display","inline");
		jQuery("#ssNext").click(function(){
			if(!ssBuildingTriangles) {
				clearInterval(nc_interval);
				nc_nextSlide(true);
				nc_interval = setInterval("nc_nextSlide(true)", ssSpeed);
			}
		});
		jQuery("#ssCur").click(function(){
			if(ssPlaying && !ssBuildingTriangles) {
				ssPlaying = false;
				clearInterval(nc_interval);
				jQuery(this).addClass("ssPlay").html("Play Slideshow").attr("title","Play Slideshow");
			}
			else {
				nc_interval = setInterval("nc_nextSlide(true)", ssSpeed);
				jQuery(this).removeClass("ssPlay").html("Pause Slideshow").attr("title","Pause Slideshow");
			}
		});
		jQuery("#ssPrev").click(function(){
			if(!ssBuildingTriangles) {
				clearInterval(nc_interval);
				nc_nextSlide(false);
				nc_interval = setInterval("nc_nextSlide(true)", ssSpeed);
			}
		});
		//
		
		//start slideshow
		nc_interval = setInterval("nc_nextSlide(true)", ssSpeed);
	}
	
	//fb like button
	(function(d){
	  var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
	  js = d.createElement('script'); js.id = id; js.async = true;
	  js.src = "//connect.facebook.net/en_US/all.js#appId=173574622699492&xfbml=1";
	  d.getElementsByTagName('head')[0].appendChild(js);
	}(document));
	//
});

function calculateTransValues() {
	
	//sweet? - 10, 200, 3, 0.5
	//1440 - 10, 200, 2, 0.1
	//settings
	
	if(canvasWidth <= 480) {
		meas = 60; threads = 2; opacitySpeed = 0.1;
	}
	/*else if(canvasWidth <= 1024 && canvasHeight <= 768) {
		meas = 100; threads = 2; opacitySpeed = 0.1;
	}*/
	else if(canvasWidth <= 1440 && canvasHeight <= 900) {
		meas = 150; threads = 2; opacitySpeed = 0.1;
	}
	else {
		meas = 300; threads = 2; opacitySpeed = 0.1;
	}
	
	maxPerRow = Math.ceil(canvasWidth/meas)*2;
	var howManyRows = Math.ceil(canvasHeight/meas);
	//totalTriangles = (howManyRows * maxPerRow) + 1;
	totalTriangles = (howManyRows * maxPerRow);

	//calculate triangle coordinates
	triCoords = new Array(totalTriangles);
	for(i=0; i<=totalTriangles; i++) {
		var curTriangle = i;
		//which row?
		var curRow = Math.ceil(curTriangle/maxPerRow);
		//which col?
		var curCol = curTriangle-(maxPerRow*(curRow-1));
		//set xstart
		var xstart = 0;
		var curPoint = curCol;
		if(curPoint%2 == 0) {
			curPoint -= 1;
		}
		if(curPoint-2>0) {
			xstart = Math.floor(curPoint/2)*meas;
		}
		//set ystart
		var ystart = (curRow - 1) * meas;
		
		triCoords[curTriangle] = new Array(4);
		
		triCoords[curTriangle][0] = curCol;
		triCoords[curTriangle][1] = curRow;
		triCoords[curTriangle][2] = xstart;
		triCoords[curTriangle][3] = ystart;
	}
}

function nextSlide(time) {
//function nextSlide() {
	
	var d = new Date();
	time = d.getTime();
	var diff = time-ssAnimLastTime;

	if((diff > ssSpeed && ssPlaying) || ssNextNow || ssPrevNow ) {
	
		ssNextNow = false;
		ssAnimLastTime = time;
		prevSlide = curSlide;
		
		jQuery(ctxs[curSlide].canvas).css("z-index",baseZIndex+1);
		
		if(!ssPrevNow) {
			if(curSlide+1 >= cIndexCount )
				curSlide = 0;
			else
				curSlide++;
		}
		else {
			//go previous
			if(curSlide == 0 )
				curSlide = cIndexCount-1;
			else
				curSlide--;
		}
		
		ssPrevNow = false;
		
		var ctx = ctxs[curSlide];
		ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
		jQuery(ctx.canvas).css("z-index",baseZIndex+2);
		
		//move prevSlide back to base index upon completion of transition - or not?
		//do transition - reset stuff
		oa = new Array(totalTriangles);
		stillMoving = 0;
		triangles = 0;
		
		tArray = new Array(totalTriangles);
		for(i=1;i<=totalTriangles;i++){
			tArray[i] = i;
			//reset opacity array
			oa[i] = 0;
		}
		tArray.sort(function() {return 0.5 - Math.random()}).sort(function() {return 0.5 - Math.random()}).sort(function() {return 0.5 - Math.random()});
		//tArray.sort(function() {return 0.5 - Math.random()});
		//tArray.sort(function() {return 0.5 - Math.random()});
		
		//cinterval = setInterval("buildTriangles()", buildTriangleSpeed);
		var d = new Date();
		ssAnimLastTime2 = d.getTime();
		requestAnimFrame(buildTriangles, ctx.canvas);
		//
		
	}
	else {
		requestAnimFrame(nextSlide);
	}
	
}

// var lastLoop = new Date;

function buildTriangles() {
	
	var d = new Date();
	time = d.getTime();
	var diff = time-ssAnimLastTime2;
	
	if((diff > buildTriangleSpeed)) {
	
		ssBuildingTriangles = true;
		
		var ctx = ctxs[curSlide];
		//var ctx = ctx2;
		ctx.save();
		
		var xstart = 0;
		var ystart = 0;
		
		if(triangles < totalTriangles || stillMoving > 0) {
			
			// var thisLoop = new Date;
		    // var fps = 1000 / (thisLoop - lastLoop);
		    // lastLoop = thisLoop;
			// console.log(fps);
		 	
		 	//clear the canvas - don't clear it
			//ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
			
			//threads
			//for(i=0;i<threads;i++)
			//{
			 	//put in oa20
		 	if(triangles < totalTriangles)
		 		triangles+=threads;
			//}
		 	//
	
			var sm = totalTriangles;
	
			for(i=0;i<triangles;i++) {
				
				//determine position of triangle
				var curTriangle = tArray[i];
				
				//opacity
		 		if(oa[curTriangle] <= 1.0) {
		 			oa[curTriangle] += opacitySpeed;
		 		}
		 		else {
		 			sm-=1;
		 		}
		 		stillMoving = sm;
				//
				
				try {
					var curCol = triCoords[curTriangle][0];
					var curRow = triCoords[curTriangle][1];
					var xstart = triCoords[curTriangle][2];
					var ystart = triCoords[curTriangle][3];
				} catch(err) { finishBuildTriangles(); }
				
				if(oa[curTriangle]) {
					//if(oa[curTriangle] > 1.0)
						//oa[curTriangle] = 1.0;
					ctx.globalAlpha = oa[curTriangle];
				}
	
				ctx.beginPath();  
				
				//draw now
				if(curCol%2==1) {
					//a
					ctx.moveTo(xstart,ystart);
					ctx.lineTo(xstart+meas,ystart);
					ctx.lineTo(xstart,ystart+meas);
					ctx.lineTo(xstart,ystart);
					//
				}
				else {
					//b
					ctx.moveTo(xstart+meas,ystart);
					ctx.lineTo(xstart+meas,ystart+meas);
					ctx.lineTo(xstart,ystart+meas);
					ctx.lineTo(xstart,ystart+meas-2); //safety
					ctx.lineTo(xstart+meas-2,ystart); //safety
					ctx.lineTo(xstart+meas,ystart);
					//
				}
				
				ctx.clip();
				drawImage(ctx,images[curSlide]);
				ctx.restore();
				ctx.save();
				
			}
			
			var d = new Date();
			ssAnimLastTime2 = d.getTime();
			
			requestAnimFrame(buildTriangles, ctx.canvas);
			
		}
		else {
			//clearInterval(cinterval);
			finishBuildTriangles();
		}
		
	}
	else {
		
		requestAnimFrame(buildTriangles);
		
	}
	
}

function finishBuildTriangles() {
	var d = new Date();
	ssAnimLastTime = d.getTime();
	jQuery(ctxs[prevSlide].canvas).css("z-index",baseZIndex);
	ssBuildingTriangles = false;
	requestAnimFrame(nextSlide);
}

function resizeStuff(target) {
	resizeBgCover();
	resizeBGImg(target,false);
	resizeAllCanvas();
}

function resizeBgCover() {
	//show cover
	jQuery(".bgCover").addClass("bgCoverOver").width(jQuery(window).width()).height(jQuery(window).height());
}

function resizeAllCanvas() {
	for(var i=0; i<cIndexCount;i++) {
		resizeCanvas(i,true,false);
		resizeCanvas(i,true,true);
	}
	//recalculate transition values
	calculateTransValues();
	//
}

function resizeCanvas(cindex, draw, isCanvas) {
	
	if(isCanvas)
		var ctx = ctxs[cindex];
	else //not canvas - so pre redner
		var ctx = prxs[cindex];
	canvasWidth = jQuery(window).width();
	canvasHeight = jQuery(window).height();
	ctx.canvas.width = canvasWidth;
	ctx.canvas.height = canvasHeight;
	//jQuery(".nivo-box").css("width",jQuery(document).width()).css("height",jQuery(document).height());

	//should be on transition only
	//get image size via images
	if(!isCanvas && draw)
		drawPreRender(ctx, images[cindex]);
	else if(draw)
		drawImage(ctx, images[cindex]);
	
}

function drawPreRender(ctx,img) {
	var sw = 0;
	var sh = 0;
	var sx = 0;
	var sy = 0;

	if(widthWeighted) {
		sw = imgWidth;
		//get height
		sh = canvasHeight / rMultiplier;
	}
	else {
		sh = imgHeight;
		//get width
		sw = canvasWidth / rMultiplier;
	}
	
	sx = mOffsetX / rMultiplier * -1;
	sy = mOffsetY / rMultiplier * -1;

	var dw = canvasWidth;
	var dh = canvasHeight;
	
	// if(sw>imgWidth)
		// sw = imgWidth;
	// if(sh>imgHeight)
		// sh = imgHeight;
	
	//console.log("sx:"+sx+" sy:"+sy+" sw:"+sw+" sh:"+sh+" dw:"+dw+" dh:"+dh);

	ctx.drawImage(img[0],
		sx,sy, sw,sh,
		0,0, dw,dh);
}

function drawImage(ctx, img) {
	
	//img no longer used - we draw a pre-rendered canvas
	ctx.drawImage(prxs[curSlide].canvas,0,0);

}

function resizeBGImg(target, doResize) {
	
	var winWidth = jQuery(window).width();
	var winHeight = jQuery(window).height();
	var tWidth = 0;
	var tHeight = 0;
	
	imgRatio = 1.6;
	//canvasRatio = canvasWidth/canvasHeight;
	
	//check height
	if(winHeight > winWidth/imgRatio ) {
		//resize
		if(doResize) {
			jQuery(target).height(winHeight);
			jQuery(target).width(winHeight*imgRatio);
		}
		
		tWidth = winHeight*imgRatio;
		tHeight = winHeight;
		widthWeighted = false;
	}
	else {
		if(doResize) {
			jQuery(target).width(winWidth);
			jQuery(target).height(winWidth/imgRatio);
		}
	
		tWidth = winWidth;
		tHeight = winWidth/imgRatio;
		widthWeighted = true;
	}
	
	//adjust margin
	//if(jQuery(target).width() > winWidth) {
	//set margin
	var mOffset = tWidth - winWidth;
	mOffsetX = mOffset/-2;
	var mOffset2 = tHeight - winHeight;
	mOffsetY = mOffset2/-2;
	
	if(doResize) {
		jQuery(target).css("margin-left",mOffset/-2);
		jQuery(target).css("margin-top",mOffset2/-2);
	}
	//}

	//set rMultiplier
	rMultiplier = tWidth/imgWidth;
	
} 

function nc_nextSlide(forward) {
	
	ssBuildingTriangles = true;
	
	prevSlide = curSlide;
	ctxs[curSlide].css("z-index",baseZIndex+1);
	
	if(forward) {
		if(curSlide+1 >= cIndexCount )
			curSlide = 0;
		else
			curSlide++;
	}
	else {
		//go previous
		if(curSlide == 0 )
			curSlide = cIndexCount-1;
		else
			curSlide--;
	}
	
	ctxs[curSlide].hide().css("z-index",baseZIndex+2).fadeIn(nc_fadeSpeed, function() {
		ctxs[prevSlide].css("z-index",baseZIndex);
		ssBuildingTriangles = false;
	});
}
