var bodyWidth = 0;
var bodyHeight = 0;

function organizeWindow() {
	bodyWidth = $(document.body).getSize().x;
	bodyHeight = $(document.body).getSize().y;

	$('contents').setStyle('opacity', 0);
	$('contents').setStyle('top', bodyHeight/2 - 270);

	$('wrapper').setStyle('width', bodyWidth + 2 * 680);
	$('indicator').setStyle('left', bodyWidth / 2 - 50);

	$('footer').setStyle('left', (bodyWidth - $('footer').getSize().x)/2);
	
	if (bodyHeight < $('contents').getSize().y+40) {
		$('footer').tween('opacity', 0.0);
	} else {
		$('footer').tween('opacity', 1.0);
	}
	
	if (bodyHeight < $('contents').getSize().y-20) {
		$$('#archives a').setStyle('color', '#666');
		$('search').setStyle('background-position', '0px -12px');
	} else {
		$$('#archives a').setStyle('color', '#fff');
		$('search').setStyle('background-position', '0px 0px');
	}

	$('contents').tween('opacity', 1.0);
}

window.addEvent('load', organizeWindow);

function reOrganizeWindow() {
	bodyWidth = $(document.body).getSize().x;
	bodyHeight = $(document.body).getSize().y;

	$('contents').set('tween', {link: 'chain', duration: 'short', transition: Fx.Transitions.Sine.easeOut});

	$('contents').tween('opacity', 0.5);
	$('contents').get('tween').chain(function() {
		reorganizePages();
		this.callChain()
	});
	$('contents').tween('top', bodyHeight/2 - 270);
	$('contents').tween('opacity', 1.0);

	$('wrapper').setStyle('width', bodyWidth + 2 * 680);
	$('indicator').setStyle('left', bodyWidth / 2 - 50);

	$('footer').setStyle('left', (bodyWidth - $('footer').getSize().x)/2);

	if (bodyHeight < $('contents').getSize().y+40) {
		$('footer').tween('opacity', 0.0);
	} else {
		$('footer').tween('opacity', 1.0);
	}

	if (bodyHeight < $('contents').getSize().y-20) {
		$$('#archives a').setStyle('color', '#666');
		$('search').setStyle('background-position', '0px -12px');
	} else {
		$$('#archives a').setStyle('color', '#fff');
		$('search').setStyle('background-position', '0px 0px');
	}
}

function adaptWebsite() {
	if (Browser.Platform.mac) {
		document.body.setStyles({
			'font-family': 'adobe garamond pro',
			'font-size': '15px'
		});
	};
}

window.addEvent('domready', adaptWebsite);
window.addEvent('resize', reOrganizeWindow);

//---------------------------------------------------

var keyList = [];

var keyEvent = (Browser.Engine.webkit) ? 'keydown' : 'keypress';

function navigationMain() {
	$$('*[class*=key_action]').each(function(entry) {
		var classes = entry.getProperty('class');
		var index = classes.search('key_action');
		var keycode = classes.substr(index+11, 3);
		
		keyList.unshift({key : keycode, code : entry.getProperty('onclick')});
	});

	keyList.unshift({key : 40, code : 'var slider = pageList[pageID].slider; slider.set(slider.step+10);'});
	keyList.unshift({key : 38, code : 'var slider = pageList[pageID].slider; slider.set(slider.step-10);'});

	window.addEvent(keyEvent, navigationOnKey);
}

function navigationOnKey(event) {
	keyList.each(function(entry) {
		if (entry.key == event.code) {
			eval(entry.code);
		}
	});
}

window.addEvent('load', navigationMain);

//---------------------------------------------------

var pageID = -1;
var pageList = [];
var prevPostURL = [];
var nextPostURL = [];

var pageHistory = 5;

var leftBefore = 0;
var leftAfter = 0;

//----------------------------------------------------------

function cleansePages() {
	pageID = -1;

	while (pageList.length > 0) {
		pageList.pop().dispose();
		nextPostURL.pop();
		prevPostURL.pop();
	}
	
	$('archives').set('html', '');
}

function showHideIndicator(visible) {
	if (showHideIndicator.counter == null)
		showHideIndicator.counter = 0;

	if (visible == true)
	  showHideIndicator.counter++;
  else
  	showHideIndicator.counter--;
  
	if (showHideIndicator.counter > 0) {
		$('indicator').set('tween', {duration: 100, transition: Fx.Transitions.Sine.easeOut});
		$('indicator').tween('opacity', 0.7);
	} else {
		$('indicator').set('tween', {duration: 1500, transition: Fx.Transitions.Sine.easeOut});
		$('indicator').tween('opacity', 0);
	}
}

function reorganizePages() {
	pageList.each(function(item, index) {
		var position = bodyWidth/2 + 680*(index-pageID) - 340;
		var scrollbar = pageList[index].getElement('.scrollbar');

		item.set('morph', {duration: 'long', transition: Fx.Transitions.Sine.easeOut});

		if (index == pageID) {
			scrollbar.fade(0.25);
			item.morph({
				opacity: 1,
				left: position
			});
		} else {
			scrollbar.fade(0);
			item.morph({
				opacity: 0.1,
				left: position
			});
		}
	});
}

var delay = 10;

//------

var requestPrev = new Request({evalScripts: true, link: 'ignore', onSuccess: injectPageBefore});

function moveToURL(postURL) {
	cleansePages();
	
	leftBefore = Math.floor(pageHistory / 2) + 1;
	leftAfter = Math.floor(pageHistory / 2);

	showHideIndicator(true);
	requestPrev.get(postURL, {layout: 'single'});
} 

var chargingBefore = 0;

function moveToPrevious() {
	if (!pageID) return ;

	showComments(0);

	pageID--;
	if (pageID < Math.floor(pageHistory/2))
	leftBefore++;
	reorganizePages();

	loadPageBefore();
}

function loadPageBefore() {
	if (chargingBefore || !leftBefore) return ;

	if (prevPostURL[0] == '') {
		leftBefore = 0;
		return;
	}

	chargingBefore = 1;
	showHideIndicator(true);

	var ch = new Chain();
	ch.wait(delay).chain(function() { requestPrev.get(prevPostURL[0], {layout: 'single'}) });	
	ch.callChain();
}

function injectPageBefore(responseText, responseXML) {
	var position = (pageList.length) ? pageList[0].getStyle('left').toInt() - 680 : bodyWidth / 2 - 340;

	var newPage = new Element('div', {'class': 'page'});

	newPage.set('html', responseText);
	newPage.inject($('wrapper'), 'top');
	newPage.setStyles({ opacity: 0, left: position });
	
	makeScrollbar(newPage,newPage.getElement('.right_page'), newPage.getElement('.scrollbar'), newPage.getElement('.handle'));
	
	var archives = $('archives');
	if (archives.get('html') == '') {
		archives.set('html', newPage.getElement('#elt_archives').get('html'));
		initMouseActions('archives');
		showArchives();
	}

	pageList.unshift(newPage);
	nextPostURL.unshift(nextPost);
	prevPostURL.unshift(previousPost);

	if (pageList.length > pageHistory) {
		pageList.pop().dispose();
		nextPostURL.pop();
		prevPostURL.pop();
	}
	
	pageID++;
	chargingBefore = 0;

	leftBefore--;
	loadPageBefore();
	loadPageAfter();
	reorganizePages();

	showHideIndicator(false);
}

//------

var requestNext = new Request({evalScripts: true, link: 'ignore', onSuccess: injectPageAfter});

var chargingAfter = 0;

function moveToNext() {
	if (pageID == pageList.length-1) return ;

	showComments(0);

	pageID++;
	if (pageID > Math.floor(pageHistory/2))
	leftAfter++;
	reorganizePages();

	loadPageAfter();
}

function loadPageAfter() {
	if (chargingAfter || !leftAfter) return ;

	if (nextPostURL[pageList.length-1] == '') {
		leftAfter = 0;
		return;
	}

	chargingAfter = 1;
	showHideIndicator(true);
	
	var ch = new Chain();
	ch.wait(delay).chain(function() { requestNext.get(nextPostURL[nextPostURL.length-1], {layout: 'single'}) });	
	ch.callChain();
}

function injectPageAfter(responseText, responseXML) {
	var	position = (pageList.length) ? pageList[pageList.length-1].getStyle('left').toInt() + 680 : position = bodyWidth / 2 - 340;

	var newPage = new Element('div', {'class': 'page'});

	newPage.set('html', responseText);
	newPage.inject($('wrapper'), 'bottom');
	newPage.setStyles({ opacity: 0, left: position });

	makeScrollbar(newPage,newPage.getElement('.right_page'), newPage.getElement('.scrollbar'), newPage.getElement('.handle'));

	pageList.push(newPage);
	nextPostURL.push(nextPost);
	prevPostURL.push(previousPost);

	if (pageList.length > pageHistory) {
		pageList.shift().dispose();
		nextPostURL.shift();
		prevPostURL.shift();
		pageID--;
	}

	chargingAfter = 0;
	
	leftAfter--;
	loadPageBefore();
	loadPageAfter();
	reorganizePages();

	showHideIndicator(false);
}

//----------------------------------------------------------

function initMouseActions(elt) {
	var active = 1.0;
	var inactive = 0.5;

	$(elt).getElements('*[class*=mouse_action]').each(function(element) {
		var classes = element.getProperty('class');
		var index = classes.search('mouse_action');
		var opacity = classes.substr(index+13, 3);

		var value = (opacity != '') ? opacity/100 : inactive;

		element.fade(value);
		element.addEvent('mouseover', function(event) { this.fade(active) });
		element.addEvent('mouseout', function(event) { this.fade(value) });
	});
}

window.addEvent('domready', function() { initMouseActions(document.body) });

//----------------------------------------------------------

function showArchives() {
	i = 0;

	$$('#archives a').each(function(elt) {
		new Fx.Tween(elt, {
			property: 'right',
			link: 'chain',
			duration: 500,
			transition: Fx.Transitions.Sine.easeOut
		}).start(-80).wait(50*i).start(24+32*i++);
	});
} 

window.addEvent('load', showArchives);

//----------------------------------------------------------

function makeScrollbar(page,content,scrollbar,handle,ignoreMouse){
	var steps = content.getScrollSize().y - content.getSize().y;
	
	var tmp = content.getSize().y / content.getScrollSize().y;
	if (tmp > 1) tmp = 1;
	handle.setStyle('height', tmp * scrollbar.getSize().y);
		
	var slider = new Slider(scrollbar, handle, {
		steps: steps,
		mode: 'vertical',
		onChange: function(step) {
			content.scrollTo(0, step);
		}
	}).set(0);
	page.slider = slider;
	if (!ignoreMouse) {
		$$(content, scrollbar).addEvent('mousewheel', function(e) {	
			e = new Event(e).stop();
			var step = slider.step - e.wheel * 30;	
			slider.set(step);					
		});
	}
	
	$(document.body).addEvent('mouseleave',function(){slider.drag.stop()});
}

//----------------------------------------------------------

function showComments(value) {
	pageList[pageID].getElement('.comments').setStyle('opacity', value);
}

//----------------------------------------------------------

function showSearchBox() {
	if (showSearchBox.counter == null)
		showSearchBox.counter = 0;

	if (showSearchBox.counter) {
		showSearchBox.counter = 0;
		$('search_box').tween('width', 0);
	} else {
		showSearchBox.counter = 1;
		$('search_box').tween('width', 300);
	}
}
