var numbs       = '0123456789';
var lowerAlpha  = 'abcdefghijklmnopqrstuvwxyz';
var upperAlpha  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 
function IsStringEmpty(val)
{
    if (null == val)
        return true;
        
    var trimmed = TrimString(val);
    return 0 == trimmed.length; 
}

function StringContains(str, toFind)
{
    if (IsStringEmpty(str))
        return false;
        
    if (IsStringEmpty(toFind))
        return false;
        
    return -1 != str.indexOf(toFind);
}

function IsPartValid(parm, val)
{
    if (null == parm || parm.Length == 0)
        return false;
        
	for (i=0; i<parm.length; i++) 
	{
		if (val.indexOf(parm.charAt(i),0) != -1)
		    return true;
	}
	
	return false;
}
 
function HasNumber(parm) 
{
    return IsPartValid(parm,numbs);
}

function HasLower(parm)
{
    return IsPartValid(parm,lowerAlpha);
}

function HasUpper(parm)
{
    return IsPartValid(parm,upperAlpha);
}

function IsNumberValid(item)
{
	var sText = item.value;
	var ValidChars = ".0123456789";
	var IsNumber=true;
	var Char;

	for (i = 0; i < sText.length && IsNumber == true; i++)
	{
		Char = sText.charAt(i);
		
		if (ValidChars.indexOf(Char) == -1)
			return false;
	}

	return true;
}

function IsNumericValid(value)
{
	var sText = value;
	var ValidChars = ".0123456789";
	var Char;

    if (null == sText)
        return false;
        
	for (i = 0; i < sText.length; i++)
	{
		Char = sText.charAt(i);
		
		if (ValidChars.indexOf(Char) == -1)
			return false;
	}

	return true;
}

function IsFieldEmpty( textObj )
{
	if( textObj.value.length == 0 )
		return true;
	for( var i = 0; i < textObj.value.length; ++i )
	{
		var ch = textObj.value.charAt(i);
		if( ch != ' ' && ch != '\t' )
			return false;
	}

	return true;
}

function IsEmailValid(em)
{
   var aPos = em.value.indexOf("@");
   var dPos = em.value.lastIndexOf(".");
   var len  = em.value.length;

   return (dPos > aPos) && (dPos != (len -1)) && (aPos > 0);
}

function IsDateValid(date)
{
	var ents = date.value.split('/');
	var dd   = new Date();
	var curYear = dd.getFullYear();

	if (null == ents || ents.length != 3)
		return false;

	return (((ents[0] > 0) && (ents[0] <= 12)) && ((ents[1] > 0) && (ents[1] <= 31)) && ((ents[2] >= 1900)));
}

function IsDateTime(time)
{
	var ents = time.value.split(':');

	if (null == ents || ents.length != 3)
		return false;

	return (ents[0] > 0 && ents[0] <= 24) && (ents[1] > 0 && ents[1] <= 60) && (ents[2] > 0 && ents[2] <= 60) ;
}
function getElem(id, isPopup, isFrame)
{
	if (true == isPopup)
		return this.opener.document.getElementById(id);
		
	if (true == isFrame)
	    return this.parent.document.getElementById(id);
	
	return this.document.getElementById(id);
}


function getElemValue(id, isPopup, isFrame)
{
	var e = getElem(id, isPopup, isFrame);
	
	if (null != e)
	{
	    if (IsMultipleList(e))
    	    return GetSelectedValues(e);
        if (IsCheckbox(e))
            return e.checked;
    	    
		return e.value;
	}
	return null;
}

function getElemPos(e)
{
	if (null == e)
		return null;
	
    var curleft = curtop = 0;
    if (e.offsetParent) 
    {
        curleft = e.offsetLeft
        curtop = e.offsetTop
        while (e = e.offsetParent) 
        {
            curleft += e.offsetLeft
            curtop += e.offsetTop
        }
    }
    return [curleft,curtop];
}

function setElemValue(id, val, isPopup, isFrame)
{
	var e = getElem(id, isPopup, isFrame);
	
	if (null != e)
	{
		e.value = val;
		if ('select-one' == e.type)
			SetSelectedOption(e, val);
	}
}

function setElemText(elemID, text, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	if (null != e)
	{
		e.style.display = '';
		e.innerHTML = text;
	}
}

function hideElem(elemID, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	if (null != e)
	{
		e.style.display = 'none';
	}
}

function hideFormItem(elemID, isPopup, isFrame)
{
	hideElem("formItem_"+elemID, isPopup, isFrame);
	hideElem("formItemText_"+elemID, isPopup, isFrame);
}

function showElem(elemID, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	if (null != e)
	{
		e.style.display = '';
	}
}

function enableElem(elemID, enable, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	
	if (null == e)
		return;
		
	if ("hidden" == e.type)
	{
		// enable the phone, date 
		var name = e.id;
		if (null != getElem(name+"_phone_first"))
		{
			enableElem(name+"_phone_first", enable, isPopup, isFrame);
			enableElem(name+"_phone_second", enable, isPopup, isFrame);
			enableElem(name+"_phone_third", enable, isPopup, isFrame); 
		}
		else if (null != getElem(name+"_date_first"))
		{
			enableElem(name+"_date_first", enable, isPopup, isFrame);
			enableElem(name+"_date_second", enable, isPopup, isFrame);
			enableElem(name+"_date_third", enable, isPopup, isFrame); 
		}
	}
	else
		e.disabled = !enable;		
}

function isElemShown(elemID, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	return (null != e) && e.style.display == '';
}

function toggleShowElem(elemID, isPopup, isFrame)
{
	if (isElemShown(elemID, isPopup, isFrame))
		hideElem(elemID, isPopup, isFrame);
	else
		showElem(elemID, isPopup, isFrame);
}

function showFormItem(elemID, isPopup, isFrame)
{
	showElem("formItem_"+elemID, isPopup, isFrame);
	showElem("formItemText_"+elemID, isPopup, isFrame);
}

function toggleElem(elemID, isPopup, isFrame)
{
	var e = getElem(elemID, isPopup, isFrame);
	if ( e.style.display != 'none' ) {
		e.style.display = 'none';
	}
	else {
		e.style.display = '';
	}
}

function toggleFormItem(elemID, isPopup, isFrame)
{
	toggleElem("formItem_"+elemID, isPopup, isFrame);
	toggleElem("formItemText_"+elemID, isPopup, isFrame);
}

function getFormElem(form, id)
{
	return document[form][id];
}

function getMainFormElem(id)
{
	return getElem(id);//document.mainForm[id];
}

function TrimString(sInString) 
{
  sInString = sInString.replace( /^\s+/g, "" );// strip leading
  return sInString.replace( /\s+$/g, "" );// strip trailing
}

function nextObject(obj, next, size)
{
	if (obj.value.length < size)
		return;
		
	if (next != null)
	{
		var toFocus = getMainFormElem(next);
		toFocus.focus();
	}
}

/**
 *
 * Phone Functions
 *
 **/

function formatPhoneNumber(phoneNumber, phoneLocale)
{
    if (IsStringEmpty(phoneNumber))
        return phoneNumber;
        
    if (phoneLocale == "US" || phoneLocale == "PR" || phoneLocale == "CA")
    {
        var formatted = "";
        var numAdded = 0;
        for (var i = 0; i < phoneNumber.length; ++i )
	    {
		    if (numbs.indexOf(phoneNumber.charAt(i)) != -1)
		    {
		        if (0 == numAdded)
		            formatted += "(";
		        if (3 == numAdded)
		            formatted += ") ";
		        if (6 == numAdded)
		            formatted += "-";
		            
		        formatted += phoneNumber.charAt(i);
		        numAdded++;  
		    }
		}
    
		return formatted;
    }
    
    return phoneNumber;
}

function loadPhone(name, val)
{
    if (false == isInternationalPhone(name))
    {
    	if (val.length > 3)
    	    setElemValue(name+"_phone_first", val.substring(0, 3));
    	if (val.length > 6)
    	    setElemValue(name+"_phone_second", val.substring(3, 6));
    	if (val.length == 10)
    	    setElemValue(name+"_phone_third", val.substring(6, 10));
	}
	else
    	setElemValue(name+"_phone_third", val);
}

function setPhone(name)
{
	if (null == getElem(name))
	    return;
	
	if (isInternationalPhone(name))
	{
		setElemValue(name, getElemValue(name+"_phone_third"));
	}
	else
	{
		var f = getElemValue(name+"_phone_first");
		var s = getElemValue(name+"_phone_second");
		var t = getElemValue(name+"_phone_third");
				
		if (IsStringEmpty(f) || IsStringEmpty(s) || IsStringEmpty(t))
			setElemValue(name, '');
		else
			setElemValue(name, f + s + t);
	}
}

function clearPhone(name)
{
	setElemValue(name+"_phone_first", '');
	setElemValue(name+"_phone_second", '');
	setElemValue(name+"_phone_third", '');
	setElemValue(name, '');
}

function isInternationalPhone(formName, isPopup, isFrame)
{
    var phoneLocale = getElemValue(formName+"_locale", isPopup, isFrame);
    if (IsStringEmpty(phoneLocale))
        return false;
        
    phoneLocale = phoneLocale.toLowerCase();
    
   	return (phoneLocale != "us" && phoneLocale != "pr" && phoneLocale != "ca");
}

function nextPhoneObject(obj, name, formName)
{
	if (null == obj || null == formName)
		return;
		
	var next = null;
	var doFocus = false;

	if (isInternationalPhone(formName))
	{
		setPhone(formName);
	    return;
    }
	    
	if ("first" == name)
	{
		doFocus = obj.value.length >= 3;
		next = getElem(formName+"_phone_second");
	}
	else if ("second" == name)
	{
		doFocus = obj.value.length >= 3;
		next = getElem(formName+"_phone_third");
	}
	else if ("third" == name)
	{
		doFocus = obj.value.length >= 4;
		setPhone(formName);
	}

	if (true == doFocus && next != null)
		FocusOnItem(next);
}

function setPhoneLocale(name, locale, isPopup, isFrame)
{
    clearPhone(name);
    setElemValue(name+"_locale", locale, isPopup, isFrame);
    
    if (isInternationalPhone(name))
    {
        hideElem(name+"_phone_dash", isPopup, isFrame);
        hideElem(name+"_phone_right_paran", isPopup, isFrame);
        hideElem(name+"_phone_left_paran", isPopup, isFrame);
        hideElem(name+"_phone_first", isPopup, isFrame);
        hideElem(name+"_phone_second", isPopup, isFrame);
        
        getElem(name+"_phone_third").maxLength = 20;
        getElem(name+"_phone_third").className = "basic"; 
    }
    else
    {
        showElem(name+"_phone_dash", isPopup, isFrame);
        showElem(name+"_phone_right_paran", isPopup, isFrame);
        showElem(name+"_phone_left_paran", isPopup, isFrame);
        showElem(name+"_phone_first", isPopup, isFrame);
        showElem(name+"_phone_second", isPopup, isFrame);
        
        getElem(name+"_phone_third").maxLength = 4;
        getElem(name+"_phone_third").className = "phoneThird";
    }
}

function IsPhoneValid(item)
{
	var sText = item.value;
	var ValidChars = "0123456789";
	
	sText = TrimString(sText);
	
	/* non-international numbers must be 10 numbers
	 */
	if (false == isInternationalPhone(item.name) && sText.length != 10)
	    return false;
    
    for (var i = 0; i < sText.length; i++)
    {
    	if (ValidChars.indexOf(sText.charAt(i)) == -1)
    		return false;
    }

	return true;
}
/**
 *
 * Date Functions
 *
 **/
 
function loadDate(name, val)
{
	// date is in mm/dd/yyyy format
	
	var ents = val.split('/');

	if (null == ents || ents.length != 3)
		return;
		
	getMainFormElem(name+"_date_first").value = ents[0];
	getMainFormElem(name+"_date_second").value = ents[1];
	getMainFormElem(name+"_date_third").value = ents[2];
}

function setDate(name)
{
	var dateField = getMainFormElem(name);

	if (null != dateField)
	{
		var f = getMainFormElem(name+"_date_first").value;
		var s = getMainFormElem(name+"_date_second").value;
		var t = getMainFormElem(name+"_date_third").value;
		
		if (null == f || '' == f || null == t || '' == t || null == s || '' == s)
		{
			dateField.value = '';
			return;
		}
		
		dateField.value = f + "/" + s + "/" + t;
	}
}

 /**
 *
 * Select Field Functions
 *
 **/
function FindOptionIndexByValue(list, optionValue)
{
	var i =0;
	for (i=0; i<list.length; ++i)
	{
		if (optionValue == list.options[i].value)
			return i;
	}

	return -1;
}

function NewOption(optText, optValue)
{
	var newOpt = document.createElement("OPTION");
	newOpt.text = optText;
	newOpt.value = optValue;
	
	return newOpt;
}

function DuplicateOption(opt)
{
	return NewOption(opt.text, opt.value);
}

function FindOptionIndexByText(list, optionText)
{
	var i =0;
	for (i=0; i<list.length; ++i)
	{
		if (optionText == list.options[i].text)
			return list.options[i];
	}

	return null;
}

function AppendOption(list, optText, optValue)
{
	var newOpt = NewOption(optText, optValue);	
	list.options[list.length] = newOpt;
	return list.options[list.length-1];
}

function AddBlankToList(list)
{
	var newOpt = NewOption("", "");
	list.options[list.length] = newOpt;
}

function RemoveSelectedOption(list)
{
	var sel = list.selectedIndex;
	list.options[sel] = null;
}

function RemoveSelectedOptions(list)
{
	var sel = list.selectedIndex;
	
	while (-1 != sel)
	{
		list.options[sel] = null;
		sel = list.selectedIndex;
	}
}

function RemoveOptions(listToClear)
{
	var i=0;
	for (i = listToClear.length - 1; i >= 0; --i)
		listToClear.options[i] = null;
}

function RemoveOption(list, optionValue)
{
	var i=0;
	for (i = 0 ; i<list.length; ++i)
	{
	    if (list.options[i].value == optionValue)
	    {
	    	list.options[i] = null;
	    	return;
	    }
	}
}

function GetSelectedValue(list)
{
	var sel = GetSelectedOption(list);

	if (null == sel)
		return null;

	return sel.value;
}

function GetSelectedCount(list)
{
    var count = 0;
	var i =0;
	for (i=0; i<list.length; ++i)
	{
		if (list.options[i].selected == true)
		    ++count;
    }
    return count;
}

function GetSelectedValues(list)
{
    if (null == list)
		return null;

	var i =0;
	var vals = '';
	for (i=0; i<list.length; ++i)
	{
		if (list.options[i].selected == true)
        {
            if (vals.length > 0)
                vals += ',';
            vals += list.options[i].value;
        }
	}
	
	return vals;
}

function GetSelectedOption(list)
{
	var sel = list.selectedIndex;
	
	if (-1 == sel)
		return null;

	return list.options[sel];
}

function SetSelectedOption(list, optionValue)
{
	var opt = FindOptionIndexByValue(list, optionValue);
	
	if  (null != opt)
	{
		opt.selected = true;
	}
}

function SetSelectedOptionByText(list, optionText)
{
	var opt = FindOptionIndexByText(list, optionText);
	
	if  (null != opt)
	{
		opt.selected = true;
	}
}

function SelectAllOptions(list)
{
    if (null == list)
		return null;

	var i =0;
	for (i=0; i<list.length; ++i)
		list.options[i].selected = true;
}

function UnselectAllOptions(list)
{
    if (null == list)
		return null;

	var i =0;
	for (i=0; i<list.length; ++i)
		list.options[i].selected = false;
}

function IsMultipleList(list)
{
    if (null == list)
        return false;
        
    return "select-multiple" == list.type;
}

function IsCheckbox(item)
{
    if (null == item)
        return false;
        
    return "checkbox" == item.type;
}

function FocusOnItem(item)
{
	if (null == item)
		return;
		
	try
	{
		item.focus();
	}
	catch (e)
	{
		//if (e.message != null)
		//	alert(e.message);
	}
		
}

function focusOnFirstItem()
{
	if (null == document.forms || document.forms.length == 0)
		return;
		
	var mainForm = document.forms[0];
	
	if (null == mainForm)
	    return;
	
	var i=0;
	for (i=0; i < mainForm.elements.length; ++i)
	{
	    if (mainForm.elements[i].type != "hidden")
	    {
	        FocusOnItem(mainForm.elements[i]);
	        return;
	    }
	}
}

 /**
 *
 * Popup Window Functions
 *
 **/
var cur_popup			= null;
function showPopup(url, name, width, height, scrollbars)
{
	if (null != cur_popup && false == cur_popup.closed)
	{
		try
		{
			cur_popup.window.focus();
			cur_popup.window.location = url;
		}
		catch (e)
		{
			//this case is when the window was already closed
			cur_popup = null;
		}
	}
	else
	{
		if (null == url || null == name)
			return;
		
		if (null == width)
			width = 300;
		if (null == height)
			height = 400;
		if (null == scrollbars || true == scrollbars)
			scrollbars = "yes";
		
		cur_popup = newWindow(url, name, width, height, scrollbars);
	}
	
	return cur_popup;
}

function closePopup()
{
	if (null != cur_popup)
		cur_popup.close();
		
	cur_popup = null;
}

function newWindow(link, name, width, height, scroll)
 {
 	var newWidth 	= (screen.width - width) / 2;
 	var newHeight 	= (screen.height - height) / 2;
 	var props 		= 'height='+height+',width='+width+',top='+newHeight+',left='+newWidth+',scrollbars='+scroll+',resizable';

 	win = window.open(link, name, props);

 	if (parseInt(navigator.appVersion) >= 4)
 		win.window.focus();
 		
 	return win;
 }
 
 
 /**
 *
 * Tab Functions
 *
 **/
function getTabObj(tabName)
{
	return eval('tabs_'+tabName);
}

function getTabSection(tabName, id, isPopup, isFrame)
{
	return getElem(tabName+"_"+id, isPopup, isFrame);
}

function getTabContents(tabName, id, isPopup, isFrame)
{
	return getElem(tabName+"_"+id+"_Contents", isPopup, isFrame);
}

function getSelectedTab(tabName)
{
	var t = getTabObj(tabName);
	
	if (null != t)
	{
		var i=0;
		for (i=0; i<t.length; ++i)
		{
			if (t[i] == '1')
				return i;
		}
	}
	
	return -1;
}

function selectTab(tabName, tabToSelect, tabClass)
{
	var sel = getSelectedTab(tabName);
	var t = getTabObj(tabName);
	
	if (-1 != sel && null != t)
	{
		t[sel] = '0';
		t[tabToSelect] = '1';
	}
	
	refreshTabs(tabName, tabClass);
}

function refreshTabs(tabName, tabClass)
{
	var t = getTabObj(tabName);
	
	if (null != t)
	{
		for (i=0; i<t.length; ++i)
		{
			var to  = getTabSection(tabName, i);
			var toc = getTabContents(tabName, i);
			
			if (null == to)
				continue;
				
			if (t[i] == '1')
			{
				to.className = tabClass+"TabSelected";
				toc.style.display = '';
			}
			else
			{
				to.className = tabClass+"TabUnselected";
				toc.style.display = 'none';
			}
		}
		
	}
}



 /**
 *
 * Utility Functions
 *
 **/
function addURLParam(url, name, val, replaceIfExists)
{
    if (null == url)
        url = "";
    if (url.length > 0)
    {
        if (url.indexOf('?') == -1)
            url += "?";
        else
        {
            if (url.charAt(url.length - 1) != '&')
               url += "&";
        }
    }
    if (null == val)
        val = '';
        
    val = escape(val);
    
    if (null != replaceIfExists && true == replaceIfExists)
    {
        /* if the paramater already exists, find it in the string and replace it
        */
        var tokenBefore= "?";
        var toFind     = tokenBefore + name + "=";
        var toFindLen  = toFind.length; 
        var itemIndex  = url.indexOf("?"+name+"=");
        if (-1 == itemIndex)
        {
            tokenBefore = "&";
            toFind      = tokenBefore + name + "=";
            itemIndex   = url.indexOf(toFind);
        }
        
        if (itemIndex > 0)
        {
            var finalString = url.substring(0, itemIndex+1);
            var rest = url.substring(itemIndex+toFindLen);
            var nextToken = rest.indexOf("&");
            
            if (-1 != rest)
                rest = rest.substring(nextToken);
            
            finalString = finalString + name + "=" + val + rest;
            return finalString;
        }
    }
    
    return url + name + "=" + val;
}

function addQueryString(queryString, name, val)
{
    if (null == name)
        return queryString;

    return queryString + "&" + name + "=" + val;
}

function redirectPage(page)
{
    document.location.href = page;
}

 /**
 *
 * Event Functions
 *
 **/

var numEvents = 0;
var EVENT_DBLCLICK = ++numEvents;
var EVENT_CLICK = ++numEvents;
var EVENT_BLUR = ++numEvents;
var EVENT_CHANGE = ++numEvents;
var EVENT_FOCUS = ++numEvents;
var EVENT_KEYDOWN = ++numEvents;
var EVENT_KEYPRESS = ++numEvents;
var EVENT_KEYUP = ++numEvents;
var EVENT_MOUSEDOWN = ++numEvents;
var EVENT_MOUSEMOVE = ++numEvents;
var EVENT_MOUSEOUT = ++numEvents;
var EVENT_MOUSEOVER = ++numEvents;
var EVENT_MOUSEUP = ++numEvents;
var EVENT_SELECT = ++numEvents;

function registerEvent(itemObject, eventType, eventFunction)
{
	if (null == itemObject)
		return;
	
	if (EVENT_DBLCLICK == eventType)
		itemObject.ondblclick = eventFunction;
	else if (EVENT_CLICK == eventType)
		itemObject.onclick = eventFunction;				
	else if (EVENT_BLUR == eventType)
		itemObject.onblur = eventFunction;
	else if (EVENT_CHANGE == eventType)
		itemObject.onchange = eventFunction;
	else if (EVENT_FOCUS == eventType)
		itemObject.onfocus = eventFunction;
	else if (EVENT_KEYDOWN == eventType)
		itemObject.onkeydown = eventFunction;
	else if (EVENT_KEYPRESS == eventType)
		itemObject.onkeypress = eventFunction;
	else if (EVENT_KEYUP == eventType)
		itemObject.onkeyup = eventFunction;
	else if (EVENT_MOUSEDOWN == eventType)
		itemObject.onmousedown = eventFunction;
	else if (EVENT_MOUSEMOVE == eventType)
		itemObject.onmousemove = eventFunction;
	else if (EVENT_MOUSEOUT == eventType)
		itemObject.onmouseout = eventFunction;
	else if (EVENT_MOUSEOVER == eventType)
		itemObject.onover = eventFunction;
	else if (EVENT_MOUSEUP == eventType)
		itemObject.onmouseup = eventFunction;
	else if (EVENT_SELECT == eventType)
		itemObject.onselect = eventFunction;
	
	//if (itemObject.captureEvents)
	//	itemObject.captureEvents(eventType);
}

function registerOnDblClick(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_DBLCLICK, eventFunction)
}
function registerOnClick(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_CLICK, eventFunction)
}
function registerOnBlur(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_BLUR, eventFunction)
}
function registerOnChange(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_CHANGE, eventFunction)
}
function registerOnFocus(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_FOCUS, eventFunction)
}
function registerOnKeyDown(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_KEYDOWN, eventFunction)
}
function registerOnKeyPress(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_KEYPRESS, eventFunction)
}
function registerOnKeyUp(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_KEYUP, eventFunction)
}
function registerOnMouseDown(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_MOUSEDOWN, eventFunction)
}
function registerOnMouseMove(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_MOUSEMOVE, eventFunction)
}
function registerOnMouseOut(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_MOUSEOUT, eventFunction)
}
function registerMouseOver(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_MOUSEOVER, eventFunction)
}
function registerOnMouseUp(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_MOUSEUP, eventFunction)
}
function registerOnSelect(itemName, eventFunction)
{
    registerEvent(getElem(itemName), EVENT_SELECT, eventFunction)
}

function goBack()
{
    history.back();
}

function registerBackButton(formButtonID)
{
	var e = getElem(formButtonID);
	if (null != e)
	{
		e.onclick = goBack;
		if (e.captureEvents)
			e.captureEvents(Event.ONCLICK);
	}
}


 /**
 *
 * Frame Functions
 *
 **/
function loadFrame(frameItem, formName, sender)
{
	var curForm = getElem(formName);
	if (null == curForm || null == frameItem)
		return;
		
	var fsrc = frameItem.src;
	var i=0;
	
	if (fsrc.indexOf("?") >= 0)
	    fsrc = fsrc.substring(0, fsrc.indexOf("?"));
	    
	fsrc = addURLParam(fsrc, "sender", sender);
	    
	for (i=0; i < curForm.elements.length; ++i)
	{
		var curItem = curForm.elements[i];
		var curVal  = escape(getElemValueForType(curItem));
		fsrc = addURLParam(fsrc, curItem.name, curVal);
	}
	
	frameItem.src = fsrc;
}

function getElemValueForType(elem)
{
    if (null == elem)
        return null;
        
    if (elem.type == 'checkbox')
        return (elem.checked) ? 'on' : '';
        
    return elem.value;
}

/* utility cookie functions from quirksmode.org
 */
function createCookie(name,value,days)
{
    var expires = "";
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		expires = "; expires="+date.toGMTString();
	}

	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for (var i=0; i < ca.length; i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ')
		{
		    c = c.substring(1,c.length);
		}
		
		if (c.indexOf(nameEQ) == 0) 
		    return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function hasCookie(name)
{
    return null != readCookie(name)
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}

function setDateTimeOffset()
{
    var cookieName = "tzo";
    if (false == hasCookie(cookieName))
    {
        var gmtOffset = '';
		var d = new Date();
		var offset = -1 * (d.getTimezoneOffset() / 60);
		
		if (offset >= 0)
			gmtOffset = "+" + offset;
		else if (offset < 0)
			gmtOffset = offset;
			
		createCookie(cookieName, gmtOffset);
    }
}

setDateTimeOffset();

/* Field Functions
*/
function setFieldRequired(fieldName, required, toggleEnable)
{
    if (null == field_required || null == fields || 0 == fields.length)
        return;
        
    if (null == fieldName)
        return;
        
    if (null == required)
        required = 1;
        
    var fieldIndex = findFieldIndex(fieldName);
    if (-1 == fieldIndex)
        return;
        
    field_required[fieldIndex] = required;
    
    if (required)
        showElem("requiredMark_"+fieldName);
    else
        hideElem("requiredMark_"+fieldName);
        
    if (null != toggleEnable)
    {
    	enableElem(fieldName, required);
    }
}

function findFieldIndex(fieldName)
{
    if (null == field_required || null == fields || 0 == fields.length)
        return -1;
        
    var i=0;
    
    for (i=0; i<fields.length; ++i)
    {
        if (fields[i] == fieldName)
            return i;
    }
    
    return -1;
}

function isFieldRequired(fieldName)
{
    if (null == field_required || null == fields || 0 == fields.length || null == fieldName)
        return false;
        
    return (isFieldRequiredIndex(findFieldIndex(fieldName)));
}

function isFieldRequiredIndex(index)
{
    if (null == index || -1 == index || null == field_required || index > field_required.length)
        return false;
        
    return 1 == field_required[index];
}

function btnClicked(btnName, btnValue, formToSubmit)
{
	if (null != formToSubmit)
	{
		var f = getElem(formToSubmit);
		if (null != f)
			postFormToFrame(btnName, f);
	}
	else
	{
		clickedButton = btnValue;
		setElemValue("_clb", btnName);
		if (null != window.onButtonClick)
			onButtonClick(btnName);
	}
}

function submitForm(btnName)
{
	if (null != getElem("mainForm"))
	{
		btnClicked(btnName, getElem(btnName), null);
		getElem("mainForm").submit();
	}
}
			
function canValidate()
{
	if (null != clickedButton)
		return (1 == validates[clickedButton.name]);
	if ((null != defaultBtn) && (1 == validates[defaultBtn]))
	{
		setElemValue("_clb", defaultBtn);
		return true;
	}
	
	return false;
}
	
function validateForm()
{
	if (false == canValidate() ||  0 == fields.length)
		return true;
	
	var i=0;
	for (i=0; i<fields.length; ++i)
	{
	    if (false == validateFormFieldByPos(fields[i], i))
	        return false;
	}
	
    if (null != window.validateFormCB)
	{
		if (null != clickedButton)
			return validateFormCB(clickedButton.name);
		
		return validateFormCB(null);
	}
	
	return true;
}

function validateFormField(fieldName)
{
    return validateFormFieldByPos(fieldName, findFieldIndex(fieldName));
}

function validateFormFieldByPos(fieldName, fieldPosition)
{
    var fname = "fv_"+fieldName;
    var func = eval(fname);
    
    return func(fieldPosition);
}

function showFormError(error, itemName)
{
    alert(error);
    FocusOnItem(getElem(itemName));
    
    var fi = getElem("formContainer_"+itemName);
    
    if (null != fi)
        fi.className += " requiredFieldTable";
}

function clearFormError(itemName)
{
    var fi = getElem("formContainer_"+itemName);
    
    if (null != fi)
        fi.className = fi.className.replace(" requiredFieldTable", "");
}

function postFormToFrame(clickedBtn, frameItem)
{
	if (null == document.forms)
		return;
		
	var frameSource = generateSubmitURL(clickedBtn, frameItem.src);
	frameItem.src = frameSource;
}

function generateSubmitURL(clickedBtn, submitSource)
{
	if (null == document.forms)
		return null;
		
	if (null != submitSource)
		submitSource = submitSource.substring(0, submitSource.indexOf("?"));
	
	var mainForm = document.forms[0];
	var i=0;
	var qs = "?";
	for (i=0; i < mainForm.elements.length; ++i)
	{
		if ("_clb" == mainForm.elements[i].name)
			qs += "_clb="+clickedBtn+"&";
		else
			qs += mainForm.elements[i].name+"="+getElemValue(mainForm.elements[i].name)+"&";
	}
		
	return submitSource + qs;
}


/* JS Date Functions
 */

var oldLink = null;

// This function gets called when the end-user clicks on some date.
function date_selected(cal, date) 
{
    loadDate(cal.sel.name, date);
    setDate(cal.sel.name);
    //cal.sel.value = date; // just update the date in the input field.

	// if we add this call we close the calendar on single-click.
	// just to exemplify both cases, we are using this only for the 1st
	// and the 3rd field, while 2nd and 4th will still require double-click.
	if (cal.dateClicked)// && (cal.sel.id == "sel1" || cal.sel.id == "sel3"))
		cal.callCloseHandler();
}
	
// And this gets called when the end-user clicks on the _selected_ date,
// or clicks on the "Close" button.  It just hides the calendar without
// destroying it.
function closeHandler(cal) 
{
    // hide the calendar
    cal.hide();
	//  cal.destroy();
	_dynarch_popupCalendar = null;
}
	
// This function shows the calendar under the element having the given id.
// It takes care of catching "mousedown" signals on document and hiding the
// calendar if the click was outside.
function showCalendar(id, format, showsTime, showsOtherMonths)
{
    var el = document.getElementById(id);
    
    if (_dynarch_popupCalendar != null)
    {
        // we already have some calendar created
        _dynarch_popupCalendar.hide();                 // so we hide it first.
    }
    else 
    {
        // first-time call, create the calendar.
        var cal = new Calendar(1, null, date_selected, closeHandler);
        // uncomment the following line to hide the week numbers
        // cal.weekNumbers = false;
        if (typeof showsTime == "string")
        {
            cal.showsTime = true;
            cal.time24 = (showsTime == "24");
        }
        
        if (showsOtherMonths) 
        {
            cal.showsOtherMonths = true;
        }
        _dynarch_popupCalendar = cal;                  // remember it in the global var
        cal.setRange(1900, 2070);        // min/max year allowed.
        cal.create();
    }
    
    _dynarch_popupCalendar.setDateFormat(format);    // set the specified date format
    _dynarch_popupCalendar.parseDate(el.value);      // try to parse the text in field
    _dynarch_popupCalendar.sel = el;                 // inform it what input field we use
    
    // the reference element that we pass to showAtElement is the button that
    // triggers the calendar.  In this example we align the calendar bottom-right
    // to the button.
    _dynarch_popupCalendar.showAtElement(el.nextSibling, "Br");        // show the calendar
    
    //return false;
}
	
var MINUTE = 60 * 1000;
var HOUR = 60 * MINUTE;
var DAY = 24 * HOUR;
var WEEK = 7 * DAY;
	
// If this handler returns true then the "date" given as
// parameter will be disabled.  In this example we enable
// only days within a range of 10 days from the current
// date.
// You can use the functions date.getFullYear() -- returns the year
// as 4 digit number, date.getMonth() -- returns the month as 0..11,
// and date.getDate() -- returns the date of the month as 1..31, to
// make heavy calculations here.  However, beware that this function
// should be very fast, as it is called for each day in a month when
// the calendar is (re)constructed.
function isDisabled(date)
{
    var today = new Date();
	return (Math.abs(date.getTime() - today.getTime()) / DAY) > 10;
}
	
function flatSelected(cal, date)
{
    var el = document.getElementById("preview");
	el.innerHTML = date;
}

function attachElem(parent, elemToAttach)
{
	var pos = getElemPos(parent);
	
	elemToAttach.style.left = pos[0]+8 + "px";
    elemToAttach.style.top = pos[1]+8 + "px";
    elemToAttach.style.display = '';
}

function scrollToElem(elem, verticalOfffset)
{
	var pos = getElemPos(elem);
	if (null == pos)
		pos = [0,0];
		
	if (verticalOfffset)
	{
		if (pos[1] + verticalOfffset < 0)
			pos[1] = 0;
		else
			pos[1] += verticalOfffset;
	}
	if (window.scrollTo)	
		window.scrollTo(pos[0], pos[1]);
}

function showMessage(message)
{
	showElem("userMessageSection");
	setElemText("messageSectionFirst", message);
}

function hideMessages()
{
	hideElem("userMessageSection");
}

function showError(error)
{
	showElem("userErrorSection");
	setElemText("errorSectionFirst", error);
}

function hideErrors()
{
	hideElem("userErrorSection");
}

