﻿/*
	Loading jQuery
*/
$j = jQuery.noConflict();

/*
	The Happy Bit Javascript controller
*/
var THB = {
	
	/*
		Drawer
		Eg. THB.drawer("#contentbox", "a#trigger");
		Eg. THB.drawer("#contentbox", "a#trigger", { event: 'doubleclick' });
	*/
	drawer: function(content, trigger, parameters) {
		var params = {
			event: 'click',
			openClass: 'open',
			transition: 350,
			easing: 'linear'
		};
		$j.extend(params, parameters);
		
		$j(content).hide();
		$j(trigger).bind(params.event, function() {
			$j(content)
				.slideToggle(params.transition, params.easing)
				.toggleClass(params.openClass);
			return false;
		})
	},
	
	/*
		Image preloader
		Eg. THB.preload("img");
		Eg. THB.preload("img.thumb", { delay: 200, transition: 400 });
	*/
	preload: function(selector, parameters) {
		var params = {
			delay: 250,
			transition: 350,
			easing: 'linear'
		};
		$j.extend(params, parameters);
		
		$j(selector).css({opacity: 0});
		$j(selector).wrap('<span class="preloader" />');
		$j(selector).one("load", function() {
			$j(this).delay(params.delay).animate({opacity: 1}, params.transition, params.easing, function(){
				$j(this).unwrap('<span class="preloader" />');
			});
		}).each(function() {
			if(this.complete) $j(this).trigger("load");
		});
	},
	
	/*
		Scroller
		Eg. THB.scroll_to("#section_id");
		Eg. THB.scroll_to("#section_id", { transition: 500, easing: 'linear' });
	*/
	scroll_to: function(selector, parameters) {
		var params = {
			transition: 350,
			easing: 'easeInOutQuad',
			offset: 0
		};
		$j.extend(params, parameters);
			
		var y = $j(selector).position().top + params.offset;
		$j('html, body').animate({scrollTop: y}, params.transition, params.easing);
		return false;
	}
	
};

/*
	Global variables
*/
var scrolledClass = "scrolled";
var activeClass = "active";
var sections = ["#services", "#workflow", "#contact", "#about"];
var sectionOffsets = [];
var sectionMargin = 80;
var documentHeight;

$j(document).ready(function() {
	$j("#page-nav ul li a").click(function() {
		var href = $j(this).attr("href");
		return THB.scroll_to(href, { offset: -15 });
	});
	
	$j("#logo").click(function() {
		if($j(this).hasClass(scrolledClass))
			return THB.scroll_to("body");
		return true;
	});
	
	THB.preload("figure img");
	
	hbf_validate();
	
	show_page_menu();
	$j(document).scroll(show_page_menu);
});

function hbf_validate(){
	$j("#contact-form").validVal({
		invalidFormFunc: function() {},
		invalidFieldFunc: function($field, $form, language) {
			$field.next().stop().show();
		},
		validFieldFunc: function($field, $form, language) {
			$field.next().stop().hide();
		}
	});
}

function calculate_section_offsets() {
	sectionOffsets = [];
	for(i=0;i<sections.length;i++) {
		var sec = $j(sections[i]);
		if(sec.length)
			sectionOffsets.push(sec.position().top);
	}
}

function show_page_menu() {
	// Needed upon resize
	calculate_section_offsets();
	
	// Logo
	var logo = $j("#logo");
	
	// Footer
	var footer = $j("body > footer");
	
	// Page navigation
	var pageNav = $j("#page-nav");

	// Scroll offset
	var offsetTop = $j(window).scrollTop();
	
	// Logo height
	var logoHeight = logo.height();
	
	// Footer height
	var footerHeight = footer.height();
	
	// Offset triggering submenu state transition
	var offset = logoHeight + sectionMargin;
	
	// Has the page scrolled enough?
	var scrolled = offsetTop > ((sectionOffsets[0] - offset) || (offsetTop > logoHeight));
	
	// Avoiding weird menu collisions at the bottom of the page
	documentHeight = $j(document).height();
	var bottomSafe = offsetTop < (documentHeight - footerHeight - (pageNav.height()*5));
	
	if(scrolled && bottomSafe) {
		logo.addClass(scrolledClass);
		pageNav.css({display : 'block' });
		pageNav.addClass(scrolledClass);
		for(i=0;i<sectionOffsets.length;i++) {
			pageNav.find("a."+activeClass).removeClass(activeClass);
			if( (offsetTop< sectionOffsets[i+1]-offset) || i==sectionOffsets.length-1 ) {
				pageNav.find("a[href='"+ sections[i] +"']").addClass(activeClass);
				break;
			}
		}
	} else {
		if(bottomSafe)
			logo.removeClass(scrolledClass);
		pageNav.removeClass(scrolledClass);
		pageNav.css({display : 'none' });
	}
	
}

/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*/
jQuery.easing.jswing=jQuery.easing.swing;jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(x,t,b,c,d){return jQuery.easing[jQuery.easing.def](x,t,b,c,d)},easeInQuad:function(x,t,b,c,d){return c*(t/=d)*t+b},easeOutQuad:function(x,t,b,c,d){return -c*(t/=d)*(t-2)+b},easeInOutQuad:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t+b}return -c/2*((--t)*(t-2)-1)+b},easeInCubic:function(x,t,b,c,d){return c*(t/=d)*t*t+b},easeOutCubic:function(x,t,b,c,d){return c*((t=t/d-1)*t*t+1)+b},easeInOutCubic:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t+b}return c/2*((t-=2)*t*t+2)+b},easeInQuart:function(x,t,b,c,d){return c*(t/=d)*t*t*t+b},easeOutQuart:function(x,t,b,c,d){return -c*((t=t/d-1)*t*t*t-1)+b},easeInOutQuart:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t*t+b}return -c/2*((t-=2)*t*t*t-2)+b},easeInQuint:function(x,t,b,c,d){return c*(t/=d)*t*t*t*t+b},easeOutQuint:function(x,t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b},easeInOutQuint:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t*t*t+b}return c/2*((t-=2)*t*t*t*t+2)+b},easeInSine:function(x,t,b,c,d){return -c*Math.cos(t/d*(Math.PI/2))+c+b},easeOutSine:function(x,t,b,c,d){return c*Math.sin(t/d*(Math.PI/2))+b},easeInOutSine:function(x,t,b,c,d){return -c/2*(Math.cos(Math.PI*t/d)-1)+b},easeInExpo:function(x,t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b},easeOutExpo:function(x,t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b},easeInOutExpo:function(x,t,b,c,d){if(t==0){return b}if(t==d){return b+c}if((t/=d/2)<1){return c/2*Math.pow(2,10*(t-1))+b}return c/2*(-Math.pow(2,-10*--t)+2)+b},easeInCirc:function(x,t,b,c,d){return -c*(Math.sqrt(1-(t/=d)*t)-1)+b},easeOutCirc:function(x,t,b,c,d){return c*Math.sqrt(1-(t=t/d-1)*t)+b},easeInOutCirc:function(x,t,b,c,d){if((t/=d/2)<1){return -c/2*(Math.sqrt(1-t*t)-1)+b}return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b},easeInElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d)==1){return b+c}if(!p){p=d*0.3}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}return -(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b},easeOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d)==1){return b+c}if(!p){p=d*0.3}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b},easeInOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d/2)==2){return b+c}if(!p){p=d*(0.3*1.5)}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}if(t<1){return -0.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b}return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*0.5+c+b},easeInBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}return c*(t/=d)*t*((s+1)*t-s)+b},easeOutBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},easeInOutBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}if((t/=d/2)<1){return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b}return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b},easeInBounce:function(x,t,b,c,d){return c-jQuery.easing.easeOutBounce(x,d-t,0,c,d)+b},easeOutBounce:function(x,t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b}else{if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+0.75)+b}else{if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+0.9375)+b}else{return c*(7.5625*(t-=(2.625/2.75))*t+0.984375)+b}}}},easeInOutBounce:function(x,t,b,c,d){if(t<d/2){return jQuery.easing.easeInBounce(x,t*2,0,c,d)*0.5+b}return jQuery.easing.easeOutBounce(x,t*2-d,0,c,d)*0.5+c*0.5+b}});
