/**
* Provides common javascript functions.
*
*	@copyright		AussieHQ Pty Ltd
*	@version		2.5
*	@author 		Shane Davis (s.davis@aussiehq.com.au)
*
* 	@package 		ahq
*
*	REVISION		$Rev$:
*	LAST CHANGED	$Date$:
*	CHANGED BY		$Author$:
*
*/

/**
* Removes leading whitespaces from supplied value.
*
* @var string value
*/
function LTrim( value )
{
	var re = /\s*((\S+\s*)*)/;
	return value.replace(re, "$1");
}

/**
* Removes trailing whitespaces from supplied value.
*
* @var string value
*/
function RTrim( value )
{
	var re = /((\s*\S+)*)\s*/;
	return value.replace(re, "$1");
}

/**
* Removes leading and trailing whitespaces from supplied value.
*
* @var string value
*/
function trim( value )
{
	return LTrim(RTrim(value));
}

// Create AJAX XMLHttpRequest object
var http = createRequestObject();

/**
* Creates AJAX XMLHttpRequest object
*
* @return XMLHttpRequest object
*/
function createRequestObject()
{
	// PURPOSE: Creates AJAX interface object

	var req;

	if(window.XMLHttpRequest)
	{
		// Firefox, Safari, Opera...
		req = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		// Internet Explorer 5+
		req = new ActiveXObject('MSXML2.XMLHTTP.3.0');//ActiveXObject("Microsoft.XMLHTTP");
	}
	else
		alert('An AJAX capable browser is required to operate this site');

	return req;
}

/**
* Sends AJAX request
*
* @var string sProcessor Name of script to send request to.
* @var function fnAction Javascript function to handle AJAX readystate change
* @var string sFormData Optional form data to POST with request
*/
function sendAjaxRequest(sProcessor, fnAction, sFormData)
{
	// PURPOSE: sends AJAX request to sProcessor

	http.open("POST", sProcessor, true);
	http.onreadystatechange = fnAction;
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.send(sFormData);
}

/**
* Encodes form data for posting via AJAX to php script
*
* @var string formName Element id of form to encode.
* @return string Encoded form data fomatted as sInputName=value&sInputName2=value2
*/
function encodeForm(formName)
{
	// PURPOSE: Creates PHP POST data from supplied FORM element

	form = document.getElementById(formName);
	formData = sPrefix = "";
	if(form != null)
	{
		// run through form elements creating PHP parameters
		for(iElement=0; iElement < form.elements.length; iElement++)
		{
		
			if((form.elements[iElement].type == "radio" || form.elements[iElement].type == "checkbox") && !form.elements[iElement].checked)
				continue;

			if(form.elements[iElement].value == form.elements[iElement].getAttribute("default"))
				continue;

			if(form.elements[iElement].name == "")
				continue;

			if(formData.length > 0)
				formData += "&";

			formData += sPrefix + form.elements[iElement].name + "=" + form.elements[iElement].value;
		}
	}
	// returns 'formCtrlID1=value&formCtrlID2=value' style data where formCtrlID is form element name
	return formData;
}

/**
* Displays acm Window widget
*
* @var string sId Element id of acm Window to display.
*/

function showWindow(sId)
{
	winOver = document.getElementById('windowOverlay');
	contain = document.getElementById('container');
	winOver.style.height = contain.offsetHeight + "px";
	
	showElement('windowOverlay');
	showElement(sId);
}

/**
* Hides acm Window widget
*
* @var string sId Element id of acm Window to display.
*/
function hideWindow(sId)
{
	hideElement(sId);
	hideElement('windowOverlay');
}

/**
* Displays acm Window widget
*
* @var string sId Element id of acm Window to display.
*/
function showTab(sTabBox,nTab)
{
	if(!document.tabs)
		document.tabs = new Array();

	if(!document.tabs[sTabBox])
		document.tabs[sTabBox] = sTabBox + 'Wnd' + '0';

	nLastTab = document.tabs[sTabBox].slice(-1);
	setElementClass(sTabBox + nLastTab,'');
	hideElement(document.tabs[sTabBox]);

	document.tabs[sTabBox] = sTabBox + 'Wnd' + nTab;

	setElementClass(sTabBox + nTab,'activeTab');
	showElement(document.tabs[sTabBox]);
}

/**
* Captures current window and mouse positions when acm window title bar clicked.
* Enables event handlers to track window movement.
*
* @var DOMEvent e Netscape event object
* @var string sId Element id of acm Window to track.
*/
function trackWnd(e, sId)
{
	if(!e)
		e = window.event;

	eWnd = document.getElementById(sId);
	if(!eWnd)
		return;

	eWnd.mX = e.clientX;
	eWnd.mY = e.clientY;
	eWnd.wX = eWnd.wY = 0;

	if(eWnd.style.left)
		eWnd.wX = parseInt(eWnd.style.left);
	if(eWnd.style.top)
		eWnd.wY = parseInt(eWnd.style.top);

	document.onmouseup = untrackWnd;
	document.trackingWnd = eWnd;
	document.onmousemove = traceWnd;
}

/**
* Moves current acm window while left mouse is held down.
*
* @var DOMEvent e Netscape event object
*/
function traceWnd(e)
{
	if(!e)
		e = window.event;

	if(!document.trackingWnd)
		return;

	document.trackingWnd.style.left = (document.trackingWnd.wX + (e.clientX - document.trackingWnd.mX)) + "px";
	document.trackingWnd.style.top = (document.trackingWnd.wY + (e.clientY - document.trackingWnd.mY)) + "px";
}

