/*
Expandable Textarea experiment
dotjay, 2006-2007
http://dotjay.co.uk/experiments/javascript/expandable-textarea/
updated: 02 Aug 2007
based on the script by Gez Lemon, 2006
http://juicystudio.com/experiments/textarea.php
*/

// generic onload event function by Simon Willison, http://simonwillison.net/2004/May/26/addLoadEvent/
/*function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') window.onload = func;
    else {
        window.onload = function() {
            if (oldonload) oldonload();
            func();
        }
    }
}*/

function addClass(el,val) {
	if (!el.className) el.className = val;
	else {
		newClassName = el.className + " " + val;
		el.className = newClassName;
	}
}

function insertAfter(newElement,targetElement) {
	var parent = targetElement.parentNode;
	if (parent.lastChild == targetElement) parent.appendChild(newElement);
	else parent.insertBefore(newElement,targetElement.nextSibling);
}

// function to create elements circumventing XHTML/DOM compliance
function createElement(element) {
	element = element.toLowerCase();
	if (typeof document.createElementNS != 'undefined')
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	if (typeof document.createElement != 'undefined')
		return document.createElement(element);
	return false;
}

function wrapElement(el,wrapWith) {
	insertAfter(wrapWith,el)
	wrapWith.appendChild(el)
}

function initExpandableTextareas() {
	if (!document.getElementsByTagName || !document.getElementById || !document.createElement || !document.createTextNode) return;
	
	var objAreas = document.getElementsByTagName('textarea');
	var objLabels = document.getElementsByTagName('label');
	var objSpan, strLabel;

	// Attach an event handler for each form
	var i,len=objAreas.length;
	for (i=0; i<len; i++) {
		if (!objAreas[i].className.match("expandable")) continue;

		newDiv = createElement("div");
		addClass(newDiv,"expandable-textarea");
		wrapElement(objAreas[i],newDiv);
		strLabel = getLabel(objAreas[i], objLabels);

		controls = createElement('ul');
		addClass(controls,'controls');
		addClass(controls,"anchors");
		
		controlItem = createElement("li");
		controlItem.appendChild(addAnchorControl(objAreas[i], strLabel, '-'));
		controls.appendChild(controlItem);

		controlItem = createElement("li");
		controlItem.appendChild(addAnchorControl(objAreas[i], strLabel, '+'));
		controls.appendChild(controlItem);

		objAreas[i].parentNode.insertBefore(controls, objAreas[i]);
	}
}

function addAnchorControl(objArea, strLabel, iAction) {
	var objAnchor = document.createElement('a');

	objAnchor.setAttribute('href', '#' + objArea.getAttribute('id'));
	objAnchor.onclick = function(event){return increaseArea(event, objArea, iAction);};
	objAnchor.onkeypress = function(event){return increaseArea(event, objArea, iAction);};
	if (iAction == '+') {
		addClass(objAnchor,"increase");
		textSpan = createElement("span");
		textSpan.appendChild(document.createTextNode('Increase Area for ' + strLabel))
		objAnchor.appendChild(textSpan);
	} else {
		addClass(objAnchor,"decrease");
		textSpan = createElement("span");
		textSpan.appendChild(document.createTextNode('Decrease Area for ' + strLabel))
		objAnchor.appendChild(textSpan);
	}

	return objAnchor;
}

function getLabel(objField, objLabels) {
	var i,len=objLabels.length;
	for (i=0; i<len; i++)
		if (objLabels[i].htmlFor == objField.id)
			return objLabels[i].firstChild.nodeValue;

	return 'unknown';
}

function increaseArea(objEvent, objArea, iAction) {
	// Allow keyboard navigation over links
	if (objEvent && objEvent.type == 'keypress')
		if (objEvent.keyCode != 13 && objEvent.keyCode != 32)
			return true;

	var iRows = parseInt(objArea.getAttribute('rows'), 10);
	
	if (iAction == '+')
	{
		if (iRows < 50)
			iRows += 5;
	}
	else
	{
		if (iRows > 5)
			iRows -= 5;
	}
	
	objArea.setAttribute('rows', iRows);
	return false;
}

function initExpandableTextareasImg() {
	if (!document.getElementsByTagName || !document.getElementById || !document.createElement || !document.createTextNode) return;
	var objAreas = document.getElementsByTagName('textarea');
	var objLabels = document.getElementsByTagName('label');
	var objSpan, strLabel;

	// Attaach an event handler for each form
	var i,len=objAreas.length;
	for (i=0; i<len; i++){
		if (!objAreas[i].className.match("expandable")) continue;

		var newDiv = createElement("div");
		addClass(newDiv,"expandable-textarea");
		wrapElement(objAreas[i],newDiv);
		strLabel = getLabel(objAreas[i], objLabels);

		var controls = createElement("div");
		addClass(controls,'controls');
		addClass(controls,"images");
		controls.appendChild(addImgControl(objAreas[i], strLabel, '-'));
		controls.appendChild(addImgControl(objAreas[i], strLabel, '+'));

		objAreas[i].parentNode.insertBefore(controls, objAreas[i]);
	}
}

function addImgControl(objArea, strLabel, iAction) {
	var objAnchor = document.createElement('a');

	objAnchor.setAttribute('href', '#' + objArea.getAttribute('id'));
	objAnchor.onclick = function(event){return increaseArea(event, objArea, iAction);};
	objAnchor.onkeypress = function(event){return increaseArea(event, objArea, iAction);};
	if (iAction == '+'){
		addClass(objAnchor,"increase");
		var img = createElement("img");
		img.setAttribute('src','expand.gif');
		img.setAttribute('alt','Increase area for ' + strLabel);
		objAnchor.appendChild(img);
	}else{
		addClass(objAnchor,"decrease");
		var img = createElement("img");
		img.setAttribute('src','collapse.gif');
		img.setAttribute('alt','Decrease area for ' + strLabel);
		objAnchor.appendChild(img);
	}

	return objAnchor;
}



/* --- add load event ---
 choose one of these two versions - for the purposes of demontration, these are called from the document head
*/

//addLoadEvent(initExpandableTextareas);
//addLoadEvent(initExpandableTextareasImg);

