﻿//-----------------------------------------------------------------------------------
//	Module:		Dropbox.js
//	Purpose:	Provides client side support routines for DropBox control
//	History:
//		070906 JLB	Created file
//-----------------------------------------------------------------------------------

var m_blnIE  = ((navigator.appName.indexOf("Microsoft") != -1) && (navigator.userAgent.toLowerCase().indexOf("opera") == -1));
var m_objDiv = null;

/*---------------------------------------------------------------------------------
	Function:		DropBoxShowHide
	Purpose:		Shows and hides a drop box
	---------------------------------------------------------------------------------*/

function DropBoxShowHide(strId)
{
	m_objDiv = document.getElementById(strId);
	if (m_objDiv == null)
		alert("No division called " + strId);
	else if (m_objDiv.style.display == 'none') {
		m_objDiv.style.display = '';
		if (m_blnIE)
			document.body.onmousedown = function() { DropBoxMouseDown(event); }
		else
			document.body.addEventListener("mousedown",DropBoxMouseDown,true);
		var objListBox = GetFirstChild(m_objDiv);
		if ((objListBox != null) && (objListBox.tagName == "SELECT")) {
			if (m_blnIE) {
				objListBox.onchange = function() { DropBoxSelectChange(event); }
				objListBox.onkeydown = function() { DropBoxSelectKeyDown(event); }
				objListBox.onclick = function() { DropBoxSelectClick(event); }
				objListBox.onblur = function() { DropBoxSelectBlur(event); }
			}
			else {
				objListBox.addEventListener("change",DropBoxSelectChange,true);
				objListBox.addEventListener("keydown",DropBoxSelectKeyDown,true);
				objListBox.addEventListener("click",DropBoxSelectClick,true);
				objListBox.addEventListener("blur",DropBoxSelectBlur,true);
			}
			objListBox.focus();
		}
	}
	else {
		m_objDiv.style.display = 'none';
		document.body.onmousedown = null;
	}
} //DropBoxShowHide

/*---------------------------------------------------------------------------------
	Function:		DropBoxMouseDown
	Purpose:		Mouse button clicked on page
	---------------------------------------------------------------------------------*/

function DropBoxMouseDown(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	while ((objSrcElement != null) &&  (m_objDiv != objSrcElement))
		objSrcElement = objSrcElement.parentNode;
	if (objSrcElement == null) {
		m_objDiv.style.display = 'none';
		document.body.onmousedown = null;
	}
} //DropBoxMouseDown

/*---------------------------------------------------------------------------------
	Function:		DropBoxKeyDown
	Purpose:		Key pressed in edit window
	---------------------------------------------------------------------------------*/

function DropBoxKeyDown(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	switch (objEvent.keyCode) {
		case 40:
			//Display drop down list
			var objDiv = GetNextSibling(objSrcElement.parentNode.parentNode.parentNode.parentNode);
			if ((objDiv != null) && (objDiv.id != null) && (objDiv.id != ""))
				DropBoxShowHide(objDiv.id);
			objEvent.returnValue = false;
			if (objEvent.preventDefault)
				objEvent.preventDefault(); 
			break;
			
		case 9:
		case 16:
			//Allow tab and shift through
			objEvent.returnValue = true;
			break;
			
		default:
			//Stop all other keys
			//alert(objEvent.keyCode);
			objEvent.returnValue = false;
			if (objEvent.preventDefault)
				objEvent.preventDefault(); 
			break;
	} //switch
	//return (!objEvent.returnValue);
	return true;
} //DropBoxKeyDown

/*---------------------------------------------------------------------------------
	Function:		DropBoxSelectChange
	Purpose:		Selection changed in list window
	---------------------------------------------------------------------------------*/

function DropBoxSelectChange(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	var objDiv = objSrcElement.parentNode;
	var objInput = null;
	var objTable = GetPreviousSibling(objDiv);
	objInput = GetFirstChild(GetFirstChild(GetFirstChild(GetFirstChild(objTable))));
	if (objSrcElement.selectedIndex != -1)
		objInput.value = objSrcElement.options[objSrcElement.selectedIndex].innerHTML;
} //DropBoxSelectChange

/*---------------------------------------------------------------------------------
	Function:		DropBoxSelectKeyDown
	Purpose:		Key pressed in list window
	---------------------------------------------------------------------------------*/

function DropBoxSelectKeyDown(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	if (objEvent.keyCode == 13) {
		var objDiv = objSrcElement.parentNode;
		var objInput = null;
		var objTable = GetPreviousSibling(objDiv);
		objInput = GetFirstChild(GetFirstChild(GetFirstChild(GetFirstChild(objTable))));
		objInput.select();
		objInput.focus();
		objEvent.returnValue = false;
	}
	return true;
} //DropBoxSelectKeyDown

/*---------------------------------------------------------------------------------
	Function:		DropBoxSelectClick
	Purpose:		Mouse click in list window
	---------------------------------------------------------------------------------*/

function DropBoxSelectClick(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	var objInput = null;
	var objDiv = objSrcElement.parentNode;
	if (objDiv.tagName == "DIV")
		objInput = GetFirstChild(GetFirstChild(GetFirstChild(GetFirstChild(GetPreviousSibling(objDiv)))));
	else {
		var objTable = GetPreviousSibling(GetPreviousSibling(objDiv.parentNode));
		objInput = GetFirstChild(GetNextSibling(GetFirstChild(GetFirstChild(GetNextSibling(GetFirstChild(objTable))))));
	}
	objInput.select();
	objInput.focus();
	objEvent.returnValue = false;
	return true;
} //DropBoxSelectClick

/*---------------------------------------------------------------------------------
	Function:		DropBoxSelectBlur
	Purpose:		Focus leaving list window
	---------------------------------------------------------------------------------*/

function DropBoxSelectBlur(objEvent)
{
	if (objEvent == null)
		objEvent = window.top.event;
	var objSrcElement = (objEvent.target) ? objEvent.target : objEvent.srcElement;
	var objDiv = objSrcElement.parentNode;
	if (objDiv.style.display != 'none')
		DropBoxShowHide(objDiv.id);
	return true;
} //DropBoxSelectBlur

/*---------------------------------------------------------------------------------
	Function:		GetFirstChild
	Purpose:		Gets first child element node
	---------------------------------------------------------------------------------*/

function GetFirstChild(objObject)
{
	objObject = objObject.firstChild;
	if ((objObject != null) && (objObject.nodeType == 3))
		objObject = GetNextSibling(objObject);
	return objObject;
} //GetFirstChild
		
/*---------------------------------------------------------------------------------
	Function:		GetNextSibling
	Purpose:		Gets next element node
	---------------------------------------------------------------------------------*/

function GetNextSibling(objObject)
{
	objObject = objObject.nextSibling;
	while ((objObject != null) && (objObject.nodeType == 3))
		objObject = objObject.nextSibling;
	return objObject;
} //GetNextSibling
		
/*---------------------------------------------------------------------------------
	Function:		GetPreviousSibling
	Purpose:		Gets previous element node
	---------------------------------------------------------------------------------*/

function GetPreviousSibling(objObject)
{
	objObject = objObject.previousSibling;
	while ((objObject != null) && (objObject.nodeType == 3))
		objObject = objObject.previousSibling;
	return objObject;
} //GetPreviousSibling
		
