// Default 3.0.0
function email_output(user,domain,tld,text,get,tag){email=user+'@'+domain+'.'+tld;if(!text)text=email;if(tag)tag=' '+tag;document.write('<a href="mailto:'+email+get+'"'+tag+'>'+text+'</a>');}
function window_open(url,name,features){popup=window.open(url,name,features);popup.focus();}

// Add ECMA262-5 Array methods if not supported natively
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, i /*opt*/) {
        if (i===undefined) i= 0;
        if (i<0) i+= this.length;
        if (i<0) i= 0;
        for (var n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}

var $content, $article, $bg, $head_add = null;
var first_load = true;
var site_languages = ['de', 'it', 'en'];
var currentXhr = null;
var stretcher = null;

// init page
$(function() {
	// set main dom objects
	$content = $('#content');
	$article = $('#article');
	$bg = $('<div />').attr('id','bg').appendTo('body');

	// bg click - open gallery
	$bg.click(function() {
		var format = $content.data('format');
		if(format == 's') {
			var last = $content.data('lastformat');
			if(last) {
				animateToFormat(last);
				$content.data('lastformat', null);
			}	
		}
		else {
			$content.data('lastformat', format);
			animateToFormat('s');
			$('#bgnavi').show();
		}
	});

	// bg navigation
	$('#bgnavi LI').toggle(bg_images.length > 1);

	// resizing
	$(window).resize(function() {
		var h = $(this).height();
		$("#content").toggleClass('compact', h < 830);
		$("#content").toggleClass('squeeze', h < 720);
		$("#quickrequest FORM").toggle(h > 650);
		
		
		var $quick = $("#quickrequest");
		var space = h - $("#nav").height() + parseInt($quick.css("margin-top")) - $quick.height() - 120;
		var margin = space / 2;
		if(h < 650) margin = 0;
		$quick.css("margin-top", margin > 0 ? margin : 0);
		sizeSlogan();
	}).resize();
	
	// catch form submits
	$("FORM").live('submit', function(e) {
		var $form = $(this);
		if($form.find("input[name=noajax]").length > 0) return;
		e.preventDefault();
		var url = $form.attr('action');
		loadContent(url,$(this).serializeArray(), updateContent, $form.attr('method'));
	});
	
	// main menu
	$('#nav A').click(handleLinkClick);
		
	// hash changed event
	window.onhashchange = handleHashChanged;
	// init menu
	showMenu();
	// page closer
	createCloser();
	// setup content
	onContentLoad();
});

// get query parameter from query
function extractParameterFromPath(path, param) {
	if(typeof(path) == 'undefined' || path == null) return null;
	var pos = path.indexOf('?');
	if(pos == -1) return null;
	var pieces = path.slice(pos+1).split('&');
	for(i=0;i<pieces.length;i++) {
		var p = pieces[i].split('=');
		if(p[0] == param) return decodeURIComponent(p[1]);
	}
	return null;
}

// init Ajax Page
function initAjaxPage(noajaxpages) {
	// set correct hash
	$(function() {
		if(!noajaxpages || noajaxpages.indexOf(window.location.pathname) == -1)
		var current = getPath();
		if(current != null && current.path != '') return redirectToAjaxPath();
		if(window.location.hash != '') handleHashChanged();
		else initStretcher(bg_images);
	})
}
// redirect to ajax path
function redirectToAjaxPath(path) {
	if(!path) path = window.location.pathname;
	var ret = getPath(path);
	
	// invalid path, goto language root
	if(ret == null) ret = { 'lang' : site_languages[0], 'path' : ''};
	var hash = ret.path == '' ? '' : '#!' + ret.path;
	if(location.search) hash = hash + location.search;
	window.location = "/" + ret.lang + '/' + hash;
}
// check if we are on ajax path
function isOnAjaxPath() {
	var current = getPath();
	return current !=  null && current.path == '';
}
// get language, path from current path
function getPath(path) {
	if(!path) path = window.location.pathname;
	var res = (new RegExp('^/(' + site_languages.join('|') + ')/(.*)$')).exec(path);
	if (!res) return null;
	return { 'lang' : res[1], 'path' : res[2]};
}

// handle internal link
function handleLinkClick(e) {
	if($(this).is(".selected")) {
		var last = $content.data('lastformat');
		if(last && last != 's') {
			animateToFormat(last);
			$content.data('lastformat', null);
			e.preventDefault();
			return;
		}
	}
	
	// check if link must be not handled
	var url = $(this).attr("href");
	if(url.match(/^http:\/\/|javascript:;/)) return;
	if($(this).is(".lightbox") || $(this).is(".noajax")) return;
	
	e.preventDefault();
	if($(this).is(".selected") || url == '#') return; 
	$("#nav A.selected").removeClass("selected");

	// assert we are in ajax path
	if(!isOnAjaxPath()) return redirectToAjaxPath(url);

	// load page
	loadContent(url, {}, updateContent);
	
	// update menu if 
	$(this).addClass("selected");
	openMenu(url);
	
	// update canonical
	$('HEAD LINK[rel=canonical]').attr('href', window.location.href.replace('#!/', ''));
}

// set new hash for actual content
function setUrlHash(url) {
	window.onhashchange = null;
	$(location).attr("hash", url =='' ? '' : "!"+url);
	window.setTimeout(function() { window.onhashchange = handleHashChanged; }, 0);	
}

// load new content
function loadContent(url, params, callback, method) {
	// Set default method
	if (!method) method = 'GET';

	// remove language folder
	url = url.replace(new RegExp('^/(' + site_languages.join('|') + ')/'), '');

	// set new hash
	setUrlHash(url);	

	// abort current xhr
	if(currentXhr != null) currentXhr.abort();

	// Get data
	currentXhr = $.ajax({
		url: url,
		data : params,
		type : method,
		dataType: 'json',
		success: callback,
		error: function(data, textStatus, errorThrown ){
			// try to parse response (eg json 404 page)
			var response = null;
			try {
				response = jQuery.parseJSON(data.response);
			}
			catch(err) {
				response = {
					headline : 'Error',
					article : data.responseText,
					format : 'xl'
				};
			}
			currentXhr = null;

			// send back new content
			if(response) callback(response); 
		}
	});
}

// handle hash url
function handleHashChanged() {
	var h = window.location.hash;
	var url = '';

	// find page url
	if(h == '') url = '';
	else if (h.match(/^#!.+/)) url = h.substring(2);
	else return;

	// load page
	loadContent(url, {}, updateContent);
	openMenu(url);
}

// optional actions on new content
function onContentLoad() {
	$content.find('.slidebox:not(.open) dd').hide();
	$content.find('.slidebox dt').css('cursor', 'pointer').click(function(){
		$(this).next('dd').slideToggle('fast');
	});
}

// update page content
function updateContent(data) {
	// Track
	if(typeof(_gaq) != 'undefined' && data.analytics) _gaq.push(['_trackPageview', data.analytics]);
	
	// queue if animation runs
	$article.animate({}, 0, function () {
		// fade out and animate to new position
		animateToFormat(data.format, function() {
			sizeSlogan();
			// set content
			setData(data);
		});
	});
}

// dynamically add head elements
function addHead(markup) {
	// remove old head append
	if($head_add != null) {
		$head_add.remove();
		$head_add = null;
	}
	// no head?
	if(!markup) return;
	
	$head_add = $(markup);
	$("HEAD").append($head_add);
}

// set new content
function setData(data) {
	document.title = $('<div/>').html(data.headline).text();
	$('#special_content').remove();
	
	addHead(data.head);

	setSlogan(data.slogan);
	$article.empty().append($('<h1></h1>').html(data.headline)).append(data.article);
	$article.find('A').click(handleLinkClick);
	if(data.special) $('BODY').append($('<span/>').attr('id', 'special_content').append(data.special));
		
	onContentLoad();
	if(data.format != 's') createCloser();
	if(data.lang != null) setLanguageLinks(data.lang);
	if(data.images) setImages(data.images);
	if(data.path) checkMenuPath(data.path);	
}

// choose best menu item
function checkMenuPath(path) {
	jQuery.each(path, function(index, url) {
		if(openMenu(url)) return false;
	});
	// selected is active?
	$("#nav LI:not(.active) .selected").removeClass('selected');
}

// update language links
function setLanguageLinks(data) {
	var $cont = $("#switchlang").empty();
	var count = 0;
	jQuery.each(data, function(lang, href) {
		if(count++ > 0) $cont.append(document.createTextNode(" | "));
		var hash = href == '' ? '' : '#!' + href
		$cont.append($('<A/>').text(lang.toUpperCase()).attr("href", '/' + lang + '/' + hash));
	});
}

// init background stretcher
function initStretcher(bg_images) {
	stretcher = $bg.bgStretcher({
		images : bg_images,
		anchoringImg : "center center",
		imageWidth: 1400,
		imageHeight: 900,
		slideShowSpeed: 1200,
		nextSlideDelay: 5000,
		transitionEffect: 'fade',
		sequenceMode: 'normal',
		preloadImg: true,
		pagination: '#bgnavi',
		effectcallback : function () {
			var outdated = $bg.find('LI.outdated:not(:visible)');
			if(outdated.length > 0) {
				outdated.remove();
				$bg.bgStretcher.pagination();	
				
				if(document.keepbgnavi == 1) {
					document.keepbgnavi = 0;
					$("#bgnavi").fadeIn();
				}
			}
			// setup image infobox
			var src = $bg.find('.bgs-current img').attr('src');
			var desc = extractParameterFromPath(src,'_image_text');
			if(desc != null) $('#bgimage-infobox').text(desc).fadeIn();
		},
		preeffectcallback : function() {
			$('#bgimage-infobox').fadeOut();
		}
	});
}

// set new background images
function setImages(images) {
	if(stretcher == null) initStretcher(images);
	else {
		//$('#bgstretcher LI:not(:visible)').remove();
		// mark all others as outdated
		$bg.find("LI").addClass('outdated');
		// add new images
		jQuery.each(images, function(index, path) {
			var span = $("<span/>").addClass("image-path").text(path);
			var li = $("<li/>").css("display","none").append(span);
			if(index == 1) {
				var img = $('<img />').attr('src', path).load(function() {
					// keeps article fadein smooth
					window.setTimeout(function()  { $bg.bgStretcher.play(); }, 100);
				});
				li.append(img);
			}
			$bg.find("UL").append(li);
		});
		
		$("#bgnavi").fadeOut();
	}
}

// fade out article and animate to format
function animateToFormat(format, callback) {
	$("#bgnavi").hide();
	$article.animate({ 'opacity' : 0}, first_load ? 0 : 'fast', function() {
		$article.hide();
		$content.animate( { 'width' : article_sizes[format] }, first_load ? 0 : 'normal', 'swing', function () {
			 $content.data("format", format);
			 first_load = false;
			 if (typeof callback === 'function') callback();
			 if(format != 's') $article.show().animate({ 'opacity' : 1}, 'fast');
		});
	});	
}
// open menu item for specified url
function openMenu(url) {
	var mnulnk = $('#nav A[href="' + url + '"]');
	if(mnulnk.length == 0) return;
	
	$("#nav .active").removeClass("active");
	$(mnulnk).parentsUntil("#nav", "li").addClass("active");
	showMenu();
	return true;
}
// show/hide menu items
function showMenu() {
	$("#nav UL").each(function(index, element) {
		$(element).toggle($(element).parent("LI").is(".active"));
	});
	$(window).resize();
}

// set new slogan
function setSlogan(path) {
	var $slogan = $('#slogan');
	var src = $slogan.find('img').attr('src');
	// same slogan, do nothing
	if(('/' + path) == src) return;
	$slogan.remove();
	if(path != null) {
		$img = $('<img/>').attr('src', '/' + path).hide();
		$img.load(sizeSlogan);
		$slogan = $('<div/>').attr('id','slogan').append($img);
		$('body').append($slogan);
	}
}

// update slogan size
function sizeSlogan() {
	var $slogan = $("#slogan IMG");
	var w = $(window).width() - $('#content').width() -50;
	if(!$slogan.hasClass("measured")) {
		var size = [$slogan.width(), $slogan.height()];
		if(size[0] == 0 || size[1] == 0) return;
		$slogan.attr("data-orgw", size[0]).attr("data-orgh", size[1]).addClass("measured");			
	}
	var orgw = $slogan.attr("data-orgw");
	var orgh = $slogan.attr("data-orgh");
	if (w > orgw) {
		$slogan.css({
			'width' : orgw,
			'height' : orgh
		}).fadeIn("slow");
	}
	else if (w < 300) $slogan.fadeOut("slow");
	else {
		$slogan.css({
			'width' : w,
			'height' : w * orgh / orgw 
		}).fadeIn("slow");	
	}
}

// page closer button
function createCloser() {
	$article.append($("<div/>").addClass("article_closer").click(function() {
		$content.data('lastformat', $content.data('format'));
		animateToFormat('s');
		$("#nav A.selected").removeClass("selected");
		$('#bgnavi').show();
	}));
}


