// joshua.functions
// http://binaerpilot.no/alexander/
// astoever@binaerpilot.no

// helpers
function stealFocus(){
	$('#joshua').click(function(){
		$('#cmd').focus();
	});
	$('#cmd').focus();
}
function loseFocus(){
	$('#cmd').blur();
	setTimeout(function(){
		$('#cmd').blur();
	}, 50);
}
function clearScreen(){
	$('#output').html('<div class="clearFix"/>');
	reBoot();
}
function clearInput(){
	$('#cmd').blur().val('');
	setTimeout(function(){
		$('#cmd').focus();
	}, 50);
}
function scrollCheck(){
	var autoScroll = $('#output').data('jScrollPanePosition') == $('#output').data('jScrollPaneMaxScroll');
	$('#output').jScrollPane({
		scrollbarWidth:10,
		scrollbarMargin:10,
		enableKeyboardNavigation:false,
		animateTo: true,
		animateInterval:25
	});
	if (autoScroll) $('#output')[0].scrollTo($('#output').data('jScrollPaneMaxScroll'));
}
function reBoot(){
	chromeInit();
	stealFocus();	
	scrollCheck();
}

// chrome (next generation)
function chromeInit(){
	// drag windows
	$('.window').draggable({
		distance:10,
		stop: function(event){
			var window = 'window.'+$(this).attr('id'),
			left = $(this).css('left'),
			right = $(this).css('right'),
			top = $(this).css('top');
			createCookie(window, left+','+right+','+top, expires);
		}
	});
	// x marks the spot
	$('.window h1:not(:has(.close))').append('<a class="close">x</a>');
	// close windows
	$('.close').click(function(){
		var id = $(this).parents("div:first").attr("id");
		var cookie = eraseCookie(id);
		$('#'+id+':visible').fadeOut(fade);
		if(id == "superplastic") {
			$('#'+id+' iframe').attr('src','');
			var fx = readCookie('fx'); if(fx) fxInit(fx);
		}
		else if(id == "music") if(!muted) mute();
		stealFocus();
	});
	// open windows
	$('.open').click(function(){
		var id = this.getAttribute('id').replace(/Open/,'');
		createCookie(id,'true',expires);
		if(id == "gallery") loadGallery();
		else if(id == "superplastic") loadSuperplastic();
		else if(id == "music") if(muted) mute();
		$('#'+id+':hidden').fadeIn(fade);
	});
	// fancybox
	 $('a.view').fancybox({
		'overlayShow': false,
		'padding': 10,
		'zoomSpeedIn': 300,
		'zoomSpeedOut': 300
	});
	// window events
	$.each(windows,function(index, window){
		if(readCookie(window)) {
			$('#'+window+':hidden').show();
		}
	});
	if(readCookie('gallery')) loadGallery();
	if(readCookie('superplastic')) loadSuperplastic();
	// konami
	if(readCookie('konami')) $('div.contra').css({display:'block'});
	// miscellaneous
	$('.version tr.major').show();
	$('.version .toggle').click(function(){
		$(this).remove();
		$('.version tr').show();
		scrollCheck();
	});
	$("a[href^='http']").attr('target','_blank');
	loadConfig();
}

// mute sound
var muted = false;
function mute(){
	if(!muted) {
		$('#midi').remove();
		soundManager.mute();
		muted = true;
	}
	else {
		soundManager.unmute();
		muted = false;
	}
}

// effects
function fxInit(fx, boot){
	if(!boot) {
		fxStop();
		createCookie('fx', fx, expires);
	}
	if(fx == "sparks") {
		var totalSparks = 42;
		var sparks = [];
		for (i = 0; i < totalSparks; i++){  
			sparks[i] = new Spark(50);
		}
	}
	else if(fx == "malkovich") {
		$('body').append('<div id="malkovich"/>');
		$('body').mousemove(function(event){
			$('#malkovich').css({
				top: (event.pageY+10)+'px',
				left: (event.pageX+15)+'px'
			});
			$('#malkovich:hidden').fadeIn(fade);
		});
	}
	else if(fx == "spin") {
		$('#joshua, .window').spin(10);
	}
	else if(fx == "pulsar") {
		pulsar();
		setInterval(pulsar,30000);
	}
}
function fxStop(){
	var cookie = readCookie('fx');
	if(cookie) {
		$('.spark, #malkovich').remove();
		if(cookie != "none") createCookie('fx', 'none', expires);
		if(cookie == "pulsar" || cookie == "spin") location.reload();
	}
}

// theme loader
function loadTheme(theme, boot){
	if(theme == "tron") {
		eraseCookie('background');
		if(readCookie('opacity') != 1) createCookie('opacity', '1', expires);
	}
	if(!boot) {
		createCookie('theme', theme, expires);
		location.reload();
	}
	else {
		switchStyle(theme);
	}
}

// preset loader
function loadPreset(preset){
	if(preset == "next-gen"){
		createCookie('theme', 'carolla', expires);
		createCookie('background', 'atari', expires);
		createCookie('fx', 'sparks', expires);
		createCookie('desktop', ' true', expires);
	}
	else if(preset == "rachael"){
		createCookie('theme', 'penguin', expires);
		createCookie('background', 'rachael', expires);
		eraseCookie('fx');
		createCookie('desktop', ' true', expires);
	}
	else if(preset == "pulsar"){
		createCookie('theme', 'white', expires);
		eraseCookie('background');
		createCookie('fx', preset, expires);
		createCookie('desktop', ' true', expires);
	}
	else if(preset == "tron"){
		createCookie('theme', preset, expires);
		eraseCookie('background');
		createCookie('fx', 'sparks', expires);
		createCookie('desktop', ' true', expires);	
	}
	else if(preset == "reset"){
		eraseCookie('theme');
		eraseCookie('background');
		eraseCookie('fx');
		eraseCookie('desktop');
		eraseCookie('opacity');
		eraseCookie('release');
		$.each(windows,function(){
			eraseCookie(this);
			eraseCookie('window.'+this);
		});
	}
	location.reload();
}

// config window
function loadConfig(){
	// themes
	$('div#themes div').click(function(){
		var theme = this.getAttribute('class');
		createCookie('theme', theme, expires);
		loadTheme(theme);
	});
	// backgrounds
	$('div#backgrounds div').click(function(){
		var background = this.getAttribute('class');
		$('#joshua').removeClass().addClass(background);
		createCookie('background', background, expires);
	});
	// effects
	$('div#fx div').click(function(){
		var fx = this.getAttribute('class');
		var cookie = readCookie('fx');
		if(fx == "none") fxStop();
		else if(fx != cookie) fxInit(fx);
	});
	// miscellaneous
	$('div#presets div').click(function(){
		var preset = this.getAttribute('class');
		loadPreset(preset);
	});
	// sliders
	$('#sliders label').click(function(){
		var slider = this.getAttribute('class');
		if(slider == "opacity") $('#joshua, .window').css({opacity:''});
	});
	var opacity = readCookie('opacity');
	if(!opacity) {
		opacity = 1;
		createCookie('opacity', opacity, expires);
	}
	// opacity
	$('#opacity').slider({
		max: 20,
		min: 3,
		value: opacity*20,
		slide: function(event, ui) {
			opacity = ui.value/20;
			$('#joshua, .window').css({opacity:opacity});
		},
		change: function(event, ui) {
			opacity = ui.value/20;
			$('#joshua, .window').css({opacity:opacity});
			createCookie('opacity', opacity, expires);
		}
	});
}

// application loaders
function loadGallery(){
	$('#gallery:hidden').fadeIn(fade);
	$('#slideshow').cycle({ 
		fx:     'fade', 
		delay:  -1000,
		next: '#slideshow'
	});
}
function loadSuperplastic(){
	$('.spark').remove();
	$('#superplastic iframe').attr('src', 'superplastic/index.html');
	$('#superplastic:hidden').fadeIn(fade);
	loseFocus();
}

// custom magic
function customMagic(){
	var theme = readCookie('theme');
	if(theme == "tron") {
		var team = readCookie('tron.team');
		if(!team) createCookie('tron.team', 'blue', expires);
		else if(team && team != "blue"){
			var colors = ['f570f5','e9000f','f0e53a','a4e750','9a65ff', 'eb7129'], color = ''; 
			if(team == "pink") color = colors[0];
			else if(team == "red") color = colors[1];
			else if(team == "yellow") color = colors[2];
			else if(team == "green") color = colors[3];
			else if(team == "purple") color = colors[4];
			else if(team == "orange") color = colors[5];
			var css = 'body {background-image: url("images/background-tron_'+team+'.jpg")}'+
				'h1 .dark, #input #cmd, .error, .joshua, .window p a, .window table a, .output a, .command, .tiny div:hover, .close:hover, #desktop ul li a:hover, #input {color:#'+color+'; border-color:#'+color+'}'+
				'.tracks li a.playing, .tracks li a.playing:hover {background-color:#'+color+'}'+
				'.light {color:#'+color+'; opacity:0.5;}';
			$('#main').append('<div id="custom"/>');
			$('#custom').html('<style type="text/css">'+css+'</style>');
		}
		$('div.tron div.tiny div').click(function(){
			var team = this.getAttribute('class');
			createCookie('tron.team', team, expires);
			location.reload();
		});
		$('#joshua h1 strong').html('<img src="images/joshua_logo.png" height="8" width="71" alt="" />');
	}
	else if(theme == "contra"){
		$('#joshua h1').html('<em>Joshua</em> Konami Edition <span class="dark">30 lives!</span>');
		$('body').animate({delay: 1}, 750).animate({backgroundColor:"#fff"}, 500).animate({backgroundColor:"#152521"}, 3500);
	}
}
// konami code
var konami = readCookie('konami');
if(!konami) {
	var keySequence = [], konamiCode = '38,38,40,40,37,39,37,39,66,65';
	if(window.addEventListener) {
		window.addEventListener('keydown', function(e){
			keySequence.push(e.keyCode);
			if(keySequence.toString().indexOf(konamiCode) >= 0) {
				eraseCookie('fx'); createCookie('theme', 'contra', expires); createCookie('konami', ' true', expires);
				location.reload();
			}
		}, true);
	}
}
// relative time
function relTime(time) {
	var values = time.split(" ");
	time = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
	var parsedDate = Date.parse(time);
	var relativeTo = (arguments.length > 1) ? arguments[1] : new Date();
	var delta = parseInt((relativeTo.getTime() - parsedDate) / 1000);
	delta = delta + (relativeTo.getTimezoneOffset() * 60);
	var r = '';
	if (delta < 60) {
		r = 'a minute ago';
	} else if(delta < 120) {
		r = 'couple of minutes ago';
	} else if(delta < (45*60)) {
		r = (parseInt(delta / 60)).toString() + ' minutes ago';
	} else if(delta < (90*60)) {
		r = 'an hour ago';
	} else if(delta < (24*60*60)) {
		r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
	} else if(delta < (48*60*60)) {
		r = '1 day ago';
	} else {
		r = (parseInt(delta / 86400)).toString() + ' days ago';
	}
	return r;
}
// linkify
String.prototype.linkify = function() {
	return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(x) {
		return x.link(x);
	});
}