var matrix;
var matrixOptions = {
	x : 0,
	y : 0,
	flipDuration : 0.5,
	fps : 25,
	contentHeightRatio : 0.618
};

var dim;

var lightboxOptions ={
	imageLoading: 'img/ajax-loader.gif',
	imageBtnClose: 'img/lightbox/lightbox-btn-close.png',
	imageBtnPrev: 'img/lightbox/lightbox-btn-prev.png',
	imageBtnNext: 'img/lightbox/lightbox-btn-next.png',
	imageBlank: 'img/lightbox/lightbox-blank.gif'
};
var lightboxImg = {};

var searchSroller, categorySroller, navScroller, detailScroller, newsScroller;

var twitterIcon;

var lastVisit;

var eventLock = false;

function textContent(node){
	if(!node){
		return '';
	}
	
   return $(node).text();
}

if(!String.prototype.htmlEscape){
	String.prototype.htmlEscape = function(){
		return this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
	}
}

var htmlEscape = function(s){
	if(typeof s != 'string'){
		return '';	
	}
	
	return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

if(!String.prototype.entityEscape){
	String.prototype.entityEscape = function(){
		return this.replace(/&/g, '&amp;');
	}
}

var entityEscape = function(s){
	if(typeof s != 'string'){
		return '';	
	}
	
	return s.replace(/&/g, '&amp;');
}

if(!String.prototype.uc){
	String.prototype.uc = function(){
		return this[0].toUpperCase() + this.substring(1).toLowerCase();
	}
}

var uc = function(s){
	if(typeof s != 'string'){
		return '';	
	}
	
	if(s.length === 0){
		return s;
	}
	
	return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();
}

if(!Array.prototype.map){
	Array.prototype.map = function(fun /*, thisp */){
		"use strict";
		
		if (this === void 0 || this === null){
			throw new TypeError();
		}
		
		var t = Object(this);
		var len = t.length >>> 0;
		
		if (typeof fun !== "function"){
			throw new TypeError();
		}
		
		var res = new Array(len);
		var thisp = arguments[1];
		
		for (var i = 0; i < len; i++){
			if (i in t){
				res[i] = fun.call(thisp, t[i], i, t);
			}
		}
		
		return res;
	};
}

var map = function(array, fun /*, thisp */){
	"use strict";
	
	if (array === void 0 || array === null){
		throw new TypeError();
	}
	
	var t = Object(array);
	var len = t.length >>> 0;
	
	if (typeof fun !== "function"){
		throw new TypeError();
	}
	
	var res = new Array(len);
	var thisp = arguments[2];
	
	for (var i = 0; i < len; i++){
		if (i in t){
			res[i] = fun.call(thisp, t[i], i, t);
		}
	}
	
	return res;
};

function _GET(){
	var vars = {}, hash;
	var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
	for(var i = 0; i < hashes.length; i++){
		hash = hashes[i].split('=');
		vars[decodeURIComponent(hash[0])] = decodeURIComponent(hash[1]);
	}
	return vars;
}

function setDetails(data, textStatus, XMLHttpRequest){
	clearDetails()
	var companies = data.getElementsByTagName('company');
	var id = data.getElementsByTagName('root')[0].getAttribute('id');
	
	var nav = $('#content .nav #nav_scroller');
	var detail = $('#detail #detail_scroller');
	
	var ul = $('<ul></ul>');
	nav.append(ul);
	
	var offset = 0;
	for(var i = 0, len = companies.length; i<len; ++i){
		try{
			var company = companies.item(i);
			var title = textContent(company.getElementsByTagName('titel').item(0));
			
			if(title == undefined){
				title = company.getElementsByTagName('titel').item(0).firstChild.nodeValue;
			}
			var li = $('<li>'+htmlEscape(title)+'</li>');
			
			li.click(getNavClickCallback(i, detail, nav));
			ul.append(li);
			
			detail.append(parseCompany(company));
		} catch(e){
			log('Error: '+i+' '+e)
		}
	}
	
	addAbstract(id);
	loadVideos($('#content'));
	
	$('.flex > img').hide();
	$('#content .nav').removeClass('visible').addClass('visible');
}

function errorDetails(id){
	return function(){
		var nav = $('#content .nav #nav_scroller');
		var ul = $('<ul></ul>');
		nav.append(ul);
		
		addAbstract(id)
		
		$('.flex > img').hide();
		$('#content nav').removeClass('visible').addClass('visible');
	}
}

function addAbstract(id){
	var nav = $('#content .nav #nav_scroller');
	var detail = $('#detail #detail_scroller');
	var ul = nav.find('ul').eq(0);
	var abst = '';
	
	for(var i in matrixData){
		if(matrixData[i].data.id === parseInt(id)){
			abst = matrixData[i].data.abstract;
			break;
		}
	}
	
	if(abst === ''){
		return;
	}
	
	var li = $('<li class="active">Wiki IPVEA</li>');
	li.click(getNavClickCallback(0, detail, nav));
	ul.prepend(li);
	
	var a = $('<div class="article abstract"><div class="section">'+abst+'</div></div>');
	
	a.find('p').addClass('detail');
	
	detail.prepend(a);
}

function clearDetails(){	
	var nav = $('#content .nav #nav_scroller');
	nav.empty();
	
	var companies = $('#content .article');
	companies.remove();
}

function parseCompany(company){	
	var data = {};
	
	var temp = company.getElementsByTagName('titel');
	if(temp.length > 0){
		data.title = htmlEscape(textContent(temp[0]));
	}
	
	temp = company.getElementsByTagName('about');
	if(temp.length > 0){
		data.catURL = temp[0].getAttribute('url');
		
		if(!data.catURL.match(/^http/)){
			data.catURL = 'http://'+data.catURL;
		}
	}
	
	var parts = ['profile', 'about', 'url', 'logo', 'email', 'phone', 'mobile', 'fax', 'address'];
	for(var i = 0; i<parts.length; ++i){
		temp = company.getElementsByTagName(parts[i]);
		if(temp.length > 0){
			data[parts[i]] = textContent(temp[0]);
		} else {
			data[parts[i]] = '';
		}
	}
	
	data.profile = transformNewlines(data.profile);
	
	data.files = company.getElementsByTagName('file');
	data.images = company.getElementsByTagName('image');
	data.videos = company.getElementsByTagName('video');
	
	return applyCompanyTemplate(data);
}

function transformNewlines(text){
	//var repl = text.replace(/<br \/>[+*-]([^<]+)/g, '<li>$1</li>');
	//repl = repl.replace(/<br ?\/>([^<]+)<br ?\/><br ?\/>/g, '<p>$1</p>');
	//repl = repl.replace(/([^\?!\.])<br ?\/>/g, '$1 ');
	//repl = repl.replace(/^([^<]+)<br ?\/>/, '<p>$1</p>');
	//repl = repl.replace(/([^>]+)(<br ?\/>)?\s*$/, '<p>$1</p>');
	
	//return text.replace(/<br \/>[+*-]([^<]+)/g, '<li>$1</li>').replace(/<br ?\/>([^<]+)<br ?\/><br ?\/>/g, '<p>$1</p>').replace(/([^\?!\.])<br ?\/?>/g, '$1 ').replace(/^([^<]+)<br ?\/>/, '<p>$1</p>').replace(/([^>]+)(<br ?\/>)?\s*$/, '<p>$1</p>');
	return text;
}

function shorten(string, length){
	if(string.length > length){
		return string.substr(0, length)+'...';
	} else {
		return string;
	}
}

function transformAddress(text){
	return text.replace(/[\/,;\n]/g, '<br />');
}

function getCurrentCategory(){
	return $('#inner .header h1').text();
}

function applyCompanyTemplate(data){
	var company = $('#company_detail_template').clone();
	company.removeAttr('id');
	company.addClass('company');
	
	company.find('.profile h1').append(data.title);
	
	var profile = data.profile;
	
	if(data.about){
		profile += '<h3>'+data.title+' about '+getCurrentCategory()+'</h3>'+
		'<p>'+data.about+'</p>';
		
		if(data.catURL){
			profile += '<p><strong>Further Information:</strong> <a href="'+data.catURL+'" target="_blank">'+shorten(data.catURL, 50)+'</a></p>';
		}
	}
	
	company.find('.profile div').append(profile);
	
	var contact = '<div class="detail">'+
	'<div class="figure">'+
	'<img src="'+config.baseUrl+data.logo+'" alt="Logo" />'+
	'<div class="figcaption">'+
	'<a href="'+data.url+'">'+data.url+'</a>'+
	'</div>'+
	'</div>'+
	'<dl>';
	
	map(['phone', 'mobile', 'fax', 'address', 'email'], function(element, index){
		if(data[element]){
			var dd = data[element];
			
			if(element == 'email'){
				dd = '<a href="mailto:'+dd+'">'+dd+'</a>';
			} else if(element == 'address'){
				dd = transformAddress(dd);
			}
			
			contact += '<dt class="'+element+'">'+uc(element)+'</dt>';
			contact += '<dd>'+dd.entityEscape()+'</dd>';
		}
	});
	
	contact += '</dl><div class="clear invisible"></div>'+
	'</div>';
	company.find('.contact').append(contact);
	
	applyImageTemplate(data.images, 'Images', company.find('.images'), true);
	applyImageTemplate(data.files, 'Files', company.find('.files'));
	applyVideoTemplate(data.videos, 'Videos', company.find('.videos'));
	
	return company;
}

function applyMediaTemplate(content, title, parent, useLightbox){
	var media = '<h2>'+title+'</h2><div class="detail">';
	
	media += content;
	
	media += '<div class="clear invisible"></div></div>';
	
	parent.append(media);
	
	parent.find('.figure > a > img:first-child').load(function(){
		this.parentNode.lastChild.style.display = 'none';
		this.style.display = 'inline';
	});
	
	if(useLightbox){
		parent.find('.lightbox').lightBox(lightboxOptions);
	}
}

function applyImageTemplate(data, title, parent, useLightbox){
	if(data.length > 0){
		var media = '';
		var categoryHeader = '';
		
		for(var i = 0, j = 1, len = data.length; i<len; ++i, ++j){
			var file = data[i];
			
			var link = config.baseUrl+textContent(file);
			thumb = config.baseUrl + file.getAttribute('thumb');
			
			if(!useLightbox){
				thumb = 'img/thumb.php?image='+encodeURIComponent(link)+'&x=132';
			}
			
			//if(useLightbox){
			//	link = 'img/thumb.php?image='+encodeURIComponent(link)+'&x='+lightboxImg.x+'&y='+lightboxImg.y;
			//}
			
			link = htmlEscape(link);
			thumb = htmlEscape(thumb);
			
			var imgTitle = '';
			if(file.getAttribute('title')){
				imgTitle = 'title="'+htmlEscape(file.getAttribute('title'))+'"';
			}
			
			if(file.getAttribute('category') && categoryHeader === ''){
				categoryHeader = '<h3>'+title+' about '+getCurrentCategory()+'</h3>';
				j = 1;
				media += categoryHeader;
			}
			
			media += '<div class="figure'+(j%4?'':' fourth')+'"><a href="'+link+'" target="_blank" class="lightbox gradient">'+
			'<img alt="'+textContent(file)+'" src="'+thumb+'" '+imgTitle+'/>'+
			'<img alt="loader" src="img/ajax-loader.gif" />'+
			'</a>';
			
			if(file.getAttribute('title')){
				var pdf = '';
				if(textContent(file).match(/\.pdf$/)){
					pdf += 'class="file pdf"';
				}
				
				var t = file.getAttribute('title');
				
				media += '<div class="figcaption" '+pdf+' title="'+htmlEscape(t)+'">'+
				'<a href="'+link+'" target="_blank">';
				
				media += htmlEscape(t) + '</a></div>';
			}
			
			media += '</div>';
		}
		
		applyMediaTemplate(media, title, parent, useLightbox);
	}
}

function applyVideoTemplate(data, title, parent){
	if(data.length > 0){
		var media = '';
		var categoryHeader = '';
		
		for(var i = 0, j = 1, len = data.length; i<len; ++i, ++j){
			var video = data[i];
			var videoid = video.getAttribute('youtube');
			
			if(video.getAttribute('category') && categoryHeader === ''){
				categoryHeader = '<h3>'+title+' about '+getCurrentCategory()+'</h3>';
				media += categoryHeader;
				j = 1;
			}
			
			if(videoid !== ''){
				media += '<div class="figure'+(j%4?'':' fourth')+'"><div class="gradient youtube-player-container" id="'+videoid+'">'+
				'<div style="background-image:url(http://img.youtube.com/vi/'+videoid+'/0.jpg);">Watch this video</div>'+
				//'<iframe type="text/html" class="youtube-player" width="640" height="510" frameborder="0" allowfullscreen="allowfullscreen"></iframe>'+
				'</div></div>';
			}
		}
		
		if(media !== ''){
			applyMediaTemplate(media, title, parent, false);
		}
	}
}

function loadVideos($parent){
	$parent.find('.youtube-player-container').click(function(){
		$('#video-overlay, #video-lightbox').fadeIn('fast');
		$('#video-iframe').get(0).src = 'http://www.youtube.com/embed/'+this.id+'?enablejsapi=1&amp;origin=matrix.ipvea.org';
	});
}

function getNavClickCallback(i, article, nav){
	return function(event){
		var li = nav.find('li');
		li.removeClass('active');
		
		$(this).addClass('active');
		i = $(this).prevAll().length;
		
		article.children().hide();
		article.children().eq(i).show();
		$('#content nav').removeClass('visible');
		//detailScroller.refresh();
	}
}

function navigateToX(x, easing, maxX){
	if(matrix){
		return matrix.goToX(x, easing);
	} else {
		x /= maxX;
		
		x = x * (998-26) + 26;
		
		getScrollAmount(x);
		
		return undefined;
	}
}

function navigateTo(i, easing, afteranimation){
	if(matrix){
		matrix.goTo(i, easing).afterNextAnimation = afteranimation;
	} else {
		var c = (i*7)+94;
		
		getScrollAmount(c);
		
		if(typeof afteranimation == 'function'){
			afteranimation();
		}
	}
}

function updateNews(data, textStatus, XMLHttpRequest){
	var news = $('#news_content #news_scroller');
	news.empty();
	news.parent().data('page', 1);
	
	var tweets = data.getElementsByTagName('status');
	
	var newTweets = addNewsTweets(tweets, news);
	
	$('#new_count').text(newTweets);
	
	if(newTweets > 0){
		$('#new_count').show();
	} else {
		$('#new_count').hide();
	}
	
	//newsScroller.refresh();
	
	updateLastVisit();
	loadLastVisit();
}

function moreNews(data, textStatus, XMLHttpRequest){
	var news = $('#news_content #news_scroller');
	news.parent().data('page', news.parent().data('page')+1);
	
	var tweets = data.getElementsByTagName('status');
	
	addNewsTweets(tweets, news);
}

function getMoreNews(){
	var params = [
		'xdomain='+encodeURIComponent('http://twitter.com/statuses/user_timeline/'+config.twitterId+'.xml'),
		'page='+($('#news_content').data('page')+1)
	];
	
	var url = 'lib/xdomain.php?'+params.join('&');
	
	$.ajax({
		url : url,
		success : moreNews,
		dataType: 'xml'
	});
}

function addNewsTweets(tweets, news){
	var c = 0;
	
	for(var i = 0,len = tweets.length; i<len; ++i){
		var tweet = tweets[i];
		var date = textContent(tweet.getElementsByTagName('created_at')[0]);
		
		date = Date.parse(date);
		if(lastVisit === null || date > lastVisit){
			++c;
		}
		
		var text = parseTwitterMessage(tweet);
		
		var n = getSearchTip(text, twitterIcon.cloneNode(true), null);
		news.append(n);
	}
	
	return c;
}

function parseTwitterMessage(tweet){
	var text = htmlEscape(textContent(tweet.getElementsByTagName('text')[0]));
	var date = textContent(tweet.getElementsByTagName('created_at')[0]);
	var source = textContent(tweet.getElementsByTagName('source')[0]);
	
	date = new Date(Date.parse(date));
	
	text = text.replace(/(https?:\/\/([-\w\.]+)+(d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/g, '<div class="link"><a href="$1" target="_blank">$1</a></div>');
	text = text.replace(/(^|[\n ])@([^ "\t\n\r<]*)/ig, '$1<a href="http://www.twitter.com/$2"  target="_blank">@$2</a>');  
	text = text.replace(/(^|[\n ])#([^ "\t\n\r<]*)/ig, '$1<a href="http://hashtags.org/search?query=$2" target="_blank">#$2</a>');
	
	text += '<div><div class="author">';
	text += '<div class="name">Bryan Ekus</div>';
	text += ' via ';
	text += '<div class="source">'+source+'</div>';
	text += '<div class="date">'+date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate();
	text += ' '+date.getHours()+':'+date.getSeconds()+'</div>';
	
	text += '</div></div>';
	
	return text;
}

function toggleNews(openCallback, closeCallback){
	if($('#news_content').hasClass('visible')){
		closeNews(closeCallback);
	} else {
		openNews(openCallback);
	}
}

function openNews(callback){
	$('#news_content, #news .button').removeClass('visible').addClass('visible');
	$('#news_content').slideDown('fast', function(){
		//newsScroller.refresh();
		if(typeof callback == "function"){
			callback();
		}
	});
}

function closeNews(callback){
	$('#news_content, #news .button').removeClass('visible');
	$('#news_content').slideUp('fast', function(){
		//newsScroller.refresh();
		if(typeof callback == "function"){
			callback();
		}
	});
}

function findCategories(query){
	var foundInd = [];
	
	for(var i = 0,len = matrixData.length; i<len; ++i){
		if(matrixData[i].text.match(new RegExp(query, 'i'))){
			foundInd.push(i);
		}
	}
	
	return foundInd;
}

function findCategoriesByIds(ids){
	var foundInd = [];
	
	if(typeof ids == 'number'){
		ids = [ids];
	}
	
	for(var i = 0,len = matrixData.length; i<len; ++i){
		for(var j = 0,lenj = ids.length; j<lenj; ++j){
			if(matrixData[i].data.id == ids[j]){
				foundInd.push(i);
			}
		}
	}
	
	return foundInd;
}

function updateSearchTip(query){
	var search_tip = $('#search_tip #search_scroller');
	var search_cat = search_tip.find('#search_category');
	var tips = findCategories(query);
	search_cat.empty();
	
	for(var i = 0,len = tips.length; i<len; ++i){
		search_cat.append(getCategorySearchTip(tips[i]));
	}
	
	var params = [
		'xdomain='+encodeURIComponent(config.baseUrl+'index.php'),
		'type=368',
		'search='+encodeURIComponent(query)
	];
	var url = 'lib/xdomain.php?'+params.join('&');
	
	$.ajax({
		url : url,
		success : addCompanySearchTips,
		dataType: 'xml'
	});
	
	if(tips.length > 0){
		search_tip.parent().removeClass('visible').addClass('visible');
		$('#tip_container').removeClass('visible').addClass('visible');
		$('#search_tip').removeClass('visible').addClass('visible');
	} else {
		search_tip.parent().removeClass('visible');
		$('#tip_container').removeClass('visible');
		$('#search_tip').removeClass('visible');
	}
	
	$('#category_scroller').removeClass('visible');
	
	//searchSroller.refresh();
}

function addCompanySearchTips(data, textStatus, XMLHttpRequest){
	var search_tip = $('#search_tip #search_scroller');
	var search_comp = search_tip.find('#search_company');
	search_comp.empty();
	
	var companies = data.getElementsByTagName('company');
	
	for(var i = 0,len = companies.length; i<len; ++i){
		var company = companies[i];
		var categories = company.getElementsByTagName('category');
		
		if(categories.length > 0){
			var title = company.getAttribute('title');
			
			var icon = company.getElementsByTagName('logo');
			var src = 'img/lightbox/lightbox-blank.gif';
			if(icon.length > 0){
				src = config.baseUrl+textContent(icon[0]);
			}
			icon = new Image();
			icon.src = src;
			
			var callback = getCompanySearchTipCallback(categories, title);
			
			var tip = getSearchTip(title, icon, callback);
			
			search_comp.append(tip);
		}
	}
	
	if(companies.length > 0){
		search_tip.parent().removeClass('visible').addClass('visible');
		$('#tip_container').removeClass('visible').addClass('visible');
		$('#search_tip').removeClass('visible').addClass('visible');
	}
	
	//searchSroller.refresh();
}

function getCompanySearchTipCallback(categories, company){
	var categoryTip = $('#category_scroller');
	
	return function(e){
		categoryTip.empty();
		
		var catIds = [];
		
		for(var i = 0,len = categories.length; i<len; ++i){
			catIds.push(parseInt(categories[i].getAttribute('id')));
		}
		
		var catIndex = findCategoriesByIds(catIds);
		
		categoryTip.parent().prev().text(company)
		
		for(var i = 0,len = catIndex.length; i<len; ++i){
			categoryTip.append(getCategorySearchTip(catIndex[i], company));
		}
		
		categoryTip.parent().parent().removeClass('visible').addClass('visible');
		//categorySroller.refresh();
		
		$(this).parent().parent().find('.tip').removeClass('selected');
		$(this).addClass('selected');
	}
}

function getCategorySearchTip(i, selectedCompany){
	return getSearchTip(matrixData[i].text, 'c'+matrixData[i].color.substr(1), getCategorySearchTipCallback(i, selectedCompany));
}

function getSearchTip(text, icon, callback){
	var tip = $('#tip_template').clone();
	
	tip.removeAttr('id').addClass('tip');
	var t = tip.find('.text')[0];
	t.innerHTML = htmlEscape(text);
	
	if(typeof icon == 'string'){
		tip.find('.icon').addClass(icon);
	} else {
		var tipIcon = tip.find('.icon');
		tipIcon.children().remove();
		tipIcon.append(icon);
	}
	
	tip.bind('click', callback);
	
	return tip;
}

function openCategory(i){
	if(matrix && !$(document.body).hasClass('ie9')){
		matrix.open(i);
	} else {
		i = parseInt(i);
		$("#container").slideDown("fast");
	}
}

function getCategorySearchTipCallback(i, selectedCompany){
	return function(e){
		loadData(matrixData[i]);
		
		navigateTo(i, 'exp', function(){
			openCategory(i);
		});
		
		$('#content').data('company', selectedCompany);
		
		$(this).parent().parent().find('.tip').removeClass('selected');
		$(this).addClass('selected');
		
		closeLists('all');
	}
}

function closeLists(what){
	switch(what){
		case 'all': $('#news_content').removeClass('visible');
		case 'search':
			$('#search_tip').removeClass('visible');
			$('#category_tip').removeClass('visible');
			$('#tip_container').removeClass('visible');
			break;
	}
}

function loadData(block, callback){
	var content = $('#content');
	var header = content.find('.header');
	header.css({
		backgroundColor : block.color
	});
	header.find('h1').text(block.text);
	
	var params = [
		'xdomain='+encodeURIComponent(config.baseUrl+'index.php'),
		'type=367',
		'category='+block.data.id
	];
	var url = 'lib/xdomain.php?'+params.join('&');
	
	$(document.body).addClass(block.color.replace('#', 'c'));
	
	$.ajax({
		url : url,
		success : function(data, textStatus, XMLHttpRequest){
			setDetails(data, textStatus, XMLHttpRequest);
			callback(data, textStatus, XMLHttpRequest);
		},
		beforeSend: clearDetails,
		error: errorDetails(block.data.id),
		dataType: 'xml'
	});
}

function animateBlock(block, x){
	if(matrix){
		matrix.animateBlock(block, x);
	} else {
		// TODO
	}
}

function click_dock_item(e){
	var id = $(this).attr("data-id")
	var content = $('#content');
	
	var index = findCategoriesByIds(parseInt(id));
	
	if(!index.length){
		return;
	} else {
		index = index[0];
	}
	
	loadData(matrixData[index], function(){
		var comp = content.data('company');
		
		if(comp){
			content.find('.nav li').each(function(){
				if(textContent(this) == comp){
					$(this).click();
				}
			});
		}
		
		content.data('company', null);
	});
	
	openCategory(id);
}

function init(){
	//initStorage();
	initStyle();
	initSearch();
	
	var intervall = 50;
	
	if($(document.body).hasClass('ielt9')){
		intervall = 100;
	}
	
	setInterval(function(){
		eventLock = true;
	}, intervall);
	
	// Debug
	//Modernizr.canvas = null;
	//$(document.body).addClass('no-canvas');
	// Debug end
	
	if(!Modernizr.canvas){
		initContentEvents('fast');
		initFallback();
		initNavigation();
	} else {
		matrix = initMatrix();
	
		var speed = matrix.flipDuration*1000;
		
		initMatrixEvents(matrix, speed);
		initContentEvents(speed);
		initNavigation(matrix);
		//initIScroll();
		//initNews();
		
		matrix.start();
	}
	
	//initDebug();
}

var _fallbackLoaded = 0;
function fallbackLoaded(){
	_fallbackLoaded++;
	
	return function(){
		if(--_fallbackLoaded === 0){
			$('#loader .loading').hide();
			$('#loader .loaded').show();
		}
	}
}

function initFallback(){
	var $fallback = $('#fallback');
	var $dock = $('#dock');
	var link, image;
	
	for(var i = 0,len = matrixData.length; i<len; ++i){
		var id = matrixData[i].data.id;
		var color = matrixData[i].color.substr(1);
		var open = '';
		var children = matrixData[i].data.children;
		
		if(children == 0){
			open = 'open';
		}
		
		var title = matrixData[i].text;
		var deepness = matrixData[i].level;
		var background_image = 'background-image: url(img/'+color+open+'.png);';
		var padding = deepness*30;
		var ratio = 9 - (deepness*2);
		var urlEncodeTitle = encodeURIComponent(title);
		
		image = new Image();
		$(image).load(fallbackLoaded());
		image.setAttribute('alt', title);
		image.setAttribute('title', title);
		image.setAttribute('data-margin', padding);
		image.style.marginTop = padding+'px';
		image.width = 192;
		image.height = image.width;
		image.src = 'img/image.php?color='+color+open+'&text='+urlEncodeTitle;
		//'" style="margin-top:'+padding+'px;" data-margin="'+padding+'" title="'+title
		link = $('<a href="#" class="dock-item" data-id="'+id+'" '+(children? '': 'data-open="true"')+'></a>');
		
		link.append(image);
		
		$dock.append(link);
	}
	
	var sizeDockContainer = matrixData.length * 232;
	$dock.width(sizeDockContainer);
	
	$(".dock-item[data-open]").click(click_dock_item);
	
	//$fallback.show();
	//$('#canvas').hide();
}

function initNews(){
	twitterIcon = new Image()
	twitterIcon.src = 'img/twitter.png';
	
	var params = [
		'xdomain='+encodeURIComponent('http://twitter.com/statuses/user_timeline/'+config.twitterId+'.xml'),
	];
	
	var url = 'lib/xdomain.php?'+params.join('&');
	
	var update = function(){
		$.ajax({
			url : url,
			success : updateNews,
			dataType: 'xml'
		});
		log('update twitter');
	}
	
	update();
	
	setInterval(update, 5*60*1000);
	
	closeNews();
	
	$('#news .button.news').click(function(){
		toggleNews();
	});
}

function updateLastVisit(){
	localStorage.setItem('lastVisit', new Date().getTime());
}

function loadLastVisit(){
	lastVisit = localStorage.getItem('lastVisit');
}

function initStorage(){
	loadLastVisit();
	updateLastVisit();
}

function initDebug(){
	document.getElementById('debug_nav').innerHTML = 'Move to:'+
	'<input type="text" id="nav_input" />'+
	'<select id="type">'+
	'<option>index</option>'+
	'<option>px</option>'+
	'</select>'+
	'<select id="ease">'+
	'<option>exp</option>'+
	'<option>linear</option>'+
	'</select>'+
	'<input type="button" id="go" value="Go!" />';
	
	document.getElementById('go').addEventListener('click', function(){
		var ease = $('#ease').val();
		var type = $('#type').val();
		var nav_input = $('#nav_input').val();
		
		switch(type){
			case 'index': navigateTo(nav_input, ease); break;
			case 'px': navigateToX(nav_input, ease); break;
		}
	}, false);
}

function initSearch(){
	var search = $('#search input');
	var form = search.parent();
	
	var sform = function(e){
		var query = $('input[name=search]').val();
		
		if(query.length > 2){;
			updateSearchTip(query);
		} else {
			closeLists('search');
		}
		
		return false;
	}
	
	search.bind('keyup', sform);
	form.bind('submit', function(){ search.blur(); return sform(); });
}

function getEventX(event){
	var eventX = 0;
	
	if(event.type == 'touchmove'){
		if(event.targetTouches){
			eventX = event.targetTouches[0].clientX;
		} else if(event.originalEvent.targetTouches){
			eventX = event.originalEvent.targetTouches[0].clientX;
		} else {
			eventX = event.clientX;
		}
	} else {
		eventX = event.clientX;
	}
	
	var offset = 0;
	
	for(var i = event.currentTarget; i != null; i = i.offsetParent){
		if(typeof i.offsetLeft == 'number')
			offset += i.offsetLeft;
	}
	
	return eventX - offset;
}

function initNavigation(m){
	//if(m){
	var nav = $('#nav_marker');
	
	var nav_event = function(event){
		//alert('lock: '+eventLock+'; event: '+event.type);
		
		if(eventLock){
			eventLock = false;
			var navMax = nav.parent().width() - nav.width();
			var eventX = getEventX(event);
			event.preventDefault();
			event.stopPropagation();
			
			$('#matrix_nav .rail.bottom').fadeOut('fast', function(){ $('#matrix_nav .rail.bottom img').remove(); });
			
			switch(event.type){
				case 'mousedown': case 'touchstart':
					nav.data('moving', 1);
				break;
				case 'mouseup': case 'touchend':
				case 'mouseleave':
					var moving = nav.data('moving');
					
					nav.data('moving', 0);
				break;
				case 'mousemove': case 'touchmove':
					if(nav.data('moving') > 0 ){
						navigateToX(eventX, null, navMax);
						
						var left = eventX - nav.width()/2;
						left = Math.max(Math.min(left, navMax), 0);
						
						nav.css('left', (left)+'px');
					}
				break;
				case 'click':
					navigateToX(eventX, null, navMax);
					
					if(!m){
						var left = eventX - nav.width()/2;
						left = Math.max(Math.min(left, navMax), 0);
						nav.css('left', (left)+'px');
					}
				break;
			}
		}
	}
	
	nav.bind('mousedown', nav_event).bind('mouseup', nav_event).bind('touchend', nav_event).bind('touchstart', nav_event);
	nav.parent().bind('mousemove', nav_event).click(nav_event).bind('mouseleave', nav_event).bind('touchmove', nav_event);
	
	//var click = function(event){
	//	var block = m.blockAtNav(this.offsetParent.offsetLeft + this.offsetParent.offsetWidth/2 + 5);
	//	closeNews();
	//	m.open(block);
	//}
	
	//$('#marker_click_area').click(click);
	//$('#nav_marker .svg_container').click(click);
	
	if(m){
		m.onmove = function(event){
			if(nav.data('moving') !== 1){
				pos = event.x - nav.width()/2 - 5;
				pos = Math.max(Math.min(pos, nav.parent().width() - nav.width()), 0);
				nav.css('left', pos+'px');
			}
		}
	}
	//} else {
	//	$('#matrix_nav').hide();
	//	$('#slider-1').show();
	//	
	//	var s = new Slider(document.getElementById("slider-1"), document.getElementById("slider-input-1"));
	//	s.setMinimum(26);
	//	s.setMaximum(998);
	//	s.setValue(26);
	//	getScrollAmount(s.getValue());
	//	s.onchange = function(e){
	//		if(eventLock){
	//			eventLock = false;
	//			$("#container").slideUp("fast");
	//			closeLists('all');
	//			getScrollAmount(s.getValue());
	//			//scrollToElement($(".dock-item").attr("dock-id", 154), '400ms');
	//			
	//			$('#matrix_nav .rail.bottom').fadeOut('fast', function(){ $('#matrix_nav .rail.bottom img').remove(); });
	//		}
	//	}
	//	
	//	window.onresize = function () {
	//		s.recalculate();
	//	};
	//}
}

function initStyle(){
	var content = $('#content');
	var container = $('#container');
	var close = $('#inner .close');
	var nav = $('#nav_marker');
	var allWrap = $('#allwrap');
	
	//container.width(allWrap.width());
	content.height(container.height()-10);
	var docWidth = $(document.body).width();
	var docHeight = $(document.body).height();
	
	dim = Math.ceil(docWidth*0.69*0.96*0.19-8);
	lightboxImg.x = Math.min(docWidth - 60, 1000);
	lightboxImg.y = Math.min(docHeight - 150, 600);

	/*
	var news = {
		height : $('#news').height()*0.8,
		mTop : $('#news').height()*0.2
	};
	
	var searchField = {
		height : $('#search').height()
	};
	
	var svgRatio = 597/781;
	
	var svg_container = {
		top : $('.svg_container.top').width()*svgRatio,
		bottom : $('.svg_container.bottom').width()*svgRatio
	}
	
	var new_count = {
		hw : news.height/2
	}
	
	var css = document.createElement('style');
	css.setAttribute('type', 'text/css');
	css.innerHTML = '#content .media figure {'+
	'max-height: '+(dim+38)+'px;'+
	'min-height: '+(dim)+'px;'+
	'width: '+dim+'px;'+
	'line-height: '+(dim-4)+'px;'+
	'}'+
	'#content .media figure > *:first-child {'+
	'height: '+dim+'px;'+
	'width: '+dim+'px;'+
	'line-height: '+(dim-4)+'px;'+
	'}'+
	'#news .button {'+
	'height: '+news.height+'px;'+
	'line-height: '+news.height+'px;'+
	'margin-bottom: '+news.mTop+'px;'+
	'}'+
	'#new_count {'+
	'top: '+(-new_count.hw/2)+'px;'+
	'right: '+(-new_count.hw/2)+'px;'+
	'}'+
	'#loader {'+
	'height: '+(document.height || 1000)+'px;'+
	'}';
	*/
	//document.getElementsByTagName('head')[0].appendChild(css);
}

function initContentEvents(speed){
	var content = $('#content');
	var container = $('#container');
	var close = $('#inner .close');
	
	$('#video-secNav-btnClose').click(function(e){
		$('#video-overlay, #video-lightbox').fadeOut('fast');
		$('#video-iframe').get(0).src = 'about:blank';
		e.preventDefault();
	})
	
	close.click(function(e){
		var scaleX, scaleY, x, y, block, origin;
		
		if(matrix){
			if(!$(document.body).hasClass('ie9')){
				scaleX = content.data('scaleX');
				scaleY = content.data('scaleY');
				x = content.data('x');
				y = content.data('y');
				origin = content.data('origin');
				block = content.data('block');
				
				content.animate({
					scale : [scaleX, scaleY],
					translate : [x, y],
					origin : origin
				}, speed, 'linear', function(){
					container.fadeOut(speed, function(){
						animateBlock(block, true);
					});
				}).toggleClass('zoom');
			} else {
				container.slideUp(speed);
				animateBlock(block, true);
			}
			
			$(document.body).attr('class', '');
			
			matrix.unlock();
		} else {
			container.slideUp(speed);
		}
		
		$('.flex > img').show();
	});
	
	content.find('.header h1').click(function(e){
		content.find('.nav').toggleClass('visible');
		if(document.body.clientWidth < 500){
			content.find('.article').hide();
		}
	});
	
	$('#loader .loaded').click(function(){
		$('#loader').hide();
	});
	
	$('#old_ie_warning .close').click(function(){
		$(this).parent().hide().next().show();
	});
}

function initMatrixEvents(m, speed){
	var content = $('#content');
	var container = $('#container');
	
	m.onload = function(){
		var target = null;
		var get = _GET();
		var initialPos = /*Math.floor(matrixData.length/2);*/ 35;
		
		$('#loader .loading').hide();
		$('#loader .loaded').show();
		
		if(get.cat){
			var result = findCategories(get.cat);
			
			if(result.length == 0){
				result = findCategoriesByIds(parseInt(get.cat));
			}
			
			if(result.length > 0){
				target = result[0];
			}
		}
		
		if(lastVisit === null){
			m.goTo(m.data.length-1, 'linear').afterNextAnimation = function(){
				if(target === null){
					m.goTo(initialPos)
				} else {
					m.goTo(target).afterNextAnimation = function(){
						m.open(target)
					}//.afterNextAnimation = openNews;
				}
			};
		} else {
			if(target === null){
				m.goTo(initialPos)
			} else {
				m.goTo(target).afterNextAnimation = function(){
					m.open(target)
				}//.afterNextAnimation = openNews;
			}
		}
	}
	
	$('#news .button.dev').click(function(){
		closeNews(function(){
			m.goTo(0).afterNextAnimation = function(){
				m.goTo(m.data.length-1, 'linear').afterNextAnimation = function(){
					m.goTo(0)//.afterNextAnimation = openNews;
				};
			}
		});
	});
	
	m.onclick = function(event, block){
		if(block){
			loadData(block);
		}
	}
	
	m.onflipend = function(event, block){
		var scaleX, scaleY, x, y, origin;
		
		if(event.reverse){
			m.refresh();
			return;
		}
		
		if(!$(document.body).hasClass('ie9')){
			scaleX = block.width / content.width();
			scaleY = block.height / content.height();
			x = block.x + m.getLeft() + m.x;
			y = block.y + m.y;
			
			log('block.y: '+block.y);
			log('m.y: '+m.y);
			
			origin = [m.canvas.clientLeft, m.getOffset('offsetTop')+m.canvas.clientTop];
			//origin = [5, 84];
			
			log(block.y+' '+m.y+' '+y);
			log(scaleX+' '+scaleY);
			
			content.animate({
				translate : [x, y],
				scale : [scaleX, scaleY],
				origin : origin
			}, 1);
			
			content.data('scaleX', scaleX);
			content.data('scaleY', scaleY);
			content.data('x', x);
			content.data('y', y);
			content.data('origin', origin);
			content.data('block', block);
			
			container.fadeIn(speed, function(){
				content.animate({
					scale : [1, 1],
					translate : [0, 0],
					origin : ['50%', '50%']
				}, speed, 'linear', function(){
					//navScroller.refresh();
					
					var comp = content.data('company');
					
					if(comp){
						content.find('.nav li').each(function(){
							if(textContent(this) == comp){
								$(this).click();
							}
						});
					}
					
					content.data('company', null);
				}).toggleClass('zoom');
			});
		} else {
			container.slideDown(speed);
		}
		
		m.lock();
	}
}

function initIScroll(){
	var iScrollOptions = {
		checkDOMChanges : false
	};
	document.addEventListener('touchmove', function(e){ e.preventDefault(); }, false);
	
	searchSroller = new iScroll('search_scroller', iScrollOptions);
	categorySroller = new iScroll('category_scroller', iScrollOptions);
	navScroller = new iScroll('nav_scroller', iScrollOptions);
	detailScroller = new iScroll('detail_scroller', iScrollOptions);
	newsScroller = new iScroll('news_scroller', iScrollOptions);
}

function initMatrix(){
	// Canvas
	var canvas = document.getElementById('canvas');
	canvas.width = canvas.parentNode.clientWidth-10;
	canvas.height = canvas.parentNode.clientHeight-10;
	
	matrixOptions.width = canvas.width;
	matrixOptions.height = canvas.height;
	
	return new Matrix(canvas, matrixOptions, matrixData);
}

function log(text){
	if(window.console && window.console.log){
		window.console.log(text);
	}
}

/******************************************************************************/
/* Fallback functions */

function cursorToFocus(cx){
	//if(cx === null || cx < 94 || cx > 919){
	//	fish(cx, 84);
	//	
	//	return {
	//		index : null,
	//		offset : null
	//	};
	//} else {
	//	fish(94)
	//	
	//	cx = cx-94;
	//	var index = cx/7
	//	index = parseFloat(index.toFixed(0));
	//	
	//	var focus = {
	//		index : index
	//	};
	//}
	
	//log(cx);
	
	fish(94);
	
	var x = ((cx - 75)/(988-75))*matrixData.length;
	
	x = Math.min(matrixData.length-1, Math.max(0, x));
	
	var focus = {
		index : x,
		offset: null
	};
	
	//log(focus);
	
	return focus;
}

function comeIn(laufweite){
	var $dock = $("#dock");
	var dockMarginLeft = 375;
	
	var k = laufweite/94;
	p = Math.pow(k,3);
	//var potScale = 0;
	//var marginLeftItem = 0;
	//var widthItem = 0;
	//var marinTopItem = 0;
	if(p*394 < 265){
		var dockMarginLeft = 375;
	}
	
	dockMarginLeft = Math.max(375, dockMarginLeft);
	
	//var dockMarginTop = 1-p;
	$dock.css({
		//marginTop: (dockMarginTop*130+50)+"px",
		marginLeft: dockMarginLeft+"px"
	});
	//$dock.css("margin-left", dockMarginLeft+"px");
	
	//$dock.children().each(function(nr){
	//	potScale = Math.pow(k,3+nr);
	//	
	//	marginLeftItem = potScale*10;
	//	if(marginLeftItem < 0.2){
	//		marginLeftItem = 0.2;
	//	}
	//	
	//	widthItem = potScale*194;
	//	if(widthItem < 4.1){
	//		widthItem = 4.1;
	//	}
	//	
	//	//var $firstChild = $(this).children().eq(0);
	//	
	//	//marinTopItem = k * parseFloat($firstChild.attr("data-margin"));
	//	
	//	//$firstChild.css({
	//	//	marginLeft: marginLeftItem+"px",
	//	//	marginRight: marginLeftItem+"px",
	//	//	marginTop: marinTopItem+"px"
	//	//	//zoom: widthItem/194
	//	//})//.width(widthItem).height(widthItem);
	//	//$firstChild.css("margin-right", marginLeftItem+"px");
	//	//$firstChild.css("margin-top", marinTopItem+"px");
	//	//$firstChild.width(widthItem).height(widthItem);
	//});
}

function getOut(laufweite, outscaleExponent){
	var $dock = $("#dock");
	
	var subWert = 998-laufweite;
	
	if(subWert < 20){
		subWert = 20;
	}
	
	var k = subWert/79;
	var p = Math.pow(k,3);
	var potScale = 0;
	var marginLeftItem = 0;
	var widthItem = 0;
	var marinTopItem = 0;
	var dockMarginLeft = 0;
	var z = Math.pow(k,outscaleExponent);
	dockMarginLeft = z*24858;
	dockMarginLeft = dockMarginLeft-265;
	if(dockMarginLeft > 13670){
		dockMarginLeft = 13670;
	}
	
	var dockMarginTop = 1-p;
	$dock.css({
		marginTop: (dockMarginTop*130+50)+"px",
		marginLeft: -dockMarginLeft+"px"
	});
	//$dock.css("margin-top", dockMarginTop*130+"px");
	//$dock.css("margin-left", -dockMarginLeft+"px");
	
	var childCount = $("#dock").children().length;
	
	$dock.children().each(function(nr){
		//nr=($("#dock").children().length-  nr);	
		potScale = Math.pow(k, 30 + childCount - nr);
		
		marginLeftItem = potScale*10;
		if(marginLeftItem < 0.2){
			marginLeftItem = 0.2;
		}
		
		widthItem = potScale*194;
		if(widthItem < 4.1){
			widthItem = 4.1;
		}
		
		var $firstChild = $(this).children().eq(0);
		
		marinTopItem = k * parseFloat($firstChild.attr("data-margin"));
		
		$firstChild.css({
			marginLeft: marginLeftItem+"px",
			marginRight: marginLeftItem+"px",
			marginTop: marinTopItem+"px"
			//zoom: widthItem/194
		})//.width(widthItem).height(widthItem);
		
		//marinTopItem = k * parseFloat($("#dock").children().eq(nr).children().eq(0).attr("data-margin"));
		//
		//$("#dock").children().eq(nr).children().eq(0).css("margin-left", marginLeftItem+"px");
		//$("#dock").children().eq(nr).children().eq(0).css("margin-right", marginLeftItem+"px");
		//$("#dock").children().eq(nr).children().eq(0).width(widthItem);
		//$("#dock").children().eq(nr).children().eq(0).height(widthItem);
		//$("#dock").children().eq(nr).children().eq(0).css("margin-top",marinTopItem+"px");
	});
}
	
function fish(laufweite, outscaleExponent){
	//if(laufweite > 919){
	//	getOut(laufweite, outscaleExponent);	
	//} else {
		comeIn(laufweite);
	//}
}

function getBlockScale(blockIndex, posInBlock){
	var dist = 0;
	var scales = [];
	var elements = matrixData;
	
	var width = $(".dock-container").width();
	width = matrixData.length;
	var x;
	
	if(typeof blockIndex === 'number'){
		//x = this.getBlocksAbsWidth(blockIndex);
		x= $(".dock-container").children().eq(blockIndex).css("left");
		
		if(x){
			x= x.match(/(\d+)px/);
			x = parseFloat( x[1] );
		} else {
			x = 0;
		}
		if(elements.length > blockIndex){
			var zw = $(".dock-container").children().eq(blockIndex).width() * posInBlock/(150);
			x += zw;
		}
	}
	
	var blockScales = {min:1, max:40};
	
	for(var i = 0,len = elements.length; i<len; ++i){
		var ele = elements[i];
		
		var temp = {
			scale : 1,
			dist : NaN
		};
		
		if(typeof blockIndex === 'number'){
			
			var zwdist=$(".dock-container").children().eq(i).css("left");
			if(zwdist){
				zwdist= zwdist.match(/(\d+)px/);
				zwdist = parseFloat( zwdist[1] );
			} else {
				zwdist = 0;
			}
			
			var dist = blockIndex - i;
			
			temp.dist = dist;
			dist = Math.abs(dist);
			
			var scale = (width-dist)/width;
			
			// x<0.01 -> 0
			if(scale < 0.01){
				scale = 0;
			}
			
			scale = Math.pow(scale, 8);
			
			// [0, 1] -> [min, max]
			scale = blockScales.min + scale * (blockScales.max-blockScales.min);
			
			temp.scale = scale;
		}
		
		scales[i] = temp;
	}
	
	return scales;
} 

function getScrollAmount(s){
	var index = cursorToFocus(s);
	
	if(index.index != null){
		index = parseFloat(index.index);
		//var left = index*204;
		//left = left+(index*10);
		//left = left+10;
		var left = index * 232;
		animateLeft(left);
	}
}

function animateLeft(amount){
	//amount = Math.round(amount);
	if(amount > 0){
		amount = amount-404;
		amount = amount*-1;
	}
	amount = amount+"px";
	//$(".dock").clearQueue().animate({"margin-left": amount}, 'slow', 'linear');
	$("#dock").css("margin-left", amount);
	//amount = amount*-1;
}

//function slideToCategory(c, callback){
//	var value=(c*7)+94;
//	s.setValue(value);
//	
//	if(typeof callback == 'function'){
//		callback();
//	}
//	
//	//$("#dock").children().eq(c).click();
//}

/******************************************************************************/

$(document).ready(init);
