/**
 * ROAR Profiles javascript functions
 */
var app_path = '/roar';// base url path to roar profile search page files
var strLoadSpin = '<h3><img src="/images/ajax-loader-ffffff.gif"/>&nbsp;Loading, please wait...</h3>';// common loading message for ajax spinners
var strLoadSpinControls = '<table><tr><td style="vertical-align: middle;padding-left: .5em;"><img src="/images/ajax-loader-9cb2ad.gif"/></tr></td></table>';// loading message for controls ajax spinner
var strLoadSpinSearch = '<h3 style="text-align: center;">Searching, please wait...<br/><img style="margin-top: .3em;" src="/images/ajax-loader-large.gif"/></h3>';// loading message for ajax search spinner
var strLoadSpinSearchClear = '<h3 style="text-align: center;">Please wait...<br/><img style="margin-top: .3em;" src="/images/ajax-loader-large.gif"/></h3>';// loading message for ajax search spinner
var strLoadSpinSmall = '<img src="/images/ajax-loader-small.gif"/>&nbsp;Updating...';// common loading message for small ajax spinners
var strCategoryInstructions = '<br/>Click <img src="/dios/images/menu/expandDown.gif"/>/<img src="/dios/images/menu/expandUp.gif"/> icons to expand/collapse categories, click category name to select';
var strEmptySearch = '$$$|$$$';
var strFilterLoaderId = 'filter-spinner';// filter spinner
var strROARControlsId = 'roar_controls';// roar controls box
var strROARFiltersId = 'roar_filters';// roar filters box
var strCategoryListId = 'filter_categories';// category list box
var strROARProfileId = 'roar_profile';// roar profile container
var strSearchResultsClassList = 'roar_results_list';// class name for list results style
var strSearchResultsClassItem = 'roar_results_item';// class name for single item results style
var strSearchResultsId = 'roar_results';// search results box
var strSortSelectId = 'filter_sortSelect';// sort selection list
var strStateSelectId = 'filter_stateSelect';// state selection list
var strPageStart = '/roar/profiles_start.php';// roar profiles start page
var strTagListId = 'filter_tagList';// list of selected tags


//-------------------------------------------------------------------
// load a roar profile
//-------------------------------------------------------------------
function loadROARProfile(intId, strName) {
	// add results update message

	setSearchResultsStyleItem();// set visual style of search results

	// will be replaced with results in callback function
	getObj(strSearchResultsId);
	// add search spinner to search results
	obj.innerHTML = ('<h3 style="text-align: center;">Loading Profile for ' + strName + ', please wait...<br/><img style="margin-top: .3em;" src="/images/ajax-loader-large.gif"/></h3>');

	var strRequest = app_path + '/ajax/ajaxDo_renderItem.php?class=ROARProfile&id=' + intId;
	sendRequest(strRequest, loadROARProfile_Callback);
}// function loadROARProfile

function loadROARProfile_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	// split result string into array elements
	var arrResults = s.split('$$$$$]');

	// first array element should be roar profile html
	// second array element should be roar profile id
	var intROARProfileId = arrResults[1];

	getObj(strSearchResultsId);
	obj.innerHTML = arrResults[0];// write roar profile html

	// update category list if visible
	getObj(strCategoryListId);
	if (obj.style.display == 'block') {// category list is visible; update it
		// add category update message
		showFilterSpinner();

		var strRequest = app_path + '/ajax/ajaxDo_getFilters.php?action=renderCategoryList';
		sendRequest(strRequest, updateCategoryList2_Callback);// don't toggle visibility of category list box
	}

	// get roar profile ajax data
	getPanelProject(intROARProfileId);
}// function loadROARProfile_Callback

function getPanelProject(profileID) {
    /**
     * Retrieve panel via ajax call
     */
	sendRequest('/roar/ajax/profile_related_projects.php?id=' + profileID, getPanelProject_Callback);
}// function getPanelProject

function getPanelProject_Callback(req) {
    /**
     * Handle callback data from the AJAX call
     */

    sProject = req.responseText;

    getObj('relatedProjects'); // this gets a reference to the DIV element as the global variable 'obj'
    obj.innerHTML = sProject; // replace contents of element
}// function getPanelProject_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get/set search query textbox
//-------------------------------------------------------------------
function getSearchQuery() {
	// return the value of the search textbox
	getObj('filter_searchBox');// lookup search textbox in document
	var strSearch = obj.value;// get search string
	return strSearch;
}// function getSearchQuery

function setSearchQuery(strSearch) {
	// set the value of the search textbox
	getObj('filter_searchBox');// lookup search textbox in document
	obj.value = strSearch;// set search string
}// function setSearchQuery
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get tag textbox
//-------------------------------------------------------------------
function getTag() {
	// return the value of the search textbox
	getObj('filter_tagBox');// lookup tag textbox in document
	var strTag = obj.value;// get tag string
	return strTag;
}// function getTag
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get/set state selection
//-------------------------------------------------------------------
function getStateSelection() {
	// return the value of the state selection option
	getObj(strStateSelectId);
	var intStateSelection = obj.value;// get selected state id
	return intStateSelection;
}// function getStateSelection
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get/set sort selection
//-------------------------------------------------------------------
function getSortSelection() {
	// return the value of the sort selection option
	getObj(strSortSelectId);
	var strSortSelection = obj.value;// get selected sort expression
	return strSortSelection;
}// function getSortSelection
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get/set type selection
//-------------------------------------------------------------------
function getTypeSelection(strCheckboxId) {
	// return the value of the type checkbox
	getObj(strCheckboxId);
	var intTypeSelection = obj.checked;// get selected state id

	return intTypeSelection;
}// function getTypeSelection
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// clear tags
//-------------------------------------------------------------------
function clearTags() {
	// clear tags
	var strRequest = app_path + '/ajax/ajaxDo.php?action=clearTags';

	// clear tag textbox
	getObj('filter_tagBox');// lookup tag textbox in document
	obj.value = '';

	// show loading message
	showFilterSpinner();

	sendRequest(strRequest, clearTags_Callback);
}// function clearTags

function clearTags_Callback(req) {
	// handle callback data from the ajax call

	var s = req.responseText;

	if (s != 'success') alert(s);// display message if error

	// hide loading message
	$('#'+strFilterLoaderId).hide('fast');

	// update tag list
	updateTagList();
}// function clearTags_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// clear search results
//-------------------------------------------------------------------
function clearSearchResults() {
	// function clears search results session variables

	// clear search box
	setSearchQuery('');

	// clear tags and tag textbox
	//clearTags();

	// add results update message
	// will be replaced with results in callback function

	getObj(strSearchResultsId);
	obj.innerHTML = strLoadSpinSearchClear;

	var strRequest = app_path + '/ajax/ajaxDo.php?action=clearSearchResults&reset=1';
	sendRequest(strRequest, clearSearchResults_Callback);
}// function clearSearchResults

function clearSearchResults_Callback(req) {
	// handle callback data from the ajax call

	var s = req.responseText;

	if (s != 'success') alert(s);// display message if error
	// reloading page so no need to ajax everything
	/*if (s == 'success') {// update search results
		// call next line to run search again
		//updateSearchResults('');// update search results with empty search string

		// update category list if visible
		getObj(strCategoryListId);
		if (obj.style.display == 'block') {// category list is visible; update it
			// add category update message
			$('#'+strFilterLoaderId).html(strLoadSpinSmall);
			$('#'+strFilterLoaderId).show('fast');

			var strRequest = app_path + '/ajax/ajaxDo_getFilters.php?action=renderCategoryList';
			sendRequest(strRequest, updateCategoryList2_Callback);// don't toggle visibility of category list box
		}

		// update search results
		getObj(strSearchResultsId);
		obj.innerHTML = strSearchEmptyHtml;// display empty search html

		// update controls box
		updateControls();
	}*/

	// redirect to start page
	window.location.href = strPageStart;
}// function clearSearchResults_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// remove tag
//-------------------------------------------------------------------
function removeTag(strTag) {
	// remove tag from tag list

	var strRequest = app_path + '/ajax/ajaxDo.php?action=removeTag&tag=' + strTag;
	sendRequest(strRequest, tagButton_click_Callback);
}// function removeTag