/**
* Stops moving current acm window when left mouse is released.
*
* @var DOMEvent e Netscape event object
*/
function untrackWnd(e)
{
	document.onmousemove = null;
}

/**
* Toggles display style attribute of element to show or hide element.
*
* @var string sId Element id of element to toggle.
* @var string sCmd Optional display css property to display element
*/
function toggleElement(sId, sCmd)
{
	// PURPOSE:

	if(sCmd == null)
		sCmd = 'block';
	el = document.getElementById(sId);
	if(el != null)
		el.style.display =  el.style.display == 'none'?sCmd:'none';
}

/**
* Changes display style attribute to make element visible.
*
* @var string sId Element id of element to show.
* @var string sStyle Optional display css property to display element
*/
function showElement(sId, sStyle)
{
	if(!sId || !sId.length)
		return;

	if(!sStyle || !sStyle.length)
		sStyle = 'block';

	el = document.getElementById(sId);
	if(el != null)
		el.style.display = sStyle;
}

/**
* Changes display style attribute to hide element.
*
* @var string sId Element id of element to hide.
*/
function hideElement(sId)
{
	// PURPOSE: Changes display style attribute to make hide element.

	if(!sId || !sId.length)
		return;

	el = document.getElementById(sId);
	if(el != null)
		el.style.display = 'none';
}

/**
* Toggles value of element depending on it's current value.
*
* @var string sId Element id of element to change.
* @var string sName1 Text to change from.
* @var string sName2 Text to change to.
*/
function toggleName(sId, sName1, sName2)
{
	nState = 0;
	el = document.getElementById(sId);
	if(el != null)
	{
		nState = el.value == sName1;
		el.value = el.value == sName1?sName2:sName1;

	}
	return nState;
}

/**
* Changes text of element to supplied value.
*
* @var string sId Element id of element to change.
* @var string sText Text to change to.
*/
function changeElement(sId, sText)
{
	eEl = document.getElementById(sId);
	if(eEl != null)
		eEl.innerHTML = sText;
}

/**
* Clears text of element.
*
* @var string sId Element id of element to change.
*/
function removeElement(sId)
{
	eEl = document.getElementById(sId);
	if(eEl != null)
		eEl.innerHTML = "";
}

/**
* Returns current value of element.
*
* @var string sId Element id of element to retrieve.
* @var string value of element
*/
function getElementValue(sId)
{
	sValue = "";

	eEl = document.getElementById(sId);
	if(eEl != null)
	{
		if(eEl.nodeName == 'SELECT')
			sValue = eEl.options[eEl.selectedIndex].innerHTML;
		else
			sValue = eEl.value;
	}

	return sValue;
}

// Sets value of element to supplied value
function setElementValue(sId, sText)
{
	eEl = document.getElementById(sId);
	if(eEl != null)
		eEl.value = sText;
}

// Returns id of element that triggered supplied event
function getEventElement(eEvent)
{
	var eTarg;

	if(eEvent.target)
		eTarg = eEvent.target;
	if(eEvent.srcElement)
		eTarg = eEvent.srcElement;

	if(eTarg.nodeType == 3)
		eTarg = eTarg.parentNode;

	return eTarg;
}

// Sets class of element to supplied value
function setElementClass(sId, sClass)
{
	eEl = document.getElementById(sId);
	if(eEl != null)
		eEl.className = sClass;
}

// Toggles availablity of sBtnName provided all fields that call this function have a value
function updateBtns(sFormName, sBtnName)
{
	sField = "";
	form = document.getElementById(sFormName);
	if(form != null)
	{
		bEnable = true;
		for(iE=0;iE<form.elements.length;iE++)
		{
			if(form.elements[iE].onchange == null)
				continue;

			// check field has a value
			bEnable &= form.elements[iE].value.length > 0;
			if(!bEnable)
			{
				sField = form.elements[iE].id;
				break;
			}
		}
		ctrl = document.getElementById(sBtnName);
		if(ctrl != null)
			ctrl.disabled = bEnable?"":"disabled";

		ctrl = document.getElementById("formHint");
		if(ctrl != null)
		{
			if(!bEnable)
			{
				sField = sField.replace(/_/, " ");
				ctrl.innerHTML = "<hr>" + sField + " is required.";
			}
			else
				ctrl.innerHTML = "";
		}
		else 
			alert(sField + " is required");
	}
}

function updateDateField(sFieldName)
{
    eDayCtrl = document.getElementById(sFieldName + "Day");
    eMonthCtrl = document.getElementById(sFieldName + "Month");
    eYearCtrl = document.getElementById(sFieldName + "Year");
    eDateCtrl = document.getElementById(sFieldName);
    if(eDateCtrl == null || eDayCtrl == null || eMonthCtrl == null || eYearCtrl == null)
		return;

    nDay = eDayCtrl.value;
    nMonth = eMonthCtrl.value;
    nYear = eYearCtrl.value;

    eDateCtrl.value = nYear + "-" + nMonth + "-" + nDay;
}

/*
	getElementsByClassName
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(className, tag, elm)
{
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++)
	{
		current = elements[i];
		if(testClass.test(current.className))
			returnElements.push(current);
	}
	return returnElements;
}

function externalizeLinks()
{
	docAnchors = document.getElementsByTagName("a");
	for(iAnchor = 0; iAnchor < docAnchors.length; iAnchor++)
	{
		eAnchor = docAnchors[iAnchor];
		if(eAnchor.getAttribute('href') && eAnchor.getAttribute('rel') == 'external')
			eAnchor.target = "_blank";
	}

}

window.onload = externalizeLinks;