var win

function SortBy(sort)
{	var form = document.forms[0]
	
	if (form.txtSort.value != sort)
	{	form.txtSort.value = sort
	}
	else //Change direction
	{	if (form.txtSortDir.value == "asc")
		{	form.txtSortDir.value = "desc"
		}
		else
		{	form.txtSortDir.value = "asc"
		}
	}
	form.submit()
}

function GetObjRef(item)
{	if (document.getElementById)
	{	return document.getElementById(item)
	}
}

function GetObjStyle(item)
{	if (typeof item == "string")
	{item = GetObjRef(item)}
	
	if (item.style)
	{return item.style}
	else if (document.all)
	{return document.all.item.style}
}

function GetSubMenu()
{	subMenu = new GetObjectRef("SubMenu")
	subMenu.style.visibility = "visible"
}

function ChangeHeight(item, height)
{	GetObjStyle(item).height = height +"px"
}

function ToggleBox(box)
{	var arrow = box.rows[0].cells[1].childNodes[0]
	var boxContent = GetNextSibling(box)

	if (boxContent.className == "ShowBoxContent")
	{	arrow.src = "/images/arrows/arrowdown.gif"
		boxContent.className = "HideBoxContent"
	}
	else
	{	arrow.src = "/images/arrows/arrowup.gif"
		boxContent.className = "ShowBoxContent"
	}
}

function ToggleDropDown(branch)
{	var details = GetNextSibling(branch.parentElement.parentElement.parentElement.parentElement)
	if (details.className == "Visible") //Currently expanded
	{	details.className = "Hidden"
		branch.src = "/images/tree/collapsed.jpg"
	}
	else
	{	details.className = "Visible"
		branch.src = "/images/tree/expanded.jpg"
	}
}

function ToggleBranch(img)
{	var branch = GetParent(img).nextSibling
	if (branch.className == "Visible")
	{	branch.className = "Hidden"
		img.src = "/images/tree/collapsed.jpg"
		
		//Collapse any expanded child branches
		var children = branch.getElementsByTagName("img")
		for (var i=0; i<children.length; i++) 
		{	if (children[i].src.indexOf("expanded.jpg") != -1)
			{	ToggleBranch(children[i])
			}
		}
	}
	else
	{	branch.className = "Visible"
		img.src = "/images/tree/expanded.jpg"
	}
}


//Firefox fix for nextSibling
function GetNextSibling(startBrother)
{	endBrother = startBrother.nextSibling
	while(endBrother.nodeType != 1)
	{endBrother = endBrother.nextSibling}
	return endBrother
}

function AddLoadEvent(func)
{	var oldonload = window.onload
	if (typeof window.onload != 'function')
	{window.onload = func}
	else
	{	window.onload = function()
		{	oldonload()
			func()
		}
	}
}

function EnterKeyWasHit(evt)	
{	evt = (evt) ? evt : event
	if (evt.which || evt.keyCode)
	{	if ((event.which == 13) || (event.keyCode == 13))
		{	return true
		}
	}
	else
	{	return false
	}
}

function SelectListItem(list, option)
{	for (var i=0; i<list.length; i++)
	{	if (list.options[i].value == option)
		{	list.selectedIndex = i
			break
		}
	}
}

function SaveScroll()
{	if (document.documentElement && document.documentElement.scrollTop)
	{var top = document.documentElement.scrollTop}
	else if (document.body)
	{var top = document.body.scrollTop}
	
	if (top) {GetObjRef("txtScroll").value = top}
}

//Only 1 box in the group (name) can be checked
function LimitGroupToOne(chkBox)
{	if (chkBox.checked) //Box was checked, not unchecked
	{	var i, controls = chkBox.form.elements
		for (i=0; i<controls.length; i++)
		{	if (controls[i].className == chkBox.className && controls[i].id != chkBox.id)
			{controls[i].checked = false}
		}
	}
}

function PopWin(evt, page, winW, winH)
{	var winL = null
	var winT = null
	
	if (evt)
	{	if (evt.screenX)
		{	winL = evt.screenX
			winT = evt.screenY
		}
		else if (window.event.screenX)
		{	winL = window.event.screenX
			winT = window.event.screenY
		}
		
		//Adjust window if it runs off the screen
		if ((winL + winW) > screen.width) //Move window left
		{	winL = (winL - winW)
		}
		if ((winT + winH) > screen.height) //Move window up
		{	winT = (winT - winH)
		}
	}
	if (winL == null)
	{	winL = (screen.width - winW) / 2
		winT = (screen.height - winH) / 2
	
	}
	
	var props = "scrollbars=yes,"
	props += "menubar=no,"
	props += "resizable=yes,"
	props += "status=no,"
	props += "titlebar=no,"
	props += "toolbar=no,"
	props += "location=no,"
	props += "height=" + winH + ","
	props += "width=" + winW + ","
	props += "left=" + winL + ","
	props += "top=" + winT 
	
	if (win && ! win.closed) {win.close()}
	win = window.open(page, null, props)
}

function GetCalendar(evt, dateBox)
{	var sdate = document.getElementById(dateBox).value
	var url = "/common/calendar.aspx?b=" + dateBox
	var monthYear = GetMonthYear(sdate)
	if (monthYear != "") {url += monthYear}
	
	PopWin(evt, url, 250, 160)
}

function GetMonthYear(sDate)
{	if (sDate == "")
	{return ""}
	
	var dateParts = sDate.split("/")
	if (dateParts.length != 3)
	{return ""}
	
	var m = dateParts[0]
	var d = dateParts[1]
	var y = dateParts[2]
	
	if (isNaN(m) || isNaN(d) || isNaN(y))
	{return ""}
	
	if (m < 1 || m > 12)
	{return ""}
	
	if (d < 1 || d > 31)
	{return ""}
	
	if (y.length != 4)
	{return ""}
	
	return "&m=" + m + "&y=" + y

}

function GetMonthName(m)
{	var mNames = new Array()
	mNames[0] = ""
	mNames[1] = "January"
	mNames[2] = "February"
	mNames[3] = "March"
	mNames[4] = "April"
	mNames[5] = "May"
	mNames[6] = "June"
	mNames[7] = "July"
	mNames[8] = "August"
	mNames[9] = "September"
	mNames[10] = "October"
	mNames[11] = "November"
	mNames[12] = "December"
	
	return mNames[m]
}

function ToggleVisible(what)
{	nextItem = GetNextSibling(what)
	
	if (nextItem.className == "Visible")
	{	nextItem.className = "Hidden"
	}
	else
	{	nextItem.className = "Visible"
	}
}

function HideAllChildren(parent)
{	if (parent.hasChildNodes())
	{	for (var i=0; i<parent.childNodes.length; i++)
		{HideAllChildren(parent.childNodes[i])}
	}
	if (parent.className == "Visible") parent.className = "Hidden"
}

//Trims all leading and trailing white space from a string
function Trim(stringToTrim)
{	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

function UpdateCharCounter(box, label, maxLength)
{	if (box.value.length > maxLength)
	{box.value = box.value.substr(0, maxLength)}
	
	var chars = box.value.length
	var objLabel = GetObjRef(label)
	objLabel.innerHTML = "Characters: " + chars + "/" + maxLength
}

function GetCharCode(evt)
{	var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0))
	return charCode
}


//Returns true if the key being hit is a number or a period and if the number or period
//will not make the end result have too many decimal places
function MaskDecimal(evt, maxDecimalPlaces)
{	evt = (evt) ? evt : event
    
    if (evt.srcElement)
	{	var value = evt.srcElement.value
	}
	else if (evt.target)
	{	var value = evt.target.value
	}
	else
	{	return true
	}
	
	var decimalLoc = value.indexOf(".")
	var charCode = GetCharCode(evt)
    
    if (charCode > 31 && (charCode < 48 || charCode > 57)) //Not a number
    {	if (charCode == 46) //Period entered
		{	if (decimalLoc != -1) //Period already exists
			{	return false
			}
		}
		else //Not a number or a period
		{	return false
		}
    }
    else //Number entered
	{	if (decimalLoc != -1) //Period exists
		{	if ((value.length - decimalLoc) > maxDecimalPlaces)
			{	return false
			}
		}
	}
    return true
}




//Used on textboxes to ensure that only numbers and a period can be entered
//Example: <input type="text" onkeypress="return MaskNumbers(event)">
function MaskNumbers(evt)
{	evt = (evt) ? evt : event
    var charCode = GetCharCode(evt)
    if (charCode > 31 && (charCode < 48 || charCode > 57)) //Not a number
    {	if (charCode == 46) //Period
		{	return true
		}
		else
		{	return false
		}
    }
    return true
}

//Used on textboxes to ensure that only numbers and a forward slash can be entered
function MaskDate(evt)
{	evt = (evt) ? evt : event
    var charCode = GetCharCode(evt)
    if (charCode > 31 && (charCode < 47 || charCode > 57)) //47 = forward slash
    {	return false
    }
    else
	{	if (evt.srcElement)
		{	if (evt.srcElement.value.length == 10) //Char max = 10 (12/30/2007)
			{	return false
			}
		}
		else if (evt.target)
		{	if (evt.target.value.length == 10)
			{	return false
			}
		}
	}
	return true
}

//Used on textboxes to ensure that only numbers, a space, or the characters[: A M P] can be entered
function MaskTime(evt)
{	evt = (evt) ? evt : event
	var box = EventSrcElement(evt)
	
	var charCode = GetCharCode(evt)
    var c = String.fromCharCode(charCode).toUpperCase()
    if (isNaN(parseInt(c))) //Char is not a number
    {	if (box.value == "") //The first char in the box must be a number
		{	return false
		}
		switch (c) //All numbers and only these chars are acceptable
		{	case "":
			case " ":
			case ":":
			case "A":
			case "M":
			case "P":
			if (box.value.indexOf(c) == -1) //And this char does not already exists
			{	return true
			}		
		}
		return false
    }
    else //Char is a number
    {	c = parseInt(c)
		if (box.value == "" && c == 0) //The first number in the box cannot be zero
		{	return false
		}
		if (box.value.length == 1) //There is already a number in the box
		{	if (parseInt(box.value) == 1) //And that number is 1
			{	if (c > 2) //Hour cannot be greater than 12
				{	return false
				}
			}
			else //Example: 27
			{	return false
			}
		}
		return true
    }
}

//Together with the help of the MaskTime function (above), DetermineAndFormatTime makes a best guess at
//what the time is supposed to be and returns that guess.  For example, a time of 1 is returned as 1:00 PM
function DetermineAndFormatTime(time)
{	time = time.toUpperCase()
	
	if (time == "")
	{	return ""
	}
	
	var timeParts, hour, minute
	if (time.indexOf(":") != -1) //A : was found
	{	timeParts = time.split(":")
		if (isNaN(parseInt(timeParts[0]))) //Cannot determine the hour
		{	return ""
		}
		else
		{	hour = parseInt(timeParts[0])
		
		}
		if (isNaN(parseInt(timeParts[1])))
		{	minute = "00"
		}
		else
		{	minute = parseInt(timeParts[1])
			if (minute < 10)
			{	minute = "0" + minute
			}
		}
	}
	else
	{	minute = "00"
		if (! isNaN(parseInt(time.substr(0,2)))) //first 2 chars are the hour
		{	hour = parseInt(time.substr(0,2))		
		}
		else if (! isNaN(parseInt(time.substr(0,1)))) //first char is the hour
		{		hour = parseInt(time.substr(0,1))		
		}
		else //Cannot determine the hour
		{	return ""
		}	
	}
	
	var meridiem
	if (time.indexOf("A") != -1) //A was found
	{	meridiem = " AM"
	}
	else if (time.indexOf("P") != -1) //P was found
	{	meridiem = " PM"
	}
	else
	{	if (hour > 6 && hour < 12) //7 8 9 10 11
		{	meridiem = " AM"
		}
		else
		{	meridiem = " PM"
		}
	}
	
	return hour + ":" + minute + meridiem
}



//Returns true if date is valid and formatted as m/d/yyyy
function ValidDate(sDate)
{	var dateParts = sDate.split("/")
	if (dateParts.length != 3) {return false}
	
	m = dateParts[0]
	d = dateParts[1]
	y = dateParts[2]
	
	//Validate month
	if (isNaN(m)) {return false}
	m = parseInt(m)
	if (m < 1 || m > 12) {return false}
	
	//Validate year
	if (isNaN(y)) {return false}
	if (y.length != 4) {return false}
	y = parseInt(y)
	if (y < 1) {return false}
	
	//Validate day
	if (isNaN(d)) {return false}
	d = parseInt(d)
	if (d < 1 || d > DaysInMonth(m-1, y)) {return false}
	
	return true
}

//Returns true if time is valid and formatted as "9:00 AM"
function ValidTime(time)
{	//Ensure time is not blank and has no leading or trailing spaces
	if (time == "") {return false} //Blank
	if (time.substr(0,1) == " ") {return false}
	if (time.substr(time.length -1) == " ") {return false}
	
	//Ensure time has a space between the time and AM/PM and a colon in the time 
	var timeParts = time.split(" ")
	if (timeParts.length != 2) {return false}
	var hourMinute = timeParts[0].split(":")
	if (hourMinute.length != 2) {return false}
	
	//Validate hour
	if (isNaN(hourMinute[0])) {return false}
	if (hourMinute[0] < 1 || hourMinute[0] > 12) {return false}
	
	//Validate minute
	if (isNaN(hourMinute[1])) {return false}
	if (hourMinute[0] < 0 || hourMinute[0] > 59) {return false}

	//Validate AM/PM
	if (timeParts[1].toUpperCase() != "AM" && timeParts[1].toUpperCase() != "PM") {return false}
	
	return true
}

//Javascript months are 0 based so January is 0 not 1
function DaysInMonth(m, y)
{	return 32 - new Date(y, m, 32).getDate()
}

// Start AJAX helper functions
function CreateXmlHttpRequestObject()
{	var xmlHttpObject
	try
	{	xmlHttpObject = new XMLHttpRequest()
	}
	catch (e)
	{	try
		{	xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP")
		}
		catch (e)
		{	try
			{	xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP")
			}
			catch (e)
			{	xmlHttpObject = null
			}
		}
	}
	return xmlHttpObject
}

function GetXmlResponse(xmlRequest)
{	var xml
	try
	{	xml = new ActiveXObject("Microsoft.XMLDOM")
		xml.async = "false"
		xml.loadXML(xmlRequest.responseText)
	}
	catch (e)
	{	try
		{	xml = xmlRequest.responseXML
		}
		catch (e)
		{	xml = null
		}
	}
	return xml
}

function GetNodeValue(parent, tag)
{	return parent.getElementsByTagName(tag)[0].firstChild.nodeValue;
}




