//Bind for all functions
if(!Function.prototype.bind) {
	Function.prototype.bind = function(context) {
		var __method = this;
		var __arguments = jQuery.makeArray(arguments).slice(Function.prototype.bind.length);
		return function() {
			var args = __arguments.concat(jQuery.makeArray(arguments));
			return __method.apply(context, args);
		};
	};
}

//Store information in class names
jQuery.fn.extend({
	getClassValue: function(classStart) {
		classStart+='-';
		var result = null;
		jQuery.each(this.get(0).className.toString().split(/\s+/), function(i, val) {
			if(val.indexOf(classStart) === 0) {
				result = val.substring(classStart.length);
				return false;
			}
		});
		return result;
	}
});

//Ajax stuff
jQuery(document).ready(function() {
	var ajax_loader = new AjaxLoader();
	
	var prepare_ajax_link = function(link) {
		link = jQuery(link);
		if(link.data('has_been_prepared')) {
			return link;
		}
		link.data('has_been_prepared', true);
		if(link.is('.return_link') || link.is('.no-ajax, .no-ajax *, *[rel=document], *[rel=external], .service_links *')) {
			return null;
		}
		link.data('load_ajax', link.parents('.load-ajax'));
		link.data('load_into', jQuery(link.data('load_ajax').getClassValue('load-into')));
		return link;
	};
	
	jQuery('.load-ajax a').live('click', function() {
		var link = prepare_ajax_link(this);
		
		if(!link) {
			return true;
		}
		
		jQuery.historyLoad(link.attr('href'), link);
		return false;
	});
	
	var return_link_handler = function(return_link) {
		var original = return_link.data('original');
		var target = return_link.data('target');
		if(original && target) {
			original.show();
			target.hide();
			return false;
		}
		return true;
	}
	
	var previous_load_into = null;
	jQuery.historyInit(function(hash, link) {
		if(!hash) {
			if(!previous_load_into) {
				return;
			}
			var return_link = previous_load_into.find('a.return_link');
			if(return_link.length) {
				return_link_handler(return_link);
			} else {
				previous_load_into.load(location.href, {container_only: 'content'});
			}
			return;
		}
		link = link || jQuery(".load-ajax a[href='"+hash+"']");
		var shortenedHash = hash;
		while(link.length === 0 && !shortenedHash.indexOf('/') > 0) {
			shortenedHash = shortenedHash.substr(0, shortenedHash.lastIndexOf('/'));
			link = jQuery(".load-ajax a[href='"+shortenedHash+"']");
		}
		if(link.length === 0) {
			return;
		}
		link = prepare_ajax_link(link);
		
		ajax_loader.showLoader();

		var load_ajax = link.data('load_ajax');
		var load_into = link.data('load_into');
		previous_load_into = load_into;
		
		var original_action = load_ajax.getClassValue('original');
		var return_to = load_ajax.getClassValue('return-to');
		
		
		var load_handler = function(response_text, text_status, request) {
			ajax_loader.hideLoader();
			if(text_status != 'success') {
				return;
			}
			var return_links = load_into.find('a.return_link');
			if(original_action == 'hide') {
				return_links.data('original', load_ajax);
				return_links.data('target', load_into);
				load_ajax.hide();
			} else if(return_to) {
				return_links.data('original', jQuery(return_to));
				return_links.data('target', load_into);
			}
			load_into.show();
		};
		link.parent().parent().addClass('visited');
		link.blur();
		
		load_into.load(hash, {container_only: 'content'}, load_handler);
	});
	
	jQuery('a.return_link').live('click', function() {
		window.location.hash = '';
		return return_link_handler(jQuery(this));
	});
});

//Print service buttons
jQuery(document).ready(function() {
	jQuery('.service_links a.print').live('click', function() {
		window.print();
		return false;
	});
});

//Subsite links
jQuery(document).ready(function() {
	jQuery('a.internal_link.subsite').click(function(event) {
		event.preventDefault();
		var subs_url = this.href;
		var params = { width: 800, height: 480, status: 'no', toolbar: 'no', resizable: 'yes', directories: 'no', menubar: 'no', location: 'no'};
		if(subs_url.indexOf('?')) {
			var tParams = {};
			jQuery.each(subs_url.substr(subs_url.indexOf('?')+1).split('&'), function() {
				var split = this.split('=');
				tParams[split[0]] = split[1];
			});
			jQuery.extend(params, tParams);
			subs_url = subs_url.substr(0, subs_url.indexOf('?'));
		}
		params = jQuery.param(params).replace(/&/g, ',');
		window.open(subs_url, 'subsite_window', params);
	});
});

//newsflash link ajax rewriting
jQuery(document).ready(function() {
	var newsflash_link = jQuery("#newsflash_link");
	if(newsflash_link.length == 0) {
		return;
	}
	var href = newsflash_link.attr('href');
	var detail_pos = href.indexOf("detail/");
	if(detail_pos === -1) {
		return;
	}
	newsflash_link.attr('href', href.substring(0, detail_pos) + "#" + href);
});

/**
	Classes
*/

//Ajax loader image
var AjaxLoader = function(options) {
	this.options = {
		loader: "#ajax_loader"
	};
	jQuery.extend(this.options, options);
	this.active_request_count = 0;
	this.loader = jQuery(this.options.loader);
};

AjaxLoader.prototype = {
	showLoader: function() {
		this.active_request_count++;
		this.loader.show();
	},
	
	hideLoader: function() {
		this.active_request_count--;
		if(this.active_request_count<=0) {
			this.loader.hide();
			this.active_request_count = 0;
		}
	}
};

var ImageTransition = function(first_image, images, options) {
	if(!images.length) {
		
	}
	this.options = {
		duration: 3,
		useDissolve: true,
		dissolveDuration: 0.2,
		crossDissolve: true,
		baseZIndex: 0
	};
	jQuery.extend(this.options, options);
	this.current_image_element = jQuery(first_image).css('z-index', this.options.baseZIndex+1);
	this.images = images;
	this.next_image_element = jQuery('<img/>').hide().css('z-index', this.options.baseZIndex).insertAfter(this.current_image_element).attr('src', this.images.shift());
	this.runner = null;
	if(!this.options.useDissolve) {
		this.options.dissolveDuration = 0;
	}
};

ImageTransition.prototype = {
	start: function() {
		if(this.runner !== null) {
			return;
		}
		this.runner = window.setInterval(this.tick.bind(this), (this.options.duration+this.options.dissolveDuration)*1000);
	},
	end: function() {
		if(this.runner === null) {
			return;
		}
		window.clearInterval(this.runner);
		this.runner = null;
	},
	toggle: function() {
		if(this.runner === null) {
			this.start();
		} else {
			this.end();
		}
	},
	tick: function() {
		//Swap display of current and next image
		this.current_image_element.css('z-index', this.options.baseZIndex);
		this.next_image_element.css('z-index', this.options.baseZIndex+1);
		if(this.options.useDissolve) {
			if(this.options.crossDissolve) {
				this.current_image_element.fadeOut(this.options.dissolveDuration*1000);
			}
			this.next_image_element.fadeIn(this.options.dissolveDuration*1000, this.tickCleanup.bind(this));
		} else {
			this.next_image_element.show();
			this.tickCleanup();
		}
	},
	tickCleanup: function() {
		//swap current and next image
		var temp = this.current_image_element;
		this.current_image_element = this.next_image_element;
		this.next_image_element = temp;
		//Load next image
		this.next_image_element.hide();
		this.images.push(this.next_image_element.attr('src'));
		this.next_image_element.attr('src', this.images.shift());
		this.current_image_element.trigger('transition:finished');
	}
};
