var foldAreaIDs = new Array (
	'search',
	'categories',
	'archives',
	'blogroll',
	'photos',
	'sidenotes',
	'feeds',
	'blog-meta'
);

var areaFolded = new Array();

function trim(whitespaceString) {
	while (whitespaceString.search(' ') != -1) {
		whitespaceString = whitespaceString.replace(' ', '');
	}
	return whitespaceString;
}

function setCookie(areaID, areaIDFolded) {
	expirationDate = new Date();
	expirationDate.setDate(30);
	document.cookie = areaID + '=' + areaIDFolded + ';expires='+ expirationDate;
}

function isCookieSet() {
	return document.cookie.length > 0;
}

function retrieveValuesFromCookie() {
	cookieString = document.cookie;
	cookieList = cookieString.split(';');
	for (loop = 0; loop < cookieList.length; ++loop) {
		indexOfEqualsSign = cookieList[loop].indexOf('=');
		areaID = trim(cookieList[loop].substring(0, indexOfEqualsSign));	
		areaIDFolded = trim(cookieList[loop].substring(indexOfEqualsSign + 1, cookieList[loop].length));
		if (areaIDFolded == 'true') {
			areaFolded[areaID] = true;
		} else {
			areaFolded[areaID] = false;
		}
	}
}

function toggle(e) {
	buttonID = null;
	if (e.currentTarget) {
		buttonID = e.currentTarget.id;
	} else if (e.srcElement) {
		buttonID = e.srcElement.id;
	}
	button = document.getElementById(buttonID);
	if (button == null) {
		return ;
	}	
	areaID = buttonID.substring(0, buttonID.indexOf('-toggleButton'));
	classValue = (areaFolded[areaID] ? 'foldButton' : 'unfoldButton');
	button.className = classValue;
	area = document.getElementById(areaID);
	divs = area.getElementsByTagName('div');
	for (loop = 0; loop < divs.length; ++loop) {
		div = divs[loop];
		classValue = div.className;
		if (classValue == 'unfold') {
			div.className = 'fold';
		} else if (classValue == 'fold') {
			div.className = 'unfold';
		}
	}
	areaFolded[areaID] = !areaFolded[areaID];		
	setCookie(areaID, areaFolded[areaID]);	
}

function attachToggleButton(areaID, area) {
	headers = area.getElementsByTagName('h2');
	if (headers.length == 0) {
		return ;
	}
	targetHeader = headers[0];
	button = document.createElement('div');
	button.className = (areaFolded[areaID] ? 'unfoldButton' : 'foldButton');
	button.id = areaID + '-toggleButton';
	addEvent(button, 'click', toggle);
	divs = area.getElementsByTagName('div');
	for (loop = 0; loop < divs.length; ++loop) {
		div = divs[loop];
		div.className = (areaFolded[areaID] ? 'fold' : 'unfold');
	}
	targetHeader.appendChild(button);
}

function prepare() {
	for (loop = 0; loop < foldAreaIDs.length; ++loop) {
		areaID = foldAreaIDs[loop];	
		areaFolded[areaID] = false;
	}	
	if (isCookieSet()) {
		retrieveValuesFromCookie();
	}
	for (i = 0; i < foldAreaIDs.length; ++i) {
		areaID = foldAreaIDs[i];	
		area = document.getElementById(areaID);
		if (area != null) {
			attachToggleButton(areaID, area);
		}
	}
	
}

/**
 * The new and enhanced addEvent methods
 */
function addEvent(obj, type, fn) {
	if (obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn](window.event);}
		obj.attachEvent('on'+type, obj[type+fn]);
	} else {
		obj.addEventListener(type, fn, false);
	}
}

function removeEvent(obj, type, fn) {
	if ( obj.detachEvent ) {
		obj.detachEvent('on'+type, obj[type+fn]);
		obj[type+fn] = null;
	} else {
		obj.removeEventListener(type, fn, false);
	}
}

addEvent(window, 'load', prepare);