function removeTag_Callback(req) {
	// handle callback data from the ajax call

	var s = req.responseText;

	if (s != 'success') alert(s);// display message if error

	// update tag list
	updateTagList();
}// function removeTag_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// add tags
//-------------------------------------------------------------------
function tagButton_click(strTag) {
	// add tag to tag list
	if (!strTag) var strTag = getTag();// lookup new tag string from textbox if not supplied

	var strRequest = app_path + '/ajax/ajaxDo.php?action=addTag&newTag=' + strTag;
	sendRequest(strRequest, tagButton_click_Callback);
}// function tagButton_click

function tagButton_click_Callback(req) {
	// handle callback data from the ajax call

	var s = req.responseText;

	if (s != 'success') alert(s);// display message if error

	// clear tag textbox (don't leave added tag there)
	getObj('filter_tagBox');// lookup tag textbox in document
	obj.value = '';

	// update tag list
	updateTagList();
}// function tagButton_click_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// navigate back to grid view/homepage
//-------------------------------------------------------------------
function backButton_click(strRenderMode) {
	// clear some session values and navigate back to the homepage

	var strRequest = app_path + '/ajax/ajaxDo.php?action=clearProfile';
	sendRequest(strRequest, backButton_click_Callback);
}// function backButton_click

function backButton_click_Callback(req) {
	// handle the callback data from the ajax call

	var s = req.responseText;

	if (s != 'success') alert(s);// display message if error

	// navigate back to the homepage
	window.location.href = strPageStart + '?showall=1';
}// function backButton_click_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update search results
//-------------------------------------------------------------------
function searchButton_click() {
	// function handles the search procedure
	// that occurrs when a user clicks the search button
	var offsetResults = $('#roar_results').offset();

	$('#roar_results').fadeTo('slow', 0.20);// fade results
	$('#msg_search_load').show('fast');
	$('#msg_search_load').css({ 'left' : (offsetResults.left + (($('#roar_results').width() - $('#roar_search').width()) / 2)), 'top' : (offsetResults.top + 25) });

	// set page number back to 1
	var strRequest = app_path + '/ajax/ajaxDo.php?action=setCurrentPage&value=1';
	sendRequest(strRequest, searchButton_click_Callback1);
}// function searchButton_click

function searchButton_click_Callback1(req) {
	// next part of search procedure
	// update search results via ajax call

	var strSearch = getSearchQuery();// store search query

	// add results update message
	// will be replaced with results in callback function
		//	getObj(strSearchResultsId);
		//	obj.innerHTML = strLoadSpinSearch;// add search spinner to search results

	if (!strSearch) {// no search string supplied, use special search string to cause ajax script to clear the saved search string
		var strRequest = app_path + '/ajax/ajaxDo_search.php?action=ROARProfiles&search=';
	} else {// search string supplied, update search string and results
		var strRequest = app_path + '/ajax/ajaxDo_search.php?action=ROARProfiles&search=' + strSearch;
	}
	sendRequest(strRequest, searchButton_click_Callback2);
}// function searchButton_click_Callback1

function searchButton_click_Callback2(req) {
	// next part of search procedure

	// get callback data
	var s = req.responseText;

	// update search results box

	// hide loading message
	$('#msg_search_load').hide('fast');
	$('#roar_results').fadeTo('slow', 1);// show results

	// split result string into array elements
	// index 0 - search results
	// index 1 - javascript to display search results
	var arrResults = s.split('$$$$$]');

	getObj(strSearchResultsId);
	obj.innerHTML = arrResults[0];// add search results;

	// display search results
	//if (arrResults[1]) eval(arrResults[1]);

	// update category list if visible
	getObj(strCategoryListId);
	if (obj.style.display == 'block') {// category list is visible; update it
		// add category update message
		showFilterSpinner();

		var strRequest = app_path + '/ajax/ajaxDo_getFilters.php?action=renderCategoryList';
		sendRequest(strRequest, updateCategoryList2_Callback);// don't toggle visibility of category list box
	}

	updateControls();// update controls box
}// function searchButton_click_Callback2

function updateSearchResults(strSearch) {
	// function updates search results via ajax call
	// strSearch (string)			optional, the search string to use

	// add results update message
	// will be replaced with results in callback function
	getObj(strSearchResultsId);
	//var strHTML = obj.innerHTML;
	//obj.innerHTML = (strLoadSpinSearch + strHTML);// add search spinner above search results
	obj.innerHTML = strLoadSpinSearch;

	if (!strSearch) {// no search string supplied, just update search results
		var strRequest = app_path + '/ajax/ajaxDo_search.php?action=ROARProfiles';
	} else {// search string supplied, update search string and results
		var strRequest = app_path + '/ajax/ajaxDo_search.php?action=ROARProfiles&search=' + strSearch;
	}
	sendRequest(strRequest, updateSearchResults_Callback);
}// function updateSearchResults

function updateSearchResults_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	getObj(strSearchResultsId);
	obj.innerHTML = s;

	// update tag list
	//updateTagList();

	// update category list if visible
	getObj(strCategoryListId);
	if (obj.style.display == 'block') {// category list is visible; update it
		// add category update message
		showFilterSpinner();

		var strRequest = app_path + '/ajax/ajaxDo_getFilters.php?action=renderCategoryList';
		sendRequest(strRequest, updateCategoryList2_Callback);// don't toggle visibility of category list box
	}
}// function updateSearchResults_Callback

function setSearchResultsStyleItem() {
	// set visual style for search results to list
	getObj(strSearchResultsId);
	obj.className = strSearchResultsClassItem;
}// function setSearchResultsItem
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update state selection
//-------------------------------------------------------------------
function updateStateSelection() {
	// update selected state via ajax call

	// add update message
	showFilterSpinner();

	var intState = getStateSelection();// lookup state selection status in form
	var strRequest = app_path + '/ajax/ajaxDo.php?action=setStateSelection&state=' + intState;
	sendRequest(strRequest, updateStateSelection_Callback);// update session data
}// function updateStateSelection

function updateStateSelection_Callback() {
	// handle callback data from the ajax call
	// clear category update message
	$('#'+strFilterLoaderId).hide('fast');

	// update search results
	searchButton_click();
}// function updateStateSelection_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update type selection
//-------------------------------------------------------------------
function updateTypeSelection(strCheckboxId) {
	// update selected type filter via ajax call
	// strCheckboxId (string) name of type checkbox to update from

	// add update message
	showFilterSpinner();

	var blnType = getTypeSelection(strCheckboxId);// lookup type selection status in form
	var strRequest = app_path + '/ajax/ajaxDo.php?action=setTypeSelection&type=' + strCheckboxId + '&value=' + blnType;

	sendRequest(strRequest, updateTypeSelection_Callback);// update session data
}// function updateTypeSelection

function updateTypeSelection_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	// display callback data if not success
	if (s != 'success') alert(s);

	// clear filter update message
	$('#'+strFilterLoaderId).hide('fast');
}// function updateTypeSelection_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update tags
//-------------------------------------------------------------------
function updateTagList() {
	// return selected tags

	// display loading message
	getObj(strTagListId);
	obj.innerHTML = strLoadSpinSmall;

	var strRequest = app_path + '/ajax/ajaxDo.php?action=getTagList';
	sendRequest(strRequest, updateTagList_Callback);
}// function updateTagList

function updateTagList_Callback(req) {
	var s = req.responseText;

	getObj(strTagListId);
	obj.innerHTML = s;// write new tags to page
}// function updateTagList_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update category list
//-------------------------------------------------------------------
function updateCategoryList() {
	// get the category list box contents via ajax call

	// only update category list box if not visible
	getObj(strCategoryListId);
	if (obj.style.display != 'block') {// category list box is not visible - update it
		// add category update message
		showFilterSpinner();

		var strRequest = app_path + '/ajax/ajaxDo_getFilters.php?action=renderCategoryList';
		sendRequest(strRequest, updateCategoryList_Callback);
	} else {// just toggle visibility of category list box
		toggle(strCategoryListId, '/dios/images/menu/expand');
	}
}// function updateCategoryList

function updateCategoryList_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	// write category list to page
	getObj(strCategoryListId);
	obj.innerHTML = (s);// + strCategoryInstructions);// replace contents of category list box

	// clear category update message
	$('#'+strFilterLoaderId).hide('fast');

	// toggle visibility of category list box
	toggle(strCategoryListId, '/dios/images/menu/expand');
}// function updateCategoryList_Callback

function updateCategoryList2_Callback(req) {
	// handle callback data from the ajax call
	// don't toggle visible status of category list
	var s = req.responseText;

	// write category list to page
	getObj(strCategoryListId);
	obj.innerHTML = s;// + strCategoryInstructions;// replace contents of category list box

	// clear category update message
	$('#'+strFilterLoaderId).hide('fast');
}// function updateCategoryList2_Callback

function updateFiltersCat(intCatId) {
	// toggle hidden checkbox to store local state
	getObj('chkCat'+intCatId);
	if (obj.checked) {// uncheck checkbox
		obj.checked = false;
	} else {// check checkbox
		obj.checked = true;
	}

	var status = obj.checked;

	// set category with id intCatId status to status of checkbox catChk+intCatId
	getObj('chkCat'+intCatId);
	var strRequest = app_path + '/ajax/ajaxDo.php?action=setCategoryStatus&catId=' + intCatId + '&status=' + status;

	// update visual selection
	getObj('catItem'+intCatId);

	if (status) {// selected
		obj.className += ' category-selected';// add hilight class
	} else {// deselected
		var strClassName = obj.className;// create string from classname string
		strClassName = strClassName.replace(/ category-selected/gi, '');// remove hilight class
		obj.className = strClassName;// update classname from string
	}

	// add category update message
	//showFilterSpinner();

	sendRequest(strRequest, updateFiltersCat_Callback);
}// function updateFiltersCat

function updateFiltersCat_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	// display callback data if not success
	if (s != 'success') alert(s);

	// clear category update message
	$('#'+strFilterLoaderId).hide('fast');
}// function updateFiltersCat_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update sort selection
//-------------------------------------------------------------------
function updateSortSelection() {
	// update selected sort expression via ajax call

	// add update message
	showFilterSpinner();

	var strSort = getSortSelection();// lookup sort selection status in form
	var strRequest = app_path + '/ajax/ajaxDo.php?action=setSortSelection&sort=' + strSort;
	sendRequest(strRequest, updateSortSelection_Callback);// update session data
}// function updateSortSelection

function updateSortSelection_Callback(req) {
	// handle callback data from the ajax call
	// clear category update message
	$('#'+strFilterLoaderId).hide('fast');

	// handle callback data from the ajax call
	var s = req.responseText;

	// display callback data if not success
	if (s != 'success') alert(s);

	// update search results
	searchButton_click();
}// function updateSortSelection_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update current page
//-------------------------------------------------------------------
function updateCurrentPage(intPageNum) {
	// update the current page of search results and updates search results
	// intPageNum (integer)		the current page of search results

	var strRequest = app_path + '/ajax/ajaxDo.php?action=setCurrentPage&value=' + intPageNum;
	sendRequest(strRequest, updateCurrentPage_Callback);
}// function updateCurrentPage

function updateCurrentPage_Callback(req) {
	// handle callback data from the ajax call
	var s = req.responseText;

	// display callback data if not success
	if (s != 'success') alert(s);

	updateSearchResults();// update search results window
	updateControls();// update controls box
}// function updateCurrentPage_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update filters box
//-------------------------------------------------------------------
function updateFilters() {
	// update the filters box

	// show loading message
	getObj(strROARFiltersId); // load filters element
	obj.innerHTML = strLoadSpin;// show loading spinner

	var strRequest = app_path + '/ajax_getFilters.php';

	sendRequest(strRequest, updateFilters_Callback);
}// function updateFilters

function updateFilters_Callback(req) {
	// handle callback data from the AJAX call
	var s = req.responseText;

	// display callback data if not success
	if (s != 'success') alert(s);

	getObj(strROARFiltersId); // load filters element
	obj.innerHTML = s; // replace contents of report element
}// function updateFilters_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// update controls box
//-------------------------------------------------------------------
function updateControls() {
	// update the controls box

	// show loading message
	getObj(strROARControlsId); // load controls element
	obj.innerHTML = strLoadSpinControls;// show loading spinner

	var strRequest = app_path + '/ajax/ajaxDo_getControls.php';

	sendRequest(strRequest, updateControls_Callback);
}// function updateControls

function updateControls_Callback(req) {
	// handle callback data from the AJAX call
	var s = req.responseText;

	getObj(strROARControlsId); // load controls element
	obj.innerHTML = s; // replace contents of report element
}// function updateControls_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// spinners
//-------------------------------------------------------------------
function showFilterSpinner() {
	// show the filters box loading spinner
	$('#'+strFilterLoaderId).html(strLoadSpinSmall);
	$('#'+strFilterLoaderId).show('fast');
}// function showFilterSpinner
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// get status of elements of the roar profiles search page
//-------------------------------------------------------------------
function getStatusElements() {
	/**
	 * Retrieve visible status of elements on ROAR Profiles search page
	 */
	var strRequest = app_path + '/ajax/ajaxDo.php?action=getStatusElements';
	sendRequest(strRequest, getStatusElements_Callback);
}// function getStatusElements

function getStatusElements_Callback(req) {
	/**
	 * Handle callback data from the AJAX call
	 */

	var s = req.responseText;

	// split result string into array elements
	var arrResults = s.split(',');

	for (strElement in arrResults) {// loop through array of elements to hide
		toggle(arrResults[strElement], '', 'hide');// hide element
	}
}// function getStatusElements_Callback
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// timer function for roar profile search results on search page
//-------------------------------------------------------------------
function mouseOutTimer(strId, bolSearchQuery, bolShrinkPhoto) {
	// hide more information with id strId if more information box is visible
	// timer event has fired so mouseout event has been 'de-bounced'; therefore
	// hide more information
	// only hide more details if no query string (eg. bolQueryString < 1)
	if ($('#roarProfileListMore' + strId).is(':visible')) {// more information box visible
		if (bolSearchQuery > 0) $('#roarProfileListMoreDetails' + strId).slideUp('fast');// hide more details
		$('#roarProfileListMore' + strId).slideUp('fast');// hide more information
		if (bolShrinkPhoto > 0) $('#roarProfilePhoto' + strId).animate({width: '30px', marginRight: 20}, 'fast');// return photo to original size
		$('#roarProfileList' + strId).css('background-image', 'none');// remove background image from roar search result
	}
}// function mouseOutTimer
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// global functions
//-------------------------------------------------------------------
function addLoadHandler(handler)
{
	if(window.addEventListener)
	{
		window.addEventListener('load', handler, false);
	}
	else if(window.attachEvent)
	{
		window.attachEvent('onload', handler);
	}
	else if(window.onload)
	{
		var oldHandler = window.onload;
		window.onload = function piggyback()
		{
			oldHandler();
			handler();
		};
	}
	else
	{
		window.onload = handler;
	}
}// function addLoadHandler

function addUnloadHandler(handler)
{
	if(window.addEventListener)
	{
		window.addEventListener('unload', handler,false);
	}
	else if(window.attachEvent)
	{
		window.attachEvent('onunload', handler);
	}
	else if(window.onunload)
	{
		var oldHandler = window.onunload;
		window.onunload = function piggyback()
		{
			oldHandler();
			handler();
		};
	}
	else
	{
		window.onunload = handler;
	}
}// function addUnloadHandler

function getKeyCode() {
	var intKeyCode = 0;

	intKeyCode = window.event.keyCode;

	return intKeyCode;
}// function getKeyCode

function isDefined(variable) {
	if (typeof(variable) != 'undefined') {
		return true;
	} else {
		return false;
	}
}// function isDefined

function toggle(strId, imgUrl, strState) {
	/*
	 * Versatile toggle function, takes id of element to toggle it's display: block/none
	 *
	 * Looks for another element with the id 'button' + strId to switch its src property
	 * between /dios/images/arrowDown.gif (hidden) and /dios/images/arrowUp.gif (visible)
	 * (or a custom image may be supplied to imgUrl as full image URL without filename
	 * extension, and will toggle between imgUrl + 'Up.gif' and imgUrl + 'Down.gif')
	 *
	 * example is of an element which will start hidden
	 *
	 * example - button:
	 * <img id="indMoreDetailsButton" src="/dios/images/expandDown.gif" onclick="toggle('indMoreDetails', '/dios/images/menu/expand');" class="cursor-link"/>
	 *
	 * example - element to toggle:
	 * <div id="indMoreDetails" class="item_text" style="display: none;">
	 *
	 * strState		- optional, may be one of 'show' or 'hide' to set the display style of the element and button
	 */

	var imgUp = '';
	var imgDown = '';
	var objId = document.getElementById(strId);

	if (!imgUrl) { // no image supplied, use default
		imgUp = '/dios/images/arrowUp.gif';
		imgDown = '/dios/images/arrowDown.gif';
	} else { // use image supplied
		imgUp = imgUrl + 'Up.gif';
		imgDown = imgUrl + 'Down.gif';
	}

	if (!objId) return false; // unable to load element

	objButton = document.getElementById(strId + 'Button');

	// check for optional specified state
	if (strState===undefined) { // no optional state specified
		// toggle element state using jquery fast slide
		if ($('#' + strId).is(':hidden')) {// show element, up arrow
			$('#' + strId).slideDown('fast');// show
			if (objButton) { // button object exists
				objButton.src = imgUp;
			}
		} else {// hide element, down arrow
			$('#' + strId).slideUp('fast');// hide
			if (objButton) { // button object exists
				objButton.src = imgDown;
			}
		}
		/*if (objId.style.display == 'none') { // show element, up arrow
			objId.style.display = 'block';
			if (objButton) { // button object exists
				objButton.src = imgUp;
			}
		} else { // hide element, down arrow
			objId.style.display = 'none';
			if (objButton) { // button object exists
				objButton.src = imgDown;
			}
		}*/
	} else { // optional state specified
		if (strState == 'show') { // show element and button
			$('#' + strId).slideDown('fast');// show
			/*objId.style.display = 'block';*/
			if (objButton) { // button object exists
				objButton.src = imgUp;
			}
		} else { // hide element and button
			$('#' + strId).slideUp('fast');// hide
			/*objId.style.display = 'none';*/
			if (objButton) { // button object exists
				objButton.src = imgDown;
			}
		}
	}

	return false;
}// function toggle

/**
 * quirksmode
 */

function cancelEvent(e) {
	// cancel event bubbling (cross-browser)
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}// function cancelEvent

/* XMLHTTP */

function sendRequest(url,callback,postData,wait) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304) {
//			alert('HTTP error ' + req.status);
			return;
		}
		callback(req);
	}
	if (req.readyState == 4) return;
	req.send(postData);
}

function XMLHttpFactories() {
	return [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];
}

function createXMLHTTPObject() {
	var xmlhttp = false;
	var factories = XMLHttpFactories();
	for (var i=0;i<factories.length;i++) {
		try {
			xmlhttp = factories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

function getObj(name) {
	if (document.getElementById)
	{
		obj = document.getElementById(name);
		if (!obj) alert('Unable to load object with name: [' + name + ']');
		this.style = document.getElementById(name).style;
	}
	else if (document.all)
	{
		this.obj = document.all[name];
		this.style = document.all[name].style;
	}
	else if (document.layers)
	{
		this.obj = getObjNN4(document,name);
		this.style = this.obj;
	}
}

function getObjNN4(obj, name) {
	var x = obj.layers;
	var foundLayer;
	for (var i=0;i<x.length;i++)
	{
		if (x[i].id == name)
		foundLayer = x[i];
		else if (x[i].layers.length)
		var tmp = getObjNN4(x[i],name);
		if (tmp) foundLayer = tmp;
	}
	return foundLayer;
}

function getElementsByTagNames(list, obj) {
	if (!obj) obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}

function addEventSimple(obj,evt,fn) {
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}

function removeEventSimple(obj,evt,fn) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,false);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}