// JavaScript Document

/*  ================================ */
/*  DESIGN & CODE  | COPYRIGHT 2012  */
/*  BRIAN M. TULLY |  NEW YORK, NY   */
/*  ================================ */

jQuery.fx.interval = 13;	 // IE Only

/* RUNS ASAP */
jQuery(function() {
	// Preloader Setup
	trace('Preloading Files...');
	var myLoader = new html5Preloader();
	// Image Root
	var rootPath = 'images/';
	// Images to Load
	var requiredFiles = new Array(
		'background-sand-black-dark.jpg',
		'header-tully.png',
		'shim-shadow.png',
		'sprites-logos-networks-metal.png',
		'css-design-award-nominee-dark-vertical.png',
		'city-panels.jpg',
		'sprites-arrows-main.png',
		'sprites-buttons-menu-3.png',
		'panel-welcome-background.jpg',
		'panel-welcome-words.png',
		'panel-design-background.jpg',
		'panel-design-tech-bubbles.png',
		'panel-design-tech-sprites.png',
		'panel-contact-icons-large.png',
		'raster_contact_info.png',
		'swipe.png'
	);
	// Downloader **MSIE**
	if (jQuery.browser['msie'] == true) {
		trace('  Using Internet Explorer Preloader...');
		// Variable to hold images
		var preloaded_image_object = new Image();
		// Begin Download
		$(requiredFiles).each(
			function( i ) {
				preloaded_image_object.src = requiredFiles[i];
				trace('    Fetched OK', requiredFiles[i]);
			// Once Complete:
			if ( i == requiredFiles.length - 1) {
				trace('Preload Complete!');
				trace('end');
				initialize();	 
				return; }  });  
	// Downloader **ALL OTHER BROWSERS**
	} else {
		trace('  Using Standard HTML5 Preloader...');
		// Begin Download
		$(requiredFiles).each(
			function( i ) { myLoader.addFiles(rootPath + requiredFiles[i]); 
			trace('    Fetched OK', requiredFiles[i]);	});
			myLoader.onerror = function(e) {
			trace('Error Loading File', this.LoadingFile); return true; }
		// Once Complete:
		myLoader.onfinish = function(){
			trace('Preload Complete!');
			trace('end');
			initialize();  
			return;	}} });


/* INITIALIZE PAGE */
function initialize() {	
trace('Initializing page...');
	
	// Starting Page
	var launchOn = new Number(0);

	// Active Page
	window.pageID = new Number(0);
	
	// Browser Specific

		// IE
		if (jQuery.browser['msie'] == true) {
			window.msie = true;
			window.touchSupport = false;
			trace('  Using Internet Explorer Tweaks.');
			var ie9 = parseInt($.browser.version, 10);
				// IE 9 is OK!
				if (ie9 >= 9) {window.msie = false;	}
		
		// iPhone + iPad
		} else if (navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPhone/i) ) {
			window.msie = false; 
			window.iOS = true;
			window.touchSupport = true;
			window.scrollTo(0,1); // Hides Address Bar
			document.addEventListener('touchmove', function(e) { e.preventDefault();}, true);
			trace(' Added Touch Support.');
		
		// Other Browsers
		} else {
			window.msie = false; 
			window.touchSupport = false; 
			trace('  Using Default Settings.');}	

	// Animation Defaults
	window.defaultSpeed = new Number(1300);
	window.easing = "easeOutCubic";
	jQuery.fx.interval = 13;	 // IE Only
	
	// Cache Animated Objects
	prepPage();
	
	// Activate Clicks + Swipes
	bindButtons();
	
	// Prep Video Player
	videoSetup('initialize');
	
//== Reveal Page ==//

if (msie) {  // IE //
	$('#loading #progress_icon').delay(1000).fadeOut(1000, function() {
	$('div#loading p').fadeOut(250, function() {
	$('div#loading').fadeOut(500, function() {
		// After Reveal:
		align('initialize', launchOn);
		window.finished = 1;
		trace('Page is ready!');
		trace('end');
		}); }); });
		
} else { // Others //
	$('#progress_icon').delay(1000).addClass('complete');
	$('#loading p').delay(1000).addClass('complete');
	$('#loading').delay(1000).addClass('complete').delay(1000).queue(function(){
		// After Reveal:
		align('initialize', launchOn);
		window.finished = 1;
		trace('Page is ready!');
		trace('end');
		$('#loading').dequeue().hide(); });
	}
}


/******************/
/*** LISTENERS ***/
/******************/
function bindButtons() {

trace('  Adding Buttons...');
	
//== Menu Clicks ==//
var menuLinks = $('li.menu_link');
var menuList = $.makeArray(menuLinks);
	// Add Listeners
	menuLinks.each(
		function( i ) {
		$('#' + menuList[i].id + ' a').bind("click", function(){
			var executing = slider.hasClass('executing'); 
			// Action
			if (!executing) {align('move', i);
			// Failed
			} else { 	trace('blocked'); return; } });
		// Complete
		var l = "    Button " + (i+1) + ", \"" + menuList[i].id + "\" OK.";  
		trace(l); });
		
//== Arrow Clicks ==//
$('#previous_page a').bind("click", function() { align('move','left'); });
$('#next_page a').bind("click", function() { align('move','right'); });

//== Resume Boxes ==//
var jobLinks = $('li.city.box');
var jobList = $.makeArray(jobLinks);
	// Add Listeners
	jobLinks.each(
		function ( i ) {
		$('#' + jobList[i].id + '>a').bind("click", function() {
			var executing = jobHolder.hasClass('executing');
			// Action
			if (!executing) {revealJob(i); }   /// change back to "moveJobBoxes" to reverse!
			// Failed
			else {	trace('blocked'); return;} });});
			
//== Resume Reset ==//
$('.reset_resume').bind("click", function() {
		var executing =  jobHolder.hasClass('executing');
		if (!executing) { revealJob('reset'); } 
		else { trace('blocked'); return; }});

//== Page Resize ==//
	$(window).bind('resize',function(){
		var executing = $('#slider_1').hasClass('executing');
		// Action
		if (!executing) { align('resize');}
		// Failed
		else { trace('blocked');} });
		
// == Email Link ==//
$('.email_link').bind("click", function() {
	// Disguises "mailto" from crawlers
	var name = 'bm.tully';
	var domain = 'gmail.com';
	window.location.href = 'mailto:' + name + '@' + domain; });
	
//== Web Work Box ==//
$('#recent_www_work').bind("click", function() { 
	var executing = www_holder.hasClass('executing');
	// Open Box
	if (!executing) { recentWebWork('open'); }
	else { trace('blocked'); }	});
$('#back_to_recent_www_work').bind("click", function() {
	var executing = www_holder.hasClass('executing');
	// Close Box
	if (!executing) { recentWebWork('close'); }
	else { trace('blocked'); }	});
	
//== Touch / Swipe  ==//
if (touchSupport == true) { 
	$("body").touchwipe({
     wipeLeft: function() { align('move','right'); },
     wipeRight: function() { align('move','left'); },
     wipeUp: function() { /* do nothing */},
     wipeDown: function() { /* do nothing */},
     min_move_x: 30,
     min_move_y: 30,
     preventDefaultEvents: true });
	$('#touch_notify').fadeIn(1000); }

}/*** End of Listeners ***/


/*******************/
/** ALIGN PANELS **/
/*******************/
function align(type,destination) {

// Set Current Sizes
var windowWidth = $(window).width();
var fontSize = parseInt($('html').css('font-size'));

// Set Animation Rate
var speedAdjust = 1;


/// CLEANUP LEFT OFF HERE
/// CLEANUP LEFT OFF HERE
/// CLEANUP LEFT OFF HERE
/// CLEANUP LEFT OFF HERE
/// CLEANUP LEFT OFF HERE
			
	//== Page Resize ==//	
	if (type == 'resize') {
			
		// Re-Build Track
			// Lock Right Arrow
			rightArrow.css('left', windowWidth-(fontSize*4));
			// Resize All Panels
			allPanels.width(windowWidth);
			var newX = new Number();
			newX = windowWidth * -1 * pageID;
			// Adjust Slider
			$(slider).css({'left' : newX });
			
		// Show/Hide Arrows, Depending on Page
		adjustArrows('horizontal', pageID);  	
		adjustArrows('vertical', pageID);
		// Log Complete
		trace('Page Size Changed, Elements Re-aligned.');
		return;
		
	// On Page Change:
	} else if (type == 'move' || type == 'initialize' ) {
		
		// Parse Number from Arrow Click
		if (destination == 'right') { destination = pageID+1;} 
		else if (destination == 'left') { destination = pageID-1; } 
		
		// Block Invalid Moves
		if (destination < 0 || destination > maxPages ) {
			trace('Can\'t Complete Move'); 
			return; }
		if (type == 'move' && destination == pageID) {
			trace('Can\'t Complete Move'); 
			return; 
		}
		
			// Get Current Location
			var x = slider.css('left');
			if (x == 'auto') { x = 0; }
			x = parseInt(x);
			// Get New Location
			var newX = new Number(windowWidth * -1 * destination); 
			// Get Distance
			var distance = new Number(x - newX);
			// Get Direction
			if (distance < 0) {distance = distance*-1;} 
			else { distance = distance; }
			distance = parseInt(distance);
			// Set Speed
			var speed = defaultSpeed;
			speed = speed + distance/3;
			trace('Animation Variables Set.');
			// Initialize Events
			if (type == 'initialize') {
				rightArrow.css('left', windowWidth-(fontSize*4));
				slider.animate({'opacity' : 1}, { queue: false, duration: 500 });
				speedAdjust = 0.2;
			}
			// Hide Arrows For Move
			adjustArrows('hideVertical');
			adjustArrows('hideHorizontal');
				
			// LOCK SLIDER
			slider.addClass('executing');
			allPanels.width(windowWidth);
			slider.animate({'left' : x}, 0, easing, function() {trace('Position locked');})
			
			// Is The Panel Ready to Move?
			.queue(function() {
				trace('Checking Panel Status');
				// Find Current Panel
				var current = $('#' + allPanels[pageID].id).hasClass('current');
				if(current) {
					trace('  Departure Animations', 'FIRED');
					// DEPARTURE ANIMATIONS
					if (type == 'move') {
						trace('MOVE Requested');
						prepPage(pageID, 'close', this);
					} else {
						trace('Going to Startup Page.');	
						$(this).dequeue();
					}
					// Next Step...
				} else {
					// Log Errors
					trace('ERROR', 'No page tagged as CURRENT. Refresh Page, or check the align function if the problem persists.');
					trace('end');
					// Unlock Slider
					slider.removeClass('executing');
					return;
				}
			})
			
			// MOVE MENU SLIDER
			.queue(function() {
				if (type == 'move') {  // withholds slider during initialize state
					slideSelector(destination,speed);
				}
					// Keeps Queue Moving -- don't wait for slider to finish.
					$(this).dequeue();
			})
			
			// MOVE PANELS
			.animate({'left' :  newX}, speed*speedAdjust, easing, function() {trace('animation complete, used speed', speed);})
				
			// ARRIVAL ANIMATIONS
			.queue(function() {
					prepPage(destination,'open',this);
			})
			
			// ARROW ANIMATIONS
			.queue(function() {
				adjustArrows('horizontal',destination,maxPages,this); 
			})
			
			// RELEASE SLIDER
			.queue(function() {
				if (type == 'initialize') {
					slideSelector(destination,speed);	
				}
				$('#' + allPanels[window.pageID].id).removeClass('current');
				window.pageID = destination;
				$('#' + allPanels[window.pageID].id).addClass('current');
				slider.removeClass('executing'); 
				$(this).dequeue();
	});

}}


/*******************/
/*** JOB BOXES ***/
/*******************/

function revealJob(where, isQueued) {
	
	var speed = 600;
	
// Save Job Panels on First Use
	if (window.jobsLoaded == null) {   // DO I EVEN NEED ALL OF THESE?????
		// Find Job Panels
		window.jobElements = $('li.city.box');
		window.job = $.makeArray(jobElements);
		window.jobsLoaded = 1;
		window.jobHolder = $('#experience');
		window.activeJob = 'none';
		window.activeResume = 'none';
		window.inactiveJobs = 'none';
		window.resumeText = $('.resume_container');
		window.job.nyc = $('#nyc');
		window.job.cle = $('#cle');
		window.job.grb = $('#grb');
		var numberOfJobs = new String(jobElements.size());
		l = '' + numberOfJobs + " Job Panels Cached. Won't dig again."
		trace(l);}
	
	// Lock Elements
	jobHolder.addClass('executing');	
	
	// Check Status
	var isOpen = jobHolder.hasClass('open');

	//== Open Box ==//
	if (!isOpen) {
	
		trace('Opening Job Box', where);
	
		// Mark boxes
		activeJob = $('#'+job[where].id);
		activeJob.addClass('active');
		activeResume = $('#'+job[where].id + ' .resume_container');
		inactiveJobs = $('li.city.box').not($("li.city.box.active"));
		
		// IE VERSION DOES NOT SCALE
		// IE VERSION DOES NOT SCALE
		// IE VERSION DOES NOT SCALE
		if (msie) {
	
		// Move All Boxes
		activeJob.css({'zIndex' : '3'});
		inactiveJobs.animate({'left' : '0'}, speed, easing); 
		activeJob.animate({'left' : '0'}, speed, easing)

		// Fade In Resume
		.queue( function() {
		activeResume.fadeIn(speed, easing, function() {
		
		// Unlock Elements
		jobHolder.removeClass('executing');
		jobHolder.addClass('open');
		activeJob.dequeue();
		var l = '  Box for \"' + job[where].id + '\" Opened.';
		trace(l);  
		return; }); });} else {
				
		// OTHER VERSIONS SCALE
		// OTHER VERSIONS SCALE
		// OTHER VERSIONS SCALE
		
		activeJob.animate({'scale' : '1.02'}, speed, easing, function() { 
		
		// Move All Boxes
		activeJob.css({'zIndex' : '3'});
		inactiveJobs.animate({'left' : '0'}, speed, easing); })
		.animate({'left' : '0'}, speed, easing)
		
		// Fade In Resume
		.queue( function() {
		activeResume.fadeIn(speed, easing, function() {
		
		// Unlock Elements
		jobHolder.removeClass('executing');
		jobHolder.addClass('open');
		activeJob.dequeue();
		var l = '  Box for \"' + job[where].id + '\" Opened.';
		trace(l);
		return; }); });	}
		
	//== Close Box ==//
	} else  if (isOpen || where == 'reset') {
			
		trace('Closing Job Box...');
			
		// Fade Out Resume
		activeResume.fadeOut(speed, easing, function() {
		
		// Move All Boxes
		job.nyc.animate({'left' : '32px'}, speed, easing);
		job.cle.animate({'left' : '21em'}, speed, easing);
		job.grb.animate({'left' : '40em'}, speed, easing, function() {
		
		// IE VERSION DOES NOT SCALE
		// IE VERSION DOES NOT SCALE
		// IE VERSION DOES NOT SCALE
		if (msie) {
		
		// Unlock Elements
		activeJob.css({'zIndex' : '2'});
		jobHolder.removeClass('open');
		activeJob.removeClass('active');
		jobHolder.removeClass('executing');
		
		// Bust Queue
		if (isQueued) {$(isQueued).dequeue();}
		trace('  All Boxes Closed.');
		return;
		} 
		
		// OTHER VERSIONS SCALE
		// OTHER VERSIONS SCALE
		// OTHER VERSIONS SCALE
		activeJob.css({'zIndex' : '2'});
		activeJob.animate({'scale' : '1'}, speed, easing, function() {
		
		// Unlock Elements
		jobHolder.removeClass('open');
		activeJob.removeClass('active');
		jobHolder.removeClass('executing');
		
		// Bust Queue
		if (isQueued) {$(isQueued).dequeue();}
		trace('  All Boxes Closed.');
		return; }); }); }); }
}


	
/* VIDEO PLAYER */
function videoSetup(state, isQueued) {
	
// Load One-Time Variables
	if (window.videoPlayerLoaded == null) {
	window.player = $('#video_player');
	window.videoPlayerLoaded = 1;
	trace('  Video Player Loaded.');
}
	
	// Check Player Status
	var isPlayerActive = player.hasClass('active');
	
	// Add Player
	if (state == 'on') {
		trace('Activating Video player...');
		slider.addClass('executing')
			.animate({'opacity' : '0'},1000,easing,function(){
		slider.addClass('hidden');
		player.addClass('executing')
			.css({ 'left' : '0'})
			.animate({'opacity' : '1'}, 1000, easing, function(){
				player.addClass('active')
				.removeClass('executing');
				slider.removeClass('executing');
		trace('Video Player Active.'); 
		return; });  });
	
	// Remove Player
	} else if (state == 'off') {
		
		var isPlayerActive = player.hasClass('active');
		if (!isPlayerActive) { trace('Player not active. Aborting.'); return; }
		
		trace('Hiding Video player...');
		
		player.addClass('executing')
			.animate({'opacity' : '0'}, 1000, easing, function() {
				player.css({'left' : '-9999px'})
				
				slider.addClass('executing')
				.animate({'opacity' : '1'}, 1000, easing, function() {
				
				player.removeClass('executing')
				.removeClass('active');
				
				slider.removeClass('executing')
				.removeClass('hidden');
				return;	 });  });
				
	// Initialize (Hide) Player
	} else {
		player.css({'left' : '-9999px', 'opacity' : '0'});
		trace('  Video Player Hidden.');
		return;
	}
}



/* LOGGING */
function trace(title,entry) {
	// Don't log in unsupported browsers
	if( (window['console'] !== undefined) ){
		// Writes dashes at the end of grouped logs
		if (title == 'end') {
			window.console.log('----------------------');
		// Just write one line
		}  else if (title == 'blocked') {
			window.console.log('*Can\'t Execute - Function is already running*');
		} else if (entry == null) {
			window.console.log(title);
		// If 2 variables are passed, #1 is assumed to be the property, #2 the value
		}	else {
			window.console.log(title + ': ' + entry);}}}

/* LITTLE SLIDER */
function slideSelector(destination,speedAdjusted) {
	
	trace('moving slide selector', destination);
	
	var l = new Number();
	var w = new Number();
	var fontSize = $('html').css('font-size');
	// Eliminate Units
	fontSize = parseInt(fontSize);
	// Set Positions
	if (destination == 0) {
		l = 6;
		w = 6;
	} else if (destination == 1) {
		l = 16.75;
		w = 4.5;
	} else if (destination == 2) {
		l = 25.6;
		w = 9.75;
	} else if (destination == 3) {
		l = 37.5;
		w = 15.25;
	}
	// Force *LINE* under the selected menu item instead of *BOX*  by enabling these 2 lines:
	l = l+0.5;
	w = w-1;
	// Begin Animation
	l = l*fontSize;
	w = w*fontSize;
	$('#menu_slider').animate( { left: l, width: w }, speedAdjusted, easing, function() {
		// Put the Arrows back
		//$('.arrow').animate( {opacity: 1}, 1000);
	
		});
	// Add and Remove "Pressed" Effect to Menu Labels
	// Find all buttons, Make Array
	var menuLinks = $('li.menu_link');
	var menuList = $.makeArray(menuLinks);
	// Remove all buttons' effects
	$(menuLinks).removeClass('pressed');
	// Add effect to only the destination button
	$('#' + menuLinks[destination].id).addClass('pressed');
}



/* ARROWS */
function adjustArrows(scrollDirection,currentPanel,numberOfPanels,isQueued) {
// Define Arrows
var arrow1, arrow2, type = new String();
type = '';  //Keep "Type" blank for desktop browsers
// Hide Arrows on iOS  (replaced with swipe options)
if (window.iOS == true ) {
	$('#next_page').hide(0);
	$('#previous_page').hide(0);
	$('#web_up').hide(0);
	$('#web_down').hide(0);
	type = '_swipe';
}
// Hide Horizontal Arrows 
if (scrollDirection == 'hideHorizontal') {
	$('#next_page' + type).fadeOut();
	$('#previous_page' + type).fadeOut();
	trace('Hiding Horizontal Arrows.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
// Reveal Horizontal Arrows 
if (scrollDirection == 'revealHorizontal') {
	$('#next_page' + type).fadeIn();
	$('#previous_page' + type).fadeIn();
	trace('Showing Horizontal Arrows.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
// Hide Vertical Arrows 
if (scrollDirection == 'hideVertical') {
	$('#web_up' + type).fadeOut();
	$('#web_down' + type).fadeOut();
	trace('Hiding Vertical Arrows.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
// Reveal Vertical Arrows 
if (scrollDirection == 'revealVertical') {
	$('#web_up' + type).fadeIn();
	$('#web_down' + type).fadeIn();
	trace('Showing Vertical Arrows.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
// Set Up Complex Moves
if (scrollDirection == 'horizontal') {
	arrow1 = '#next_page' + type;
	arrow2 = '#previous_page' + type;
} else if (scrollDirection == 'vertical') {
	arrow1 = '#web_up' + type;
	arrow2 = '#web_down' + type;
	numberOfPanels = numberOfPanels - 1;  //Fix for vertical scrolling... this function works on javascript standards of 0 == 1
}	else {
	trace('Can\'t Manipulate Arrows - No Arrows Selected!');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
// Animate
if (currentPanel == 0) {
	// Show "Next" Only
	if (scrollDirection == 'horizontal') {
	// Horizontal
	$(arrow2).fadeOut();
	$(arrow1).fadeIn();
	trace('Arrows','Back hidden.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
	} else if (scrollDirection == 'vertical') {
	// Vertical
	$(arrow1).fadeOut();
	$(arrow2).fadeIn();
	trace('Arrows','Up hidden.');
	if (isQueued) {$(isQueued).dequeue();}
	return;}
} 
// Show "Next" and "Previous"
else if (currentPanel > 0 && currentPanel < numberOfPanels) {
	// Same result for both horizontal + vertical
	$(arrow2).fadeIn();
	$(arrow1).fadeIn();
	trace('Showing Both Arrows.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
}
if (currentPanel == numberOfPanels) {
// Show "Previous" Only
	if (scrollDirection == 'horizontal') {
	// Horizontal
	$(arrow1).fadeOut();
	$(arrow2).fadeIn();
	trace('Arrows','Next hidden.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
	} else if (scrollDirection == 'vertical') {
	// Vertical
	$(arrow2).fadeOut();
	$(arrow1).fadeIn();
	trace('Arrows','Down hidden.');
	if (isQueued) {$(isQueued).dequeue();}
	return;
	}
} 
}




