// Core
var core = {

	// Nav indicator
	navIndicator: null,

	// Paging
	pageBusy: false,
	
	// Main pages
	mainPages: [],
	currentMainPage: null,
	queuedMainPage: null,
	
	// History hash
	firstPageHash: '',
	
	// Showcase pages
	showcasePages: [],
	currentShowcasePage: null,
	queuedShowcasePage: null,
	showcaseNavItemWidth: null,
	showcaseNavScroll: 0, // remember scroll position
	
	// Initialise
	init: function() {
	
		// Javascript
		$('body').addClass('javascript');
		
		// Setup pages
		core.setupMainPages();
		
		// Handle main navigation clicks
		core.handleMainNavigation();
		
		// Create nav indicator
		core.initNavIndicator();
		
		// Navigation effects
		core.navLoadEffects();
		
		// Fix opacity issues in firefox
		if ($.browser.mozilla) $('body').css('opacity', 0.9999);
	
	},
	
	// Handle history callbacks
	history: function(hash) {
		
		// Check blank
		if (hash == '') {
		
			// First page they landed on
			hash = core.firstPageHash;
			
		}
		
		// Work goes to first item & rememebers it
		if (hash == 'work' && core.mainPages['work'].currentShowcaseHash) {
			//hash = core.mainPages['work'].currentShowcaseHash;
		}
		
		// Handle
		if (core.mainPages[hash]) {
			
			// Main
			core.showMainPage(core.mainPages[hash]);
			
		} else if (core.showcasePages[hash]) {

			// Showcase
			if (core.currentMainPage != core.mainPages['work']) {

				// Load work
				core.showcaseNavScroll = 0;
				core.mainPages['work'].element = null;
				core.mainPages['work'].url = '/work_page.php?project='+hash;
				core.showMainPage(core.mainPages['work']);
			
			} else {
			
				// Load showcase
				core.showShowcasePage(core.showcasePages[hash]);
			
			}

		}
	},
	
	// Navigation
	navLoadEffects: function() {
	
		// Hide all
		$('#logo, #area_nav, #main_nav_indicator, #main_nav li').css('opacity', 0);
		
		// Show
		var delay = 200, incr = 100;
		$('#logo, #area_nav, #main_nav_indicator, #main_nav li').each(function(i) {
			var el = $(this);
			window.setTimeout(function() {
				el.animate({opacity: 1}, {queue: false, duration: 1000});
			}, delay+(el.attr('id') == 'main_nav_indicator' ? 0 : incr*i));
		});
	
	},
	
	// Create nav indicator
	initNavIndicator: function() {
	
		// Hide
		$('#main_nav').addClass('hide_indicator');
		
		// Add new
		core.navIndicator = $('<div id="main_nav_indicator"></div>');
		$('#main_nav').append(core.navIndicator);
		
		// Move
		core.moveNavIndicator(null, true);
	
	},
	
	// Move nav indicator
	moveNavIndicator: function(page, jump) {
	
		// New nav
		var p = page ? page : core.currentMainPage;
		var nav = $(p.nav);
		core.navIndicator.animate({ 
			left: nav.position().left,
			width: nav.width()
		}, {
			duration: jump ? 0 : 500, easing: 'easeOutSine'
		});
	
	},
	
	// Setup pages
	setupMainPages: function() {

		// Home
		core.mainPages['home'] = { 
			name: 'home', url: '/home_page.php', nav: '#main_nav_home', 
			onenter: function() {
			
				// Equal heights
				$('#home_page #about_us_column, #home_page  #services_column').equalHeights();		
				
				// Screwed up in IE6 - typical!
				var IE6 = (navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) && (navigator.userAgent.toLowerCase().indexOf('msie 7') == -1);
				if (!IE6) {
				
					// Start quote ticket
					this.quoteTicker = setInterval(function() {
					
						// Get
							$.get('/includes/random_quote.php', function(data) {
								$('#home_page #featured_column div img').fadeOut(800, function() {
									$('#home_page #featured_column div').empty().append($(data).hide());
									$('#home_page #featured_column div img').fadeIn(800);
								});
							});
					}, 8000);
					
				}
				
			},
			onleave: function() {
			
				// Stop quote ticker
				if (this.quoteTicker) { clearInterval(this.quoteTicker); }
				this.quoteTicker = null;
				$('#home_page #featured_column').show();
			
			}
		};
		
		// Work
		core.mainPages['work'] = { 
			name: 'work', url: '/work_page.php?project=<?=$project?>', nav: '#main_nav_work', 
			oninsert: function() {
				if (pngfix) pngfix(); // PNG Fix
				$('#showcase_scroller')[0].scrollLeft = core.showcaseNavScroll;
			}
		};
		
		// Services
		core.mainPages['services'] = { name: 'services', url: '/services_page.php', nav: '#main_nav_services', oninsert: function() {
			$('.service_column p').equalHeights();		
		}};
		core.mainPages['process'] = { name: 'process', url: '/process_page.php', nav: '#main_nav_services' };
		
		// About
		core.mainPages['about'] = { 
			name: 'about', url: '/about_page.php', nav: '#main_nav_about',
			oninsert: function() {
			
				var smallHeight = 10.5;
				var fullHeight = 21;
				var time = 500;
			
				// Setup
				$('#about_page .profile_content').height(smallHeight+'em');
				
				// Watch events
				$('#about_page #profile_ollie, #about_page #profile_mike').hover(function() {
					// Mouse over
					$(this).find('.profile_content').stop().animate({height: fullHeight+'em'}, {duration: time });
					$('#about_page .profile').not(this).find('.profile_content').stop().animate({height: '0em'}, { duration: time, easing: 'easeOutSine' });
				}, function() {
					// Mouse out
					$(this).find('.profile_content').stop().animate({height: smallHeight+'em'}, { duration: time });
					$('#about_page .profile').not(this).find('.profile_content').stop().animate({height: smallHeight+'em'}, { duration: time, easing: 'easeOutSine' });
				});
			
			}
		};
		
		// Contact
		core.mainPages['contact'] = { name: 'contact', url: '/contact_page.php', nav: '#main_nav_contact', 
			oninsert: function() {
				if (pngfix) pngfix(); // PNG Fix
				$('a.email').nospam({ replaceText: true });
			}
		};
		
		// Set indexes
		var u = 0; for (var i in core.mainPages) core.mainPages[i].index = u++;
		
		// Current page
		core.currentMainPage = core.mainPages[$('body').attr('id')];
		core.currentMainPage.element = $('#'+core.currentMainPage.name+'_page');
		if (core.currentMainPage.oninsert) core.currentMainPage.oninsert();
		if (core.currentMainPage.onenter) core.currentMainPage.onenter();
		
		// Remember first for history hash (if it is work then remember showcase page)
		if (core.currentMainPage.name != 'work')
			core.firstPageHash = core.currentMainPage.name;
	
	},
	
	// Handle main navigation clicks
	handleMainNavigation: function() {

		// Clicks
		$('#main_nav_home a').click(function() { return core.navigate(core.mainPages['home']); });
		$('#main_nav_about a').click(function() { return core.navigate(core.mainPages['about']); });
		$('#main_nav_services a').click(function() { return core.navigate(core.mainPages['services']); });
		$('#main_nav_work a').click(function() { return core.navigate(core.mainPages['work']); });
		$('#main_nav_contact a').click(function() { return core.navigate(core.mainPages['contact']); });
	
	},
	
	// Navigate via history
	navigate: function(page) {
	
		// History
		$.history.load(page.name);
		return false;
		
	},
	
	// Show main page
	showMainPage: function(page) {
	
		// Select nav item
		if (page.nav) {
		
			// Select
			$('#main_nav li').removeClass('selected');
			$(page.nav).closest('li').addClass('selected');
		
			// Loading
			if (!page.element) core.loading(true, page);
			
		}
		
		// Queueing
		if (core.pageBusy) {
			core.queuedMainPage = page;
			return false;
		}
		
		// Fade out current page
		if (page && page != core.currentMainPage) {
			core.animatePageOut(core.currentMainPage);
		}

		// Change
		core.showPage(core.currentMainPage, page, function() {
		
			/*
			 * Complete
			 */
		
			// Reset opacity
			core.animatePageReset(core.currentMainPage);
		
			// Complete - Set current
			core.currentMainPage = page;
			
			// Page title
			document.title = page.title;
								
			// Queueing
			core.processQueues();
			
			// Set scroll again (reset for somereason)
			if (page.name == 'work') {
				$('#showcase_scroller')[0].scrollLeft = core.showcaseNavScroll;
			}
			
			// Not loading
			core.loading(false, page);
			
			// Update
			core.updateShowcaseNavControls();
			
		}, function(ajax) {
		
			/*
			 * Loaded
			 */

			// Move
			core.moveNavIndicator(page);
			
			// Not Loading
			core.loading(false, page);
			
			// Continue
			return true;
		
		});
		
		// Return
		return false;
		
	},
	
	// Show page
	showPage: function(oldPage, newPage, completeCallback, loadedCallback) {

		// Busy or Same page
		if (core.pageBusy) return false;
		if (oldPage === newPage) return false;
				
		// Busy
		core.pageBusy = true;
		var cont = true;

		// Load page
		if (!newPage.element) {
		
			// Load via ajax
			$.get(newPage.url, function(data) {

// Delay
//setTimeout(function() {
				// Store element
				newPage.element = $(data).filter(function() {
					return this.nodeType == 1; // 1 = ELEMENT_NODE
				}).eq(0);
		
				// Loaded callback
				if (loadedCallback) {
					cont = loadedCallback(true);
				}
				
				// Process
				if (cont) {
					process(oldPage, newPage, completeCallback);
				} else {
					core.pageBusy = false;
				}
//}, 500);
				
			});
		
		} else {
		
			// Loaded callback
			if (loadedCallback) {
				cont = loadedCallback(false);
			}

			// Already loaded so show
			if (cont) {
				process(oldPage, newPage, completeCallback);
			} else {
				core.pageBusy = false;
			}
		
		}
		
		// Return
		return false;
			
		// Process show page
		function process(oldPage, newPage, completeCallback) {
			
			// Direction
			var dir = 'left';
			if (oldPage && oldPage.index > newPage.index) dir = 'right';
			
			// Enter and leave callback
			if (oldPage && oldPage.onleave) oldPage.onleave();
			if (newPage.onenter) newPage.onenter();
			
			// Show page
			pageController.show(oldPage, newPage, {
				direction: dir,
				easing: 'easeOutSine',
				duration: 500,
				complete: function() {
				
					// Busy
					core.pageBusy = false;
					
					// Callback
					if (completeCallback) completeCallback();
					
				},
				oninsert: newPage.oninsert
			});
			
		}
	
	},
	
	// Loading
	loading: function(loading, page) {

		// Create if needed
		var div = $('#nav_loading');
		if (div.length == 0) {
			div = $('<div id="nav_loading"></div>').hide();
			$('#main_nav').append(div);
		}
		
		// Nav item
		var nav = $(page.nav);
		
		// Loading yes or no
		if (loading) {
		
			// Position
			div.css({ left: nav.position().left, width: nav.outerWidth() });
			div.fadeIn(500, function() {
			
				// Pulse
				$(page.nav+', #nav_loading').pulse({
				    opacityRange: [1, 0.5],
				    speed: 500
				});
			
			});
		
		} else {
		
			// Hide
			$('#main_nav li, #nav_loading').recover();
			div.fadeOut(200);
		
		}

	},
	
	// Process paging queues
	processQueues: function() {
	
		// Main Page Queue
		if (core.queuedMainPage) {
			if (core.queuedMainPage == core.currentMainPage) {
				core.queuedMainPage = null;
			} else {
				core.showMainPage(core.queuedMainPage);
			}
		}
		
		// Showcase Page Queue
		if (core.queuedShowcasePage) {
			if (core.queuedShowcasePage == core.currentShowcasePage) {
				core.queuedShowcasePage = null;
			} else {
				core.showShowcasePage(core.queuedShowcasePage);
			}
		}
	
	},
	
	// Fade elements out
	animatePageOut: function(page) {
		if (!page) return;
		var elements = []; 
		elements.push(page.element);
		if (!$.support.opacity) elements.push(page.element.find('.ieopacityfix'));
		$.each(elements, 
			function() { 
				$(this).animate({opacity: 0.4}, { duration: 200 }); 
			}
		);
	},
	
	// Fade elements out
	animatePageReset: function(page) {
		var elements = []; 
		elements.push(page.element);
		if (!$.support.opacity) elements.push(page.element.find('.ieopacityfix'));
		$.each(elements, 
			function() { 
				$(this).css('opacity', 1); 
			}
		);
	},
	
	// Change showcase project
	showShowcasePage: function(page) {

		// Select
		core.selectShowcaseNavItem(page);
				
		// Queueing
		if (core.pageBusy) {
			core.queuedShowcasePage = page;
			return false;
		}

		// Fade out current page
		if (page && page != core.currentShowcasePage) {
			core.animatePageOut(core.currentShowcasePage);
		}
		
		// Change
		core.showPage(core.currentShowcasePage, page, function() {
		
			/*
			 * Complete
			 */
			 
			// Reset opacity
			core.animatePageReset(core.currentShowcasePage);
		
			// Complete - Set current
			core.currentShowcasePage = page;
								
			// Queueing
			core.processQueues();
			
		});
		
		// Return
		return false;
		
	},
	
	// Select a showcase nav item and centralise
	selectShowcaseNavItem: function(page) {

		// Showcase nav
		var nav = $('#showcase_nav');
		var selected = $('#showcase_nav_'+page.name);

		// Showcase nav item width
		if (!core.showcaseNavItemWidth) {
			core.showcaseNavItemWidth = selected.outerWidth() + parseInt(selected.css('margin-left')) * 2;
		}

		// Initialise showcase nav
		if (nav.find('li:hidden').length > 0) {
			nav.find('li').show();
			$('#showcase_scroller')[0].scrollLeft = (nav.find('li.selected').prevAll().length - 3) * core.showcaseNavItemWidth;
		}
	
		// Select nav items
		nav.find('li.selected').removeClass('selected');
		selected.addClass('selected');

		// Get info
		var currentIndex = $('#showcase_nav li:not(.pad)').index(selected);
		var displaying = 7;
		core.updateShowcaseNavControls();
		
		// Animate to page
		core.showcaseNavScroll = Math.floor(currentIndex/displaying)*displaying * core.showcaseNavItemWidth;
		$('#showcase_scroller').stop().animate({scrollLeft: core.showcaseNavScroll}, { queue: false, duration: 500, easing: 'easeOutCirc'});

	},
	
	updateShowcaseNavControls: function() {
	
		try {
			
			// Get info
			var count = $('#showcase_nav li:not(.pad)').length;
			var currentIndex = $('#showcase_nav li:not(.pad)').index($('#showcase_nav li.selected'));
			var displaying = 7;
			var currentShowcaseNavPage = Math.floor(currentIndex/displaying);
			var showcaseNavPages = Math.ceil(count/displaying);
			
			// Show / Hide SHowcase Nav
			if (currentIndex == 0) $('a#showcase_prev').addClass('disabled'); else $('a#showcase_prev').removeClass('disabled');
			if (currentIndex == count - 1) $('a#showcase_next').addClass('disabled'); else $('a#showcase_next').removeClass('disabled');
			if (currentShowcaseNavPage == 0) $('a#showcase_skip_back').addClass('disabled'); else $('a#showcase_skip_back').removeClass('disabled');
			if (currentShowcaseNavPage == showcaseNavPages - 1) $('a#showcase_skip_forward').addClass('disabled'); else $('a#showcase_skip_forward').removeClass('disabled');
		
		} catch (err) {
		}
	
	},
	
	// Show previous showcase project
	showPrevShowcasePage: function() {
	
		// Get previous page
		var page = null;
		var index = $('#showcase_nav li:not(.pad)').index($('#showcase_nav li.selected')) - 1;
		for (var proj in core.showcasePages) {
			if (core.showcasePages[proj].index == index) {
				page = core.showcasePages[proj];
				break;
			}
		}
		
		// Show
		if (!page) return false;
		return core.navigate(page);
				
	},
	
	// Show next showcase project
	showNextShowcasePage: function() {
	
		// Get previous page
		var page = null;
		var index = $('#showcase_nav li:not(.pad)').index($('#showcase_nav li.selected')) + 1;
		for (var proj in core.showcasePages) {
			if (core.showcasePages[proj].index == index) {
				page = core.showcasePages[proj];
				break;
			}
		}
		
		// Show
		if (!page) return false;
		return core.navigate(page);
				
	},
	
	// Show previous set of showcase projects
	showPrevSetShowcasePage: function() {
	
		// Count
		var count = $('#showcase_nav li:not(.pad)').length;
		var currentIndex = $('#showcase_nav li:not(.pad)').index($('#showcase_nav li.selected'));
		var displaying = 7;
		var index = -1;
	
		// Return
		var currentShowcaseNavPage = Math.floor(currentIndex/displaying);
		var showcaseNavPages = Math.ceil(count/displaying);
		if (currentShowcaseNavPage == 0) return false;

		// Find
		index = (Math.floor(currentIndex/displaying)-1)*displaying;
		if (index < 0) index = 0;
		if (index > count - 1) index = count - 1;

		// Get page page
		var page = null;
		for (var proj in core.showcasePages) {
			if (core.showcasePages[proj].index == index) {
				page = core.showcasePages[proj];
				break;
			}
		}
		
		// Show
		if (!page) return false;
		return core.navigate(page);

	},
	
	// Show next set of showcase projects
	showNextSetShowcasePage: function() {
		
		// Count
		var count = $('#showcase_nav li:not(.pad)').length;
		var currentIndex = $('#showcase_nav li:not(.pad)').index($('#showcase_nav li.selected'));
		var displaying = 7;
		var index = -1;

		// Return
		var currentShowcaseNavPage = Math.floor(currentIndex/displaying);
		var showcaseNavPages = Math.ceil(count/displaying);
		if (currentShowcaseNavPage == showcaseNavPages - 1) return false;
		
		// Find
		index = (Math.floor(currentIndex/displaying)+1)*displaying;
		if (index < 0) index = 0;
		if (index > count - 1) index = count - 1;

		// Get page page
		var page = null;
		for (var proj in core.showcasePages) {
			if (core.showcasePages[proj].index == index) {
				page = core.showcasePages[proj];
				break;
			}
		}
		
		// Show
		if (!page) return false;
		return core.navigate(page);

	},
	
	// Change showcase images & captions
	changeShowcaseImage: function(number, caption) {
	
		// Not if busy
		if (core.pageBusy) return false;
	
		// Images & container
		var container = $('.project_images .image_container');
		var previous = $('.image_container img:visible');
		var next = $('.image_container img:eq('+(number-1)+')');
		if (previous.attr('src') !== next.attr('src')) {
		
			// Show
			previous.fadeOut(500);
			next.fadeIn(500);
			
			// Select
			var listItems = $('.project_images li');
			listItems.removeClass('selected');
			listItems.eq(listItems.length - number).addClass('selected');
			
			// Caption
			$('.project_images p').html(next.attr('alt'));
			
		}

		// Return
		return false;
	
	},
	
	// Send contact form
	sendContactForm: function() {
	
		// Get form
		var form = $('#contact_form');
		var container = $('#contact_form_container');
		
		// Busy
		if (form.data('busy')) return false;
		form.data('busy', true);
		
		// Button text
		form.find('#send_form a').html('Please wait&hellip;');

		// Submit
		$.ajax({
			type: "post",
			url: "/includes/contact_form.php",
			data: form.serialize(),
			complete: function(data) {
			
				// Check if it was a success
				data = $(data.responseText);
				if (data.attr('id') == 'send_success') {
				
					// Fade
					container.fadeOut(800, function() {
						container.empty();
						container.append(data);
						container.fadeIn({duration: 800});	
					});
				
				} else {
				
					// Just update	
					container.empty();
					container.append(data);
				
				}
				
				// Busy
				form.data('busy', false);
				
			}
		});
		
		// Return
		return false;
	
	}

}