/******************************************************************/
/************************** Core Function *************************/
/******************************************************************/

var ajaxErrorHandler = function(msg) { alert(msg); }

function createRequest()
{
	try 
	{
		return new XMLHttpRequest();
	} 
	catch (trymicrosoft)
	{
		try 
		{
			return new ActiveXObject("Msxml2.XMLHTTP");
	    } 
		catch (othermicrosoft) 
		{
			try
			{
				return new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (failed)
			{
				return null;
			}  
	    }
	}
}

function delegate(obj, method)
{
	return function() { return method.call(obj); }
}

function asyncRequest(url, responseHandler, responseHandlerArg)
{
	// Prevent browser caching
	var nocache = '__nocache=' + Math.random();
	if(url.indexOf('?') == -1)
		url += '?' + nocache
	else
		url += '&' + nocache

	// Create a new request and store it in a container object along with the handler details
	var request = createRequest();
	if(request == null)
		alert('Failed to initialise AJAX request');
	
	var requestContainer = new Object();
	requestContainer.request = request;
	requestContainer.responseHandler = responseHandler;
	requestContainer.responseHandlerArg = responseHandlerArg;

	// Make the async request
	request.open('GET', url, true);
	request.onreadystatechange = delegate(requestContainer, onReadyStateChange);
	request.send(null);
}

function onReadyStateChange()
{
	if (this.request.readyState != 4 || this.request.status != 200) return;
	this.responseHandler(this.request.responseText, this.responseHandlerArg);
}

function setCustomAjaxErrorHandler(func)
{
	ajaxErrorHandler = func;
}


/******************************************************************/
/************************* Editable Label *************************/
/******************************************************************/

function doEditableLabel(labelId, url, obscureValue)
{
	var label = document.getElementById(labelId);
	label.style.display = 'block';
	
	var inputType = 'text';
	
	if(obscureValue)
		inputType = 'password';

	label.originalValue = label.innerHTML;
	label.innerHTML = 
		'<input id="' + labelId + '_input" type="' + inputType + '" value="' + label.originalValue + '" style="border: solid #BBBBBB 1px;" />' +
		'<a href="javascript:confirmEditableLabel(\'' + labelId + '\')"><img src="img/accept.gif" border="0" style="vertical-align: middle;" /></a>' +
		'<a href="javascript:resetEditableLabel(\'' + labelId + '\')"><img src="img/cancel.gif" border="0" style="vertical-align: middle;" /></a>';

	label.originalOnclick = label.onclick;
	label.onclick = null;
	label.url = url;
	
	document.getElementById(labelId + '_input').focus();
}

function confirmEditableLabel(labelId)
{
	var label = document.getElementById(labelId);
	var newValue = document.getElementById(labelId + '_input').value;

	label.innerHTML = '<img src="img/progress.gif" />';
	label.newValue = newValue;
	
	var url = label.url.replace('{labelvalue}', newValue);
	
	asyncRequest(url, editableLabelHandler, labelId);
}

function resetEditableLabel(labelId)
{
	var label = document.getElementById(labelId);
	label.innerHTML = label.originalValue;
	label.onclick = label.originalOnclick;
}

function editableLabelHandler(response, labelId)
{
	if(response != 'ok')
	{
		resetEditableLabel(labelId);
		ajaxErrorHandler(response);
		return;
	}
	
	var label = document.getElementById(labelId);
	
	label.innerHTML = label.newValue;
	label.onclick = label.originalOnclick;
}

/******************************************************************/
/************************** Toggle Image **************************/
/******************************************************************/

function doToggleImage(imageId, url)
{
	var img = document.getElementById(imageId);
	img.oldsrc = img.src;
	img.src = 'img/indicator.gif';
	img.originalOnclick = img.onclick;
	img.onclick = null;
	
	asyncRequest(url, toggleImageHandler, imageId);
}

function toggleImageHandler(response, imageId)
{
	var img = document.getElementById(imageId);
	img.onclick = img.originalOnclick;

	if(response != 'ok')
	{
		img.src = img.oldsrc;
		ajaxErrorHandler(response);
		return;
	}
	
	if(img.oldsrc.indexOf('off') > -1)
		img.src = 'img/on.gif';
	else
		img.src = 'img/off.gif';
}

/******************************************************************/
/*************************** Deleter ******************************/
/******************************************************************/

function doDeleter(deletableDOMObjectId, deleteMessage, url)
{
	if(confirm(deleteMessage))
		asyncRequest(url, deleterConfirm, deletableDOMObjectId);
}

function deleterConfirm(response, deletableDOMObjectId)
{
	if(response != 'ok')
	{
		ajaxErrorHandler(response);
		return;
	}
	
	document.getElementById(deletableDOMObjectId).style.display = 'none';
}

/******************************************************************/
/************************ General Methods *************************/
/******************************************************************/

function formToUrl(formName)
{
	var f = document.forms[formName];
	var url = '';
	var and = '';
	
	for(var i = 0; i < f.elements.length; i++)
	{
		if(f.elements[i].name == '') continue;
	
		var element = f.elements[i];
		var value;
		
		if(element.type == 'checkbox')
		{
			url += and + element.name + '=' + element.checked;
			and = '&';
		}
		else if(element.type == 'select-multiple')
		{
			for(var j = 0; j < element.options.length; j++)
			{
				if(element.options[j].selected)
				{
					url += and + element.name + '=' + escape(element.options[j].value);
					and = '&';
				}
			}
		}
		else
		{
			url += and + element.name + '=' + escape(element.value);
			and = '&';
		}
	}
	
	return url;
}

function formatData(containerId, headerTemplate, itemTemplate, footerTemplate, data, itemSeperator, rowSeperator)
{
	var container = document.getElementById(containerId);
	container.innerHTML = '';

	// Trim the data
	data = data.replace(/^\s+|\s+$/g, "");
	if(data.length == 0) return;

	var rows = data.split(rowSeperator);
	var itemHtml = '';
	
	for(var row = 0; row < rows.length; row++)
	{
		var fields = rows[row].split(itemSeperator);
		var rowHtml = itemTemplate;
		
		for(var field = 0; field < fields.length; field++)
		{
			var regEx = new RegExp('\\{' + field + '\\}', 'g');
			rowHtml = rowHtml.replace(regEx, fields[field]);
		}
		
		itemHtml += rowHtml;
	}
	
	container.innerHTML = headerTemplate + itemHtml + footerTemplate;
}

function hideElement(elementId)
{
	var element = document.getElementById(elementId);
	element.style.display = 'none';
}

function showElement(elementId)
{
	var element = document.getElementById(elementId);
	element.style.display = 'block';
}

function setElementInnerHTML(elementId, html)
{
	var element = document.getElementById(elementId);
	element.innerHTML = html;
}