/*
 * ============================================================================
 *                   The ProQuality Inc.
 *         Rapid Efficent Low cost And Xtreme (RELAX)
 *	           Advanced Solutions Framework (ASF)
 *                  Cristian Teodorescu
 *                      Version 8.6
 * ============================================================================
 * 
 *    Copyright (C) 1999 The ProQuality Inc. Foundation. All rights reserved.
 * 
 * The use of this software in any form is strictly prohibited unless you have 
 * purchased a license from ProQuality Inc. or you have a software agreement with 
 * ProQuality Inc.
 * 
 * Redistributions of source code must retain copyright statements
 * and notices. Redistributions must also contain a copy of this
 * document.
 *
  THIS SOFTWARE IS PROVIDED BY PROQUALITY AND CONTRIBUTORS ``AS IS'' AND
  ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PROQUALITY OR ITS
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.
    
 *
 */

var DEFAULT_FORM_NAME = 'SmartForm';

var isIE = (document.attachEvent ? true : false);
var isNN = (document.addEventListener ? true : false);
var invalidDateFormat;

function blockEventsIE() {
    evt = event;
    var elem = (evt.srcElement) ? evt.srcElement : null;
	var keyCode = (evt.keyCode) ? evt.keyCode : null;
	
	//Check key values
	var f5 = (keyCode == 116);
	var esc = (keyCode == 27);
	var ctrlR = ((keyCode == 82) && (evt.ctrlKey));
	var ctrlN = ((keyCode == 78) && (evt.ctrlKey));
	
	var altLeft = ((keyCode == 37) && evt.altKey);
	
	var htmlTag = elem.tagName.toUpperCase();
	var backspace = (keyCode == 8 && htmlTag != 'INPUT' && htmlTag != 'TEXTAREA');

    if (f5 || ctrlR || ctrlN || altLeft || backspace || esc) {
        evt.cancelBubble = true;
		evt.returnValue = false;
		evt.keyCode = false;
        return false;
    }
}


function blockEventsNN(evt) {
    var elem = (evt.target) ? evt.target : null;
    var keyCode = (evt.keyCode) ? evt.keyCode : null;
	var charCode = (evt.charCode || evt.charCode == 0) ? evt.charCode : null;
	
	//Check key values
	var f5 = (keyCode == 116);
	var esc = (keyCode == 27);	
	var ctrlR = ((charCode == 114) && evt.ctrlKey);
	var altLeft = ((keyCode == 37) && evt.altKey);
	
	var htmlTag = elem.tagName.toUpperCase();
	var backspace = (keyCode == 8 && htmlTag != 'INPUT' && htmlTag != 'TEXTAREA');

    if (f5 || ctrlR || altLeft || backspace || esc) {
        return false;
    }
}

if (isIE)
{
	document.onkeydown = blockEventsIE;
}

if (isNN)
{
	document.onkeypress = blockEventsNN;
}


// disable Ctrl-N

/*if (isIE)
{
	document.onkeydown = function(){
		if ((event.keyCode == 78) && (event.ctrlKey)){
			event.cancelBubble = true;
			event.returnValue = false;
			event.keyCode = false;
			return false;
		}
	}
}*/

//Functions

function changeCellStyleClass(cellElement, newClass, tableName)
{
	if(cellElement.getAttribute('cellIndex') != SimpleHandler.selectedIndex[tableName])
	{
		cellElement.className=newClass;
	}
}

function changeRowStyleId(rowElement, newId, tableName)
{
	if(rowElement.getAttribute('rowIndex') != ScrollSortHandler.selectedIndex[tableName])
	{
		rowElement.id=newId;
	}
}

/*
 * changes the style class for 
 */
function setSelectedIndex(element, formName)
{
	var form = obtainForm(formName);
	var oldSelectedIndexId = form.selectedIndexId.value;
	var numRows = element.parentNode.rows.length;
	var rows = element.parentNode.rows;
	for(i = 0; i < numRows; i++)
	{
		if(rows[i].getAttribute('rowIndex') == form.selectedIndexId.value)
		{
			rows[i].className=rows[i].getAttribute('rowType');
		}		
	}
	if (document.all)
	{
		form.selectedIndexId.value = element.rowIndex;
	}
	else
	{
		form.selectedIndexId.value = element.rowIndex-1;
	}
	element.className='tableSelected';
}

function setSelectedIndexAndSubmit(element, formName)
{
	if(invalidDateFormat)
	{
		stopEvent(event);
		return;
	}
	var form = obtainForm(formName);
	form.selectedIndexId.value = element.getAttribute('rowIndex');
	form.submit();
}

function resetForm(formName)
{
	var form = obtainForm(formName);
	for(index = 0; index < form.elements.length; index++)
	{
		if(form.elements[index].type == 'text')
			form.elements[index].value = '';
	}
}

function obtainForm(formName)
{
	if(formName == null || formName == 'undefined')
	{
		formName = DEFAULT_FORM_NAME;
	}
	return document.forms[formName];
}

function changeRowClass(rowElement, rowIndex, tableName)
{
	if(rowElement.getAttribute('rowIndex') == ScrollSortHandler.selectedIndex[tableName])
	{
		rowElement.className = 'tableSelected';
	}
	else
	{
		rowElement.className = (rowIndex % 2 == 0 ? "even" : "odd");
	}
}

function changeRowType(rowElement, rowIndex)
{
	var newType = (rowIndex % 2 == 0 ? "even" : "odd");
	var currentRowType = rowElement.getAttribute('rowType');
	if(currentRowType != newType)
	{
		rowElement.removeAttribute('rowType');
		rowElement.setAttribute('rowType', newType);
	}
}

function changeTableCellStyleClass(cellElement, tableName)
{
	if(cellElement.getAttribute('cellIndex') != SimpleHandler.selectedIndex[tableName])
	{
		cellElement.className = cellElement.getAttribute('cellType');
	}
}

/*
 * submits page when enter key is hit while type in input element
 *
 * e - event
 * myaction - action to call when submitting
 * myform - form to call when submitting
 * enableWait - (booelan) enable wait dialog
 * waitMessage - message to display in wait dialog
 */
function submitenter(e, myaction, myform, enableWait, waitMessage)
{
	var keycode;
	
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	else return true;
	
	if (keycode == 13)
	{
		setActionForFormAndSubmit(myaction, myform, enableWait, waitMessage);
		return false;
	}
	else
	{
	   return true;
	}
}

/*
 * sets the selected index id from the table to the form
 *
 * tableName - name of table to get pull selected index
 * toFormName - name of form to set the selected index id
 */
function setSelectedIndexIdFromTable(tableName, toFormName)
{
	var toForm = obtainForm(toFormName);
	toForm.selectedIndexId.value = ScrollSortHandler.selectedIndex[tableName];
	toForm.selectedTable.value = tableName;
}


function setSelectedIndexIdFromTableRemote(tableName, toFormName)

{

      var toForm = obtainForm(toFormName);

      toForm.selectedIndexId.value = ScrollSortHandler.selectedIndex[tableName];

      toForm.selectedTable.value = tableName;

      remote.setSelectedIndexForTable(tableName, toForm.selectedIndexId.value);

}


/*
 * tests to see if an index has been set and if so sets the selected 
 * index id from the table to the form. If not, a message is displayed
 * to the user
 *
 * tableName - name of table to get pull selected index
 * message - message to display to user
 * toFormName - name of form to set the selected index id
 */
function testAndSetSelectedIndexIdFromTable(tableName, message, toFormName)
{
	var toForm = obtainForm(toFormName);
	if (ScrollSortHandler.selectedIndex[tableName] != -1)
	{
		toForm.selectedIndexId.value = ScrollSortHandler.selectedIndex[tableName];
		toForm.selectedTable.value = tableName;
		return true;
	}
	else
	{
		enableAlertDialog(message);
		return false;
	}
}
/*
 * tests to see if an index has been set.If not, a message is displayed
 * to the user
 *
 * listBoxName - name of listbox to get pull selected index
 * message - message to display to user
 */

function testForSelectedIndexIdFromListBox(listBoxName, message)
{
	if (ListBoxHandler.all[listBoxName].numItemsSelected != 0)
	{
		return true;
	}
	else
	{
		enableAlertDialog(message);
		return false;
	}
}
/*
 * tests to see if more than one index is selected
 * If more than one is selected , displays a message to the user saying that 
 * only one can be selected
 * tableName - name of table to get pull selected index
 * message - message to display to user
 * toFormName - name of form to set the selected index id
 */
 
 
 
 
 
function testAndSetSelectedIndexIdFromMultipleTable(tableName, message, toFormName)
{
	var toForm = obtainForm(toFormName);
	var elLength = ScrollSortHandler.getSelectedIndexes(tableName).length;
	if (elLength > 1 || elLength == 0)
	{	
		enableAlertDialog(message);
		return false;
	}
	else
	{
		toForm.selectedIndexId.value = ScrollSortHandler.selectedIndex[tableName];
		toForm.selectedTable.value = tableName;
		return true;
	}
}


/*
 * tests to see if an index has been set and if so sets the selected 
 * index id from the table to the form. If not, a message is displayed
 * to the user. If so the form is submitted.
 *
 *
 * tableName - name of table to get pull selected index
 * toFormName - name of form to set the selected index id
 */
function setSelectedIndexIdFromTableAndSubmit(tableName, message, toFormName)
{
	if(invalidDateFormat)
	{
		stopEvent(event);
		return;
	}
	
	var toForm = obtainForm(toFormName);
	if (ScrollSortHandler.selectedIndex[tableName] != -1)
	{
		
		toForm.selectedIndexId.value = ScrollSortHandler.selectedIndex[tableName];
		toForm.selectedTable.value = tableName;
		toForm.submit();		
		checkAndDisableForm(toFormName, true);
	}
	else
	{
		enableAlertDialog(message);
	}	
}

/*
 * set up a timeout to submit form after a period of time
 */
function setInternalSubmit(formName, enableWait)
{
	if(invalidDateFormat)
	{
		stopEvent(event);
		return;
	}
	FocusHandler.lockFocus();
	var formMethod = 'submitInternal("'+ formName +'")';
	setTimeout(formMethod, 100);
	checkAndDisableForm(formName,enableWait);
}

/*
 * submits the form
 *
 * formName - name of form
 * enableWait - (boolean) enable wait dialog
 */
function submitForm(formName, enableWait)
{
	checkAndDisplayWaitDialog(enableWait);
	var form = obtainForm(formName);
	setInternalSubmit(formName, enableWait);
}

/*
 * sets action for form
 *
 * actionString - name of action
 * formName - name of form
 */
function setActionForForm(actionString, formName)
{
	var form = obtainForm(formName);
	form.action = actionString;
}


/*
 * sets action for form and submits the form
 *
 * actionString - name of action
 * formName - name of form
 * enableWait - (boolean) enable the wait dialog
 * waitMessage - message to display in wait dialog
 */
function setActionForFormAndSubmit(actionString, formName, enableWait, waitMessage)
{
	checkAndDisplayWaitDialog(enableWait, waitMessage);
	
	var form = obtainForm(formName);
	form.action = actionString;
	setInternalSubmit(form.name, enableWait);
} 

/*
 * sets node if from tree and submits
 *
 * message - message to display to user
 * formName - name of form
 * enableWait - (boolean) enable the wait dialog
 */
function setSelectedNodeIdFromTreeAndSubmit(message, toFormName, enableWait)
{
	
	var toForm = obtainForm(toFormName);

	if (selected_nodeId != '')
	{
		checkAndDisplayWaitDialog(enableWait);

		toForm.selectedNodeId.value = selected_nodeId;
		setInternalSubmit(formName, enableWait);
	}
	else
	{
		enableAlertDialog(message);
	}
}

/*
 * tests to see if an element exisits on page
 *
 * elemName - name of element
 */
function elementExists(elemName)
{
	return getReferencedElement(elemName) ? true : false;
}

/* do not call this function directly from page.  */
/* this should only be called by submitFormXXX functions above */
function submitInternal(formName)
{
	var form = obtainForm(formName);
	form.submit();
}


/*
 * displays wait dialog
 *
 * enableWait - wait dialog is enabled
 * waitMessage - message ot display
 */
function checkAndDisplayWaitDialog(enableWait, waitMessage)
{
	if(enableWait == true)
	{
		if (winList['displayDialog'])
		{
			if(!waitMessage)
			{
				waitMessage = "Please wait";
			}
			enableDisplayDialog('<br>'+waitMessage+'<br><br><br><br>');
		}
	}
}

function checkAndDisableForm(formName, enableWait)
{
//	if(enableWait != true)
//	{
//		return;
//	}	
	var form = obtainForm(formName);	
	for(index = 0; index < form.elements.length; index++)
	{
		if (form.elements[index].type=="button")
		{
			form.elements[index].disabled = true;
		}
	}
}



// Toggle functions
var getById = (typeof document.getElementById != "undefined");		

var toggledObject = null;

function toggleClassName(obj, class1, class2)
{
	toggledObject = obj;
	obj= getRef(obj);
	if(obj.className == class1)
	{
		obj.className= class2;
	}
	else
	{
		obj.className= class1;
	}
}

function getRef(obj)
{
	if(getById)
		return(typeof obj == "string") ? document.getElementById(obj) : obj;
}

/*
 * displays alert dialog
 *
 * message - message to display
 * onClose - JS function to call when dialog is closed
 */
function enableAlertDialog(message,onClose)
{
	var alertWin = winList['alertDialog'];
	if (alertWin)
	{
		setDialogText('alert', message);
		if(onClose != null)
		{
			alertWin.onClose = new Function("",onClose);
		}
		else
		{
			alertWin.onClose = null;
		}
		setWindowPositionFixed(alertWin,200,200);
		alertWin.open();
		document.getElementById('alertDialogOk').focus();
	}
}

/*
 * Sets a window to a position relative to the viewport.
 */
function setWindowPositionFixed(win,x,y)
{
	if (isIE)
	{
		var new_y = document.body.scrollTop + y;
		win.style.pixelTop=new_y;
	}
	else
	{
		var o_y = window.pageYOffset;
		var new_y = o_y+y;
		win.style.top=new_y+'px';
	}
}

function enableConfirmDialog(message, enableWait)
{
	enableConfirmDialog(message, "SmartForm",enableWait);
}

/*
 * displays confirm dialog
 *
 * message - message to display
 * formName - name of form to submit if confirmed yes
 * enableWait - enable wait dialog
 */
function enableConfirmDialog(message,formName, enableWait)
{
	if(winList['confirmDialog'])
	{
		var alertForm = obtainForm('confirmDialogForm');
		alertForm.submitForm.value = formName ? formName : DEFAULT_FORM_NAME;
		alertForm.enableWait.value = enableWait;
		setDialogText('confirm', message);
		winList['confirmDialog'].open();
		document.getElementById('confirmDialogYes').focus();
	}
}

/*
 * displays display dialog
 *
 * message - message to display
 */
function enableDisplayDialog(message)
{
	if(winList['confirmDialog'])
	{
		winList['confirmDialog'].close();
	}
	if(winList['alertDialog'])
	{
		winList['alertDialog'].close();
	}
	if(winList['displayDialog'])
	{
		setDialogText('display', message);
		winList['displayDialog'].open();
	}
}


function setDialogText(dialogType, message)
{
	var textDiv = document.getElementById(dialogType + 'DialogText');
	textDiv.innerHTML = message;
}


function autoTab(evt, thisElem, nextElemId)
{
	//alert("autoTab");
	evt = (evt) ? evt : ((event) ? event : null);
	if (evt)
	{
		var key = evt.keyCode;

		if (key != 9 && key != 16 && key != 37 && key != 38 && key != 39 && key != 40)
		{
			if(thisElem.value.length == thisElem.maxLength)
			{
				document.getElementById(nextElemId).select();
			}
		}
	}
}
function getNextFormElement(element)
{
	//alert("element.id: "+element.id);
	var elements = obtainForm().elements;
	for(var j = 0; j < elements.length; j++)
	{
		if( elements[j].id != null && elements[j].id == element.id )
		{
			if(j < elements.length)
			{
				//alert("elements[j+1].id: "+elements[j+1].id);
				return elements[j+1];
			}
			else
			{
				//alert("elements[0].id: "+elements[0].id);
				return elements[0];
			}
		}
	}
}
function autoTabToNextFormElement(event,element)
{
	autoTab(event,element, getNextFormElement(element).id );
}

function initAndDisplayEditor(referingElementID)
{
	var editorTextArea = document.getElementById('editorTextArea');
	var referingElement = document.getElementById(referingElementID);
	var referingCountElement = document.getElementById(referingElementID+'Count');
	var referingMaxElement = document.getElementById(referingElementID+'Max');	
	
	var editorReferenceHolder = document.getElementById('editorReferenceHolder');
	editorReferenceHolder.value = referingElementID;
	
	if(referingElement.readOnly || referingElement.disabled)
	{
		document.getElementById('editorDialogSave').disabled = true;
		editorTextArea.readOnly = true;
	}
	
	winList['editorDialog'].open();
	editorTextArea.value = referingElement.value;
	
	if(referingCountElement != null && referingCountElement != 'undefined')
	{
		editorTextAreaCount.value = referingCountElement.value;
	}

	if(referingMaxElement != null && referingMaxElement != 'undefined' && referingMaxElement.value!='' && referingMaxElement.value!='0')
	{
		counterHide.style.display = "block";	
		editorTextAreaMax.value = referingMaxElement.value;
		editorTextAreaMaxDisp.innerHTML = " ( "+referingMaxElement.value+" max)";
	}
	else
	{
		counterHide.style.display = "none";	
		editorTextAreaMax.value = 99999;
	}

	try
	{
		// this will handle error that occurs if focus fails due to minimized editor
		editorTextArea.focus();
	}
	catch(e)
	{
	}
}

function resetEditor()
{
	var editorTextArea = document.getElementById('editorTextArea');
	editorTextArea.value = "";
	editorTextArea.readOnly = false;

	var editorReferenceHolder = document.getElementById('editorReferenceHolder');
	editorReferenceHolder.value = "";
	
	document.getElementById('editorDialogSave').disabled = false;
}

function parseAndValidateDate(element, fmt) {
 	parseAndValidateDate(element, fmt,true) ;
}

function parseAndValidateDate(element, fmt, showDialog) 
{
	var str = element.value;
	if(str == "")
	{
	invalidDateFormat = false;
		return;
	}
	
	var date;
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);

    // If the length of var "a" is 1, then the user did not key in any delimiter such as /, -, or . between
    // the month day and year. Check to see if the entry is two digits for month, two for day, and either 2 or 4 for year.
    // If so, manually set the three parts into array "a" and processing can continue as normal.
    if (a.length == 1)
    {
        var reg = /^(\d{2})(\d{2})((\d{2})|(\d{4}))$/;

        if(reg.test(str))
        {
            var testDate = reg.exec(str);
            a[0] = testDate[1];
            a[1] = testDate[2];
            a[2] = testDate[3];
        }
    }

	var b = fmt.split(/\W+/);
	var i = 0, j = 0;
	
	
	// parse and validate differently depending on the format string
	
	
	
	if ( fmt == "yyyy") {

		// parse the data in a way that is appropriate for the format string
		for (i = 0; i < a.length; ++i) {
			if (a[i].search(/[a-zA-Z]+/) != -1) {
				var t = -1;
				if (a[i].length >= 3) {
					for (j = 0; j < 12; ++j) {
						if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
					}
				}
				if (t != -1) {
					if (m != -1) {
						d = m+1;
					}
					m = t;
				}
			} else if (parseInt(a[i], 10) <= 12 && m == -1) {
				m = a[i]-1;
			} else {
				if( y == 0)
					y = parseInt(a[i], 10);
				else
					y = y*100 + parseInt(a[i], 10);
			}
		} 

		// validate that the parse will produce an appropriate date object
		if (y > 999 && y < 10000)
		{
			date = new Date(y, 0, 1);
			if(date.getFullYear() == y)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}	
	
	} // if (format string is "yyyy")
	
	else if ( fmt == "mm-yyyy") {

		// parse the data in a way that is appropriate for the format string
		for (i = 0; i < a.length; ++i) {
			if (a[i].search(/[a-zA-Z]+/) != -1) {
				var t = -1;
				if (a[i].length >= 3) {
					for (j = 0; j < 12; ++j) {
						if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
					}
				}
				if (t != -1) {
					if (m != -1) {
						d = m+1;
					}
					m = t;
				}
			} else if (parseInt(a[i], 10) <= 12 && m == -1) {
				m = a[i]-1;
			} else {
				if( y == 0)
					y = parseInt(a[i], 10);
				else
					y = y*100 + parseInt(a[i], 10);
			}
		} 

		// validate that the parse will produce an appropriate date object
		if (y != 0 && m != -1)
		{
			date = new Date(y, m, 1);
			if(date.getFullYear() == y && date.getMonth() == m)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}

	} // if (format string is "mm-yyyy")
	
	else if ( fmt == "mm-dd-y") {
		
		for (i = 0; i < a.length; ++i)
		{
			if (b[i] == "D" || b[i] == "DD") {
				continue;
			}
			if (b[i] == "d" || b[i] == "dd") {
			 if (a[i].search(/[a-zA-Z]+/) != -1) {
	 			enableAlertDialog("Invalid date. Please reenter date.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");
	 	      	invalidDateFormat = true;
			    return true;
			 }
				d = parseInt(a[i], 10);
			}
			if (b[i] == "m" || b[i] == "mm") {
				m = parseInt(a[i], 10) - 1;
			}
			if ((b[i] == "y") || (b[i] == "yy") || (b[i] == "yyyy")) {
			    if (a[i].search(/[a-zA-Z]+/) != -1) {
	 				enableAlertDialog("Invalid date. Please reenter date.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");
	 	      		invalidDateFormat = true;
			    	return true;
			 	}
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
			}
			if (b[i] == "M" || b[i] == "MM") {
				if (a[i].length >= 3) {
					for (j = 0; j < 12; ++j) {
						if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
					}
				}
			}
		}

		if (y != 0 && m != -1 && d != 0)
		{
			date = new Date(y, m, d);
			if(date.getFullYear() == y && date.getMonth() == m && date.getDate() == d)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}
		
	} // if (format string is "mm-dd-y")
	
	// Note: If you need this method to validate a format other than "mm-dd-yyyy", "mm-yyyy", "yyyy"  or "mm-dd-y"
	//		 you will need to add code here.
	
	// all other validation code from a third party
	else {
	
		for (i = 0; i < a.length; ++i)
		{
			if (b[i] == "D" || b[i] == "DD") {
				continue;
			}
			if (b[i] == "d" || b[i] == "dd") {
			 if (a[i].search(/[a-zA-Z]+/) != -1) {
	 			enableAlertDialog("Invalid date. Please reenter date.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");
	 	      	invalidDateFormat = true;
			    return true;
			 }
				d = parseInt(a[i], 10);
			}
			if (b[i] == "m" || b[i] == "mm") {
				m = parseInt(a[i], 10) - 1;
			}
			if ((b[i] == "y") || (b[i] == "yy") || (b[i] == "yyyy")) {
			    if (a[i].search(/[a-zA-Z]+/) != -1) {
	 				enableAlertDialog("Invalid date. Please reenter date.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");
	 	      		invalidDateFormat = true;
			    	return true;
			 	}
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
			}
			if (b[i] == "M" || b[i] == "MM") {
				if (a[i].length >= 3) {
					for (j = 0; j < 12; ++j) {
						if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
					}
				}
			}
		}
		if (y != 0 && m != -1 && d != 0)
		{
			date = new Date(y, m, d);
			if(date.getFullYear() == y && date.getMonth() == m && date.getDate() == d)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}
		y = 0; m = -1; d = 0;
		for (i = 0; i < a.length; ++i) {
			if (a[i].search(/[a-zA-Z]+/) != -1) {
				var t = -1;
				if (a[i].length >= 3) {
					for (j = 0; j < 12; ++j) {
						if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
					}
				}
				if (t != -1) {
					if (m != -1) {
						d = m+1;
					}
					m = t;
				}
			} else if (parseInt(a[i], 10) <= 12 && m == -1) {
				m = a[i]-1;
			} else if (parseInt(a[i], 10) > 31 && y == 0) {
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);a
			} else if (d == 0) {
				d = a[i];
			}
		}

		if (m != -1 && d != 0)
		{
			date = new Date(y, m, d);
			if(date.getFullYear() == y && date.getMonth() == m && date.getDate() == d)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}
		
		y = 0; m = -1; d = 0;
		if((str.length == 6 || str.length == 8) && (str.search(/\D/) == -1))
		{
			mstr = str.substr(0,2);
			dstr = str.substr(2,2);
			ystr = str.substr(4);
			 
			if (parseInt(mstr, 10) <= 12 && m == -1)
			{
				m = parseInt(mstr, 10)-1;
			}
			if (y == 0)
			{
				y = parseInt(ystr, 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
			}
			if (parseInt(dstr, 10) <= 31 && d == 0) 
			{
				d = parseInt(dstr, 10);
			}
		}
		if (y != 0 && m != -1 && d != 0)
		{
			date = new Date(y, m, d);
			if(date.getFullYear() == y && date.getMonth() == m && date.getDate() == d)
			{
				element.value = printDate(date,fmt);
				invalidDateFormat = false;
				return true;
			}
		}
	} // else (use complex code from third party)
	
	//cannot parse
//	if (showDialog) {
		enableAlertDialog("Invalid date. Please reenter date.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");	
//	}

	//used to stop select events with invalid dates
	invalidDateFormat = true;
	return false;
}

function printDate(date, fmt)
{
	var str = new String(fmt);
	var m = date.getMonth();
	var d = date.getDate();
	var y = date.getFullYear();
	var wn = date.getWeekNumber();
	var w = date.getDay();
	var s = new Array();
	s["d"] = d;
	s["dd"] = (d < 10) ? ("0" + d) : d;
	s["m"] = 1+m;
	s["mm"] = (m < 9) ? ("0" + (1+m)) : (1+m);
	s["y"] = y;
	s["yyyy"] = y;
	s["yy"] = new String(y).substr(2, 2);
	s["w"] = wn;
	s["ww"] = (wn < 10) ? ("0" + wn) : wn;
	var re = /(.*)(\W|^)(d|dd|m|mm|y|yy|yyyy|MM|M|DD|D|w|ww)(\W|$)(.*)/;
	while (re.exec(str) != null) {
		str = RegExp.$1 + RegExp.$2 + s[RegExp.$3] + RegExp.$4 + RegExp.$5;
	}
	return str;
}

function parseAndValidateTime(element, fmt) 
{
	var str = element.value;
	if(str == "")
	{
		return;
	}
	
	var a = str.split(/\W+/);
	var b = fmt.split(/\W+/);
	var h = -1;
	var m = -1;

	var i = 0, j = 0;
	for (i = 0; i < a.length; ++i)
	{
		if (b[i] == "h" || b[i] == "hh") {
			h = parseInt(a[i], 10);
		}
		if (b[i] == "m" || b[i] == "mm") {
			m = parseInt(a[i], 10);
		}
	}
	if(h != -1 && h > 0 && h < 13)
	{
		var time = null;
		if(m != -1)
		{
			if(m >= 0 && m < 10)
			{
				time = h.toString() + ":0" + m.toString();
			}
			else if(m >= 10 && m < 60)
			{
				time = h.toString() + ":" + m.toString();
			}
		}
		else
		{
			time = h.toString() + ":00" 
		}
		
		if(time != null)
		{
			element.value = time;
			return true;
		}
	}
	
	if(((str.length == 4) || (str.length == 3))&& (str.search(/\D/) == -1))
	{
		h = parseInt(str.substr(0,str.length - 2), 10);
		m = parseInt(str.substr(str.length - 2), 10);
		 
		if(h != -1 && h > 0 && h < 13)
		{
			if(m >= 0 && m < 10)
			{
				time = h.toString() + ":0" + m.toString();
			}
			else if(m >= 10 && m < 60)
			{
				time = h.toString() + ":" + m.toString();
			}
			
			if(time != null)
			{
				element.value = time;
				return true;
			}
		}
	}
	
	//cannot parse
	enableAlertDialog("Invalid time format. Please reenter time.","document.getElementById('"+element.name+"').focus();document.getElementById('"+element.name+"').select();");
}

function setTitleForInputField(elem)
{
	if(elem.value != null && elem.value != "")
	{
		elem.title = elem.value;
	}
	else
	{
		elem.title = "";
	}
}

function viewSource()
{
	window.open("view-source:" + window.location.href);
}

function openInNewWindow( url ) { 
	openInNewWindow( url, 'popupWindow' );
}

function openInNewWindow( url, windowName ) { 
	if (windowName.indexOf(' ') >= 0) {
		alert('IE 6.0+ cannot handle window names containing spaces.  Please update windowName to a value that does not contain spaces.');
	}
	else {
		window.open( url, windowName, "height=540,width=480,location=no,menubar=no,status=no,toolbar=no,resizable=yes" );
	}
}

function resetURL(url)
{
	window.location.href=url;
}

function setAllRadios(level,formName)
{
	var form = obtainForm(formName);
		for(index = 0; index < form.elements.length; index++)
		{
			if(form.elements[index] != null && form.elements[index].type == 'radio' && form.elements[index].value == level)
			{
				form.elements[index].checked= true;
			}
		}
}

function setAllChecks(trueFalse,formName)
{
	var form = obtainForm(formName, trueFalse);
	var toggle = null;
	for(index = 0; index < form.elements.length; index++)
	{
		if(form.elements[index].type == 'checkbox' )
		{
			form.elements[index].checked= trueFalse;
		}
	}
}

/*
 * generic call to stop an event that is browser independent
 */
function stopEvent(evt)
{
	evt = (evt) ? evt : ((event) ? event : null);
	if(evt)
	{
		if (isIE)
		{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		else
		{
			evt.preventDefault();
			evt.stopPropagation();
		}
		return false;
	}
}

/*
 * generic call to add event to an element that is browser independent
 */
function addEvent(el, evname, func)
{
	if (el.attachEvent) // IE
	{
		el.attachEvent("on" + evname, func);
	} 
	else if (el.addEventListener) // Gecko / W3C
	{
		el.addEventListener(evname, func, true);
	}
}

/*
 * generic call to remove event from an element that is browser independent
 */
function removeEvent(el, evname, func)
{
	if (el.detachEvent) // IE 
	{
		el.detachEvent("on" + evname, func);
	} 
	else if (el.removeEventListener) // Gecko / W3C
	{
		el.removeEventListener(evname, func, true);
	}
}

function toggleQuestionEx(field, val, trigger)
{ 
  var block = document.getElementById(field + "Data");
  if (block != null)
  {
    if(val == trigger) {
      block.style.display = "block";
    } else {
      block.style.display = "none";  
    }
  }
}

function toggleQuestionCheckBox(field)
{ 
  var block = document.getElementById(field.name + "Data");
  if (block != null)
  {
    if(field.checked) {
      block.style.display = "block";
    } else {

      block.style.display = "none";  
    }
  }
}

/*
 * generic call to get target element from event that is browser independent
 */
function getTargetElement(evt)
{
	if (isIE)
	{
		return window.event.srcElement;
	}
	else
	{
		return evt.target;
	}
}

// This function clears all textboxes, textareas, checkboxes, hidden, and optionally radios in the div.
// You can pass it a div name or a complete div.
// NOTE: This is a recursive function and will also clear any hidden items in the div (for combo box control)
// since radio buttons are special, added a param to specify whether or not to clear them
// todo: add other types of controls to be cleared.
function clearContainerItems(aDiv, clearRadios)
{
	// if we get the name, get the object
  	if (typeof(aDiv)=="string")
  	{
  		aDiv = document.getElementById(aDiv);
  	}
	
	for(var i=0;i < aDiv.childNodes.length; i++)
	{
	//alert('1 ' + aDiv.childNodes[i].id + " " + aDiv.childNodes[i].type);

		if(aDiv.childNodes[i].type=="text")
		{
			aDiv.childNodes[i].value="";
		}
		
		if(aDiv.childNodes[i].type=="password")
		{
			aDiv.childNodes[i].value="";
		}
		
		if(aDiv.childNodes[i].type=="hidden")
		{
			var name = aDiv.childNodes[i].name;
			aDiv.childNodes[i].value="";
			if(name != null && name.startsWith('LIST_BOX_'))
			{
				var id = name.substring(name.indexOf('LIST_BOX_') + 9, name.length);
				var table = document.getElementById(id + '_table');
				for (var j = 0; j < table.rows.length; j++)
				{
				    table.rows[j].cells[0].className = 'listbox-item';
				}
				
			}
		}

		if (aDiv.childNodes[i].type=="textarea")
		{
			aDiv.childNodes[i].value="";
		}

		if (aDiv.childNodes[i].type=="checkbox")
		{
			aDiv.childNodes[i].checked = false;
		}

		if (aDiv.childNodes[i].type=="select-one")
		{
			// netscape 6 does not honor -1
			aDiv.childNodes[i].selectedIndex = 0;
			aDiv.childNodes[i].selectedIndex = -1;
		}

		if (aDiv.childNodes[i].type=="option")
		{
			aDiv.childNodes[i].selected = false;
		}

		if ((aDiv.childNodes[i].type=="radio") && (clearRadios == true))
		{
			aDiv.childNodes[i].checked = false;
		}

		if (aDiv.childNodes[i].childNodes.length > 0)
		{
			// recursive call to get nested objects
			clearContainerItems(aDiv.childNodes[i], clearRadios);
		}
	}
}

// text area counter js functions
function TrackCount(fieldObj,countFieldName,maxChars)
{
  var countField = document.getElementById(countFieldName);
  var referingMaxElement = document.getElementById(fieldObj.id+'Max');
  if(referingMaxElement != null && referingMaxElement != 'undefined' && referingMaxElement.value!='' && referingMaxElement.value!='0')
  {
	  maxChars = referingMaxElement.value;    
	  var diff = maxChars - fieldObj.value.length;
	  
	  // Need to check & enforce limit here also in case user pastes data
	  if (diff < 0)
	  {
	    fieldObj.value = fieldObj.value.substring(0,maxChars);
	    diff = maxChars - fieldObj.value.length;
	  }
	  countField.value = diff;
  }
}


function LimitText(fieldObj,maxChars)
{
  var referingMaxElement = document.getElementById(fieldObj.id+'Max');	
  if(referingMaxElement != null && referingMaxElement != 'undefined' && referingMaxElement.value!='' && referingMaxElement.value!='0') 
  {
	  maxChars = referingMaxElement.value;  
	
	  var result = true;
	  if (fieldObj.value.length >= maxChars)
	    result = false;
	  
	  if (window.event)
	    window.event.returnValue = result;
	  return result;
  }
  
  if (window.event)
	    window.event.returnValue = true;
  return true;
}

/**
 * @param className The name of an HTML element's class attribute.
 * @return An array of document nodes.
 * @author James Tikalsky
 */
function Teams_getNodesWithClassName( className ) {
  var nodes = new Array();
  for ( var i = 0; i < this.length; ++i ) {
    this[ i ].hasClassName = Teams_hasClassName;
    if ( this[ i ].hasClassName( className ) ) {
      nodes.push( this[ i ] );
    }
  }
  return nodes;
}

/**
 * @param className The name of an HTML element's class attribute.
 * @return boolean
 * @author James Tikalsky
 */
function Teams_hasClassName( className ) {
  var classNames = this.className.split( " " );
    classNames.contains = Array_contains;
  
  return classNames.contains( className );
}

/**
 * Some handy additions to String
 */
String.prototype.startsWith = String_startsWith;
String.prototype.endsWith = String_endsWith;

/**
 * Determines whether a String begins with a particular value.
 * @param string The value to test for.
 * @author James Tikalsky
 */
function String_startsWith( string ) {
  if ( this.indexOf( string ) == 0 ) {
    return true;
  } else {
    return false;
  }
}

/**
 * Determines whether a String ends with a particular value.
 * @param string The value to test for.
 * @author James Tikalsky
 */
function String_endsWith( string ) {
  if ( this.lastIndexOf( string, this.length - string.length ) > -1 ) {
    return true;
  } else {
    return false;
  }
}

/**
 * Provides a cross-platform way of getting an event.
 */
function Teams_getEvent( event ) {
  if ( document.attachEvent ) { // Don't like relying on the document like this...
    event = window.event;
    event.target = window.event.srcElement;
  }
  event.character = Event_character;   
  event.characterCode = Event_characterCode;
  event.isKeyCombo = Event_isKeyCombo;
  return event;
}

/** Returns the character of the key that was pressed.
    @author James Tikalsky */          
function Event_character() {
  if ( this.characterCode() == 13 ) {
    return "enter";
  } else if ( this.characterCode() == 27 ) {
    return "escape";
  } else if ( this.characterCode() > 0 ) {
    return String.fromCharCode( this.characterCode() );
  } else {
    return "";
  }
}

/** Provides a cross-platform way of getting the character code.
    @author James Tikalsky */   
function Event_characterCode() {
  if ( this.charCode ) { // TODO Do all events have a character code? What if its a mouse event?
    return this.charCode;
  } else {
    return this.keyCode;
  }
}


function Event_isKeyCombo( keyCombo ) {
  var keys = keyCombo.split( "+" );
   keys.contains = Array_contains;
   keys.removeString = Array_removeString;

    if ( keys.contains( "CTRL" ) && !this.ctrlKey ) {
      return false;
    }
    keys.removeString( "CTRL" );

    if ( keys.contains( "ALT" ) && !this.altKey ) {
      return false;    
    }
    keys.removeString( "ALT" );
    
    //TODO JT Add all of the modifier keys.
    for ( var i = 0; i < keys.length; ++i ) {
      if ( keys[i] == this.character() ) {
        return true;
      }
    }
}

function Array_contains( string ) {
  for ( var i = 0; i < this.length; ++i ) {
    if ( this[i] == string ) {
      return true;
    }
  }
  return false;
}

function Array_removeString( string ) { //jt May be able to expand this to object, which would be more useful.
  for ( var i = 0; i < this.length; ++i ) {
    if ( this[i] == string ) { //TODO jt Make sure this comparison is adequate, i.e. object equality vs reference equality.
      this.splice( i, 1 ); 
    }
  }
}


/** Attach this to any HTMLInputElement object. */
function HTMLInputElement_isType( controlType ) {
  if ( this.type == controlType ) {
    return true;
  } else {
    return false;
  }
}

/** Attach this function to an HTMLTableRowElement object.
    @author James Tikalsky */
function HTMLTableRowElement_isEvenRow() {
  if ( this.rowIndex % 2 == 0 ) {
    return true;
  } else {
    return false;
  }
}

/** Attach this function to any node implementing the EventTarget interface 
    to provide a cross-browser way of attaching an event.
    @author James Tikalsky */
function EventTarget_addEvent( type, listener ) {
  if ( this.attachEvent )	{
    this.attachEvent( "on" + type, listener );
  } else if ( this.addEventListener ) { // Gecko
    var USE_CAPTURE = true;
    this.addEventListener( type, listener, USE_CAPTURE );
  }
}

/** Print preview functionality for Search results.
    @author James Tikalsky */
function searchResultsPrintPreview() {
  document.useStyleSheet = useStyleSheet;
  if ( !document.printPreview ) {
    document.useStyleSheet( "print" );
    document.printPreview = true;
    if ( isIE ) {
      tableBodyRowDiv.style.overflow = "auto";
      tableBodyRowDiv.style.height = "auto";
    }
  } else {
    document.useStyleSheet( "screen" );
    document.printPreview = false;
    if ( isIE ) {
      tableBodyRowDiv.style.overflow = "scroll";
      tableBodyRowDiv.style.height = "auto";
    }
  }
}

function useStyleSheet( mediaType ) {
  var links = document.getElementsByTagName( "LINK" );
  if ( mediaType == "print" ) {
    links[0].setAttribute( "href", "/base/css/asfPrint.css" );
  } else {
    links[0].setAttribute( "href", "/base/css/asf.css" );
  }
}

function HTMLTableRowElement_isSelected() {
  if ( this.selected ) {
    return true;
  } else {
    return false;
  }
}

function HTMLTableRowElement_select() {
  this.className = "tableSelected";
  this.selected = true;
}


function AllUpperCaseWords(word) {
	word.replace(" isd "," ISD ");
	word.replace(" csd "," CSD ");
}

var alreadyDone = new Array();

function AllUpperCaseWords(word) {
	word = word.replace(" isd"," ISD");
	word = word.replace(" Isd"," ISD");
	word = word.replace(" csd"," CSD");
	word = word.replace(" Csd"," CSD");
	return word;
}
function ProperCase(field){
	if (alreadyDone[field.name] == "true") {
		return;
	}
	STRING = field.value;
	alreadyDone[field.name] = "true";
	var strReturn_Value = "";
	var iTemp = STRING.length;
	if(iTemp==0){
		field.value= strReturn_Value;
		return"";
	}
	var UcaseNext = false;
	strReturn_Value += STRING.charAt(0).toUpperCase();
	for(var iCounter=1;iCounter < iTemp;iCounter++){
		if(UcaseNext == true){
			strReturn_Value += STRING.charAt(iCounter).toUpperCase();
		}
		else{
			strReturn_Value += STRING.charAt(iCounter).toLowerCase();
		}
		var iChar = STRING.charCodeAt(iCounter);
		if(iChar == 32 || iChar == 45 || iChar == 46){
			UcaseNext = true;
		}
		else{
			UcaseNext = false
		}
		if(iChar == 99 || iChar == 67){
			if(STRING.charCodeAt(iCounter-1)==77 || STRING.charCodeAt(iCounter-1)==109){
				UcaseNext = true;
			}
		}
	} //End For
	strReturn_Value = AllUpperCaseWords(strReturn_Value);
	field.value= strReturn_Value;
} //End Function

function colorWindow(property) {
	var url = '/base/js/popups/colorTagPopup.html?'+property;
    mywindow=open(url,'myname','resizable=yes,width=350,height=270');
    if (mywindow.opener == null) mywindow.opener = self;
}

  function checkForAlphaNumeric(el){
  	var charpos = el.value.search("[^A-Za-z0-9]"); 
    if(el.value.length > 0 &&  charpos >= 0) 
     { 
		return true;
     }else{
       return false;
     }
  }

function checkForNumericEntry(e) {
	e = (e) ? e : event;
	var  charCode =  (e.intCode) ? e.intCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
	if (intCode > 31 &&  (intCode < 48 || intCode > 57)) {
  		return false;
	}
  return true;
}

function getComponentValue(id)
{
 return document.getElementById(id).value;
}

function clearSmartForm() {
	document.SmartForm.reset();
}

function xGridGetJSONResult(result){
  return eval('(' + result + ')');
}

function xGridMoveSelectedRowsUp(grid){

  if (grid.getSelectedId()){ //we have selection
	  var params =  {"gridId": grid.entBox.id , "eventName":"doOnMoveSelectedRowsUp"};
	  var result = remote.callXGridListener(toJSON(params));
	  var jsonResult = xGridGetJSONResult(result);
	  		    
	  //get grid content from result
	  var xml = jsonResult.sourceGridContent;
	  grid.clearAll();
	  grid.loadXMLString(xml);
	  
	  //select rows		    
	  var rowIdxs = jsonResult.selectedIndexIds;
	  xGridSelectRows(grid, rowIdxs, false);
  }
}


function xGridMoveSelectedRowsDown(grid){
  
  if (grid.getSelectedId()){ //we have selection
	  var params =  {"gridId": grid.entBox.id , "eventName":"doOnMoveSelectedRowsDown"};
	  var result = remote.callXGridListener(toJSON(params));
	  var jsonResult = xGridGetJSONResult(result);
	  		    
	  //load grid content from result
	  var xml = jsonResult.sourceGridContent;
	  grid.clearAll();
	  grid.loadXMLString(xml);
	  
	  //select rows		    
	  var rowIdxs = jsonResult.selectedIndexIds;
	  xGridSelectRows(grid, rowIdxs, false);
  }
}

function xGridSelectRows(grid, rowIdxs, invoke){
  for(var i = 0; i < rowIdxs.length; i++){
	grid.selectRow(rowIdxs[i],invoke,true);   
  }
}

function xGridSelectAll(grid) {
  if (grid.getRowsNum() > 0){
	grid.clearSelection();
	var rowIds = grid.getAllItemIds(",").split(",");
	var i;
	for(i = 0; i < rowIds.length; i++){
	    var rowIdx = grid.getRowIndex(rowIds[i]);
	  	grid.selectRow(rowIdx,true,true);   
	}
  }
}

function xGridDeSelectAll(grid){
  if (grid.getRowsNum() > 0){
	grid.clearSelection();
	var params =  {"gridId": grid.entBox.id , "eventName":"clearSelection"};
	remote.callXGridListener(toJSON(params));
  }
}

function xGridOnRowSelected(rowId){
  var params =  {"gridId": this.entBox.id , "eventName":"doOnRowSelected" , "rowId":this.getSelectedId()};
  remote.callXGridListener(toJSON(params));
}

function xGridOnCellEdit(stage, rowId, cellIdx, newVal, oldVal){
  if(stage == 0 || stage == 1){
    return true;
  }
  else if((stage==2) && (oldVal != newVal)){
	     
	     var result = remote.validateXGridCell(this.entBox.id, cellIdx , newVal);
	     var jsonResult = xGridGetJSONResult(result);
         var errorMessage = jsonResult.errorMsg;
         if (errorMessage){
           this.cells(rowId,cellIdx).setValue(oldVal);
           enableAlertDialog(errorMessage);
           return false;
         }
		 var params = {"gridId": this.entBox.id ,"eventName": "doOnEditCell", "columnIndex" :cellIdx, "value" : newVal };			  
 		 var result = remote.callXGridListener(toJSON(params));
         var jsonResult = xGridGetJSONResult(result);
         var errorMessage = jsonResult.errorMsg;
         if (errorMessage){
           this.cells(rowId,cellIdx).setValue(oldVal);
           enableAlertDialog(errorMessage);
           return false;
         }
         return true;
  }
}

function xGridOnCheck(rowId, cellIdx, state){
  var value = state ? "1" : "0";
  var params = {"gridId": this.entBox.id ,"eventName": "doOnCheck", "rowId":rowId, "columnIndex" :cellIdx, "value" : value };
  remote.callXGridListener(toJSON(params));
}

function xGridOnRowDeleted(rowId){
   var params = {"gridId": this.entBox.id ,"eventName": "doOnRowDeleted", "rowId" : rowId };			  
   remote.callXGridListener(toJSON(params));
   return true;
}

function xGridOnDrop(sourceRowId, targetRowId, id, sourceGrid, targetGrid){
	     
  var targetRow = targetGrid.getRowById(targetRowId);
  var targetRowIndex = targetGrid.rowsCol._dhx_find(targetRow);
  var params = {"gridId": sourceGrid.entBox.id, "eventName":"doOnDrop", "rowIndex" : targetRowIndex , "targetGridId" : targetGrid.entBox.id};
  var result = remote.callXGridListener(toJSON(params));
  var jsonResult = xGridGetJSONResult(result);
  
  //get xml contents from result
  var xml1 = jsonResult.sourceGridContent;
  sourceGrid.clearAll();
  sourceGrid.loadXMLString(xml1);
  
  if (sourceGrid.entBox.id != targetGrid.entBox.id)
  {
     var xml2 = jsonResult.targetGridContent;
  	 targetGrid.clearAll();
   	 targetGrid.loadXMLString(xml2);
  }
}

			  function xGridSaveRow(gridId){
			  	var params =  {"gridId": gridId , "eventName":"save"};
			  	remote.callXGridListener(toJSON(params));
			  	//alert('done');
			  }
		
	 	 	 function xGridAddRow(gridId){
 	 	        var params =  {"gridId":gridId ,"eventName": "doOnRowAdded"};
  			    var jsonResult = xGridGetJSONResult(remote.callXGridListener(toJSON(params)));
			   
			    var rowId = jsonResult.rowId;
			    var values = rowId;
			  	
  		  	    grid.addRow(rowId, values);
   	 	   	}  
   	 	   	
   	 	   	function xGridDeleteRow(grid)
   	 	   	{
   	 	   		grid.deleteSelectedItem();
   	 	   	}
   	 	   	
   	 	function xGridMoveSelectedRows(sourceGrid , targetGrid )
   	  	{
    	  	var params =  {"gridId": sourceGrid.entBox.id , "eventName":"moveSelectedRows" , "targetGridId": targetGrid.entBox.id};
    	  	var result = remote.callXGridListener(toJSON(params));
  		    var jsonResult = xGridGetJSONResult(result);
  		    
  		    //get grid contents from result
  		    var xml1 = jsonResult.sourceGridContent;
  		    sourceGrid.clearAll();
  		    sourceGrid.loadXMLString(xml1);
  		     
  		    var xml2 = jsonResult.targetGridContent;
  		    targetGrid.clearAll();
   		    targetGrid.loadXMLString(xml2);
   	  	}
   	  	

function enableColumn(colArr) {
  for ( var j=0; j<colArr.length; j++ ) { 
    if ( document.getElementById(colArr[j]) ) 
    	 document.getElementById(colArr[j]).disabled = false; 
  }
}


function disableColumn(colArr) {
  for ( var j=0; j<colArr.length; j++ ) { 
    if ( document.getElementById(colArr[j]) ) 
    	 document.getElementById(colArr[j]).disabled = true; 
  }
}

function getAllControlNameValues() {
  	var length = document.forms.length;
	var map = "{";
  	for ( var j=0; j<length; j++ ) {

  		var elemLength = document.forms[j].elements.length;
    	for ( var i=0; i<elemLength; i++ ) {
    	    var name = document.forms[j].elements[i].name;
    	    var value = document.forms[j].elements[i].value;
    	    if ( ( name!='' && name != "undefined" ) && ( value != "undefined" ) ) 
    	    {
    	    //alert(document.forms[j].elements[i].type + " " + document.forms[j].elements[i].checked + " " + document.forms[j].elements[i].name);
	    	    if (document.forms[j].elements[i].type == 'radio' && document.forms[j].elements[i].checked == true)
		    	{
		    	//alert('1');
		    		map += "\"" + name + "\": \"" + value + "\"," ;
		    	}
		    	else if (document.forms[j].elements[i].type == 'checkbox' && document.forms[j].elements[i].checked == true)
		    	{
		    	//alert('2');
		    		map += "\"" + name + "\": \"" + value + "\"," ;
		    	}
		    	else if (document.forms[j].elements[i].type != 'radio' && document.forms[j].elements[i].type != 'checkbox')
		    	{
		    	//alert('3');
    	        	map += "\"" + name + "\": \"" + value + "\"," ;
    	        }
			}
		}
	 }
	 map = map.substring(0, map.length-1);
	 map += "}" ;
	 return map;
}


		function refreshTable(tableName) {
		try {
		var map = getAllControlNameValues();	
		    var createdTable = remote.refreshTable(tableName, map);
		    document.all[tableName+"panelContainer"].innerHTML = createdTable;
		    eval("callScrollSortTable_"+tableName)();
		    postScrollSortStable_Load( tableName );
		    clearSmartForm();
		  } catch ( e ) { alert(e); }
		}
		
		
function sortScrollSortTable(tableName) {
  try {
	   var map = getAllControlNameValues();
	   //alert('here');
    var createdTable = remote.sortScrollSortTable(tableName, map);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Sort( tableName );  } catch ( e ) { alert(e); } 
}


function postScrollSortStable_Sort(tableName) {
  var length = document.forms.length;
  for ( var j=0; j<length; j++ ) {
  	var elemLength = document.forms[j].elements.length;
    	for ( var i=0; i<elemLength; i++ ) {
    	    var name = document.forms[j].elements[i].name;
    	    if ( name!='' && name != "undefined" ) { 
    	    	if ( name.startsWith("tableSortOrder") &&  name.endsWith(tableName) ) {
    	       		ScrollSortHandler.all[tableName].setSortOrderValues(document.getElementById(name).value);
  				break;
				}
			}
		}
	 }
}

function postScrollSortStable_Load(tableName) {
  var length = document.forms.length;

  for ( var j=0; j<length; j++ ) {
  	var elemLength = document.forms[j].elements.length;
    	for ( var i=0; i<elemLength; i++ ) {
    	    var name = document.forms[j].elements[i].name;
    	    if ( name!='' && name != "undefined" ) { 
    	    	if ( name.startsWith("tableSortOrder") &&  name.endsWith(tableName+"_record_count") ) {
				try{
    	       		ScrollSortHandler.all[tableName].setScrollSortTableFooter(document.getElementById(name).value);
    	       		}catch (e) {}
  				break;
				}
			}
		}
	 }
}

function addRowJson(tableName) {
addRow(tableName);
}

function addRow(tableName) {
  try {
	   var map = getAllControlNameValues();
    var createdTable = remote.addRow(tableName, map);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Load( tableName );
    postScrollSortStable_Sort( tableName );
    clearSmartForm();
  } catch ( e ) { alert(e); } 
}


function getControlType(controlName)
{
	    try {
	    var type = document.getElementById(controlName).type;
	   // alert(document.getElementById(controlName).name + " " + document.getElementById(controlName).type);
	    return type;}
		catch (e)
		{
		 //alert(controlName + e);
		 return "";
		}
}

function editRow(tableName) {
  var idx = ScrollSortHandler.selectedIndex[tableName];  try {
    var retVal = remote.editRow(tableName, idx); 
    var JSONObj = eval('('+ retVal + ')');
    var len = JSONObj.selectedValues.length ;
    var colArr = JSONObj.columnToDisable;
    for ( var i=0; i<len; i++ ) { 
    		var conrolName = JSONObj.selectedValues[i].name;
			var controlType = getControlType(conrolName);

    		if ( document.getElementById(conrolName) ) {  
    			if ( controlType == "text" ||  controlType == "password")
    			{
    				document.getElementById(conrolName).value = JSONObj.selectedValues[i].value; 
    			}
    			else if ( controlType == "textarea" )
    				document.getElementById(conrolName).value = JSONObj.selectedValues[i].value; 
    			else if ( getControlType(conrolName+"txt") == "text" ) 
    			{ 
    				document.getElementById(conrolName+"txt").value = JSONObj.selectedValues[i].value; 
    				document.getElementById(conrolName).value = JSONObj.selectedValues[i].value; 
    			} 
    			else if ( controlType == "checkbox" ) 
    			{ 
    				if ( JSONObj.selectedValues[i].value == "yes" || JSONObj.selectedValues[i].value == "YES" || JSONObj.selectedValues[i].value == "Y"  || JSONObj.selectedValues[i].value == "on" ) 
    					document.getElementById(conrolName).checked = true; 
    				else 
    					document.getElementById(conrolName).checked = false; 
    			}
    			else if ( controlType == "radio" ) 
    			{ 
	    			//alert(document.SmartForm.studyOptions.length);
	    			var elem = eval("document.SmartForm." + conrolName);
	    			//alert(elem.length);
	    			for (var k = 0; k < elem.length; k++)
	    			{
	    				//alert(elem[k].value + " " + document.getElementById(conrolName).value + " " + JSONObj.selectedValues[i].value);
	    			
	    				if(JSONObj.selectedValues[i].value == elem[k].value)
	    				{
	    					elem[k].checked = true;
	    					elem.value = JSONObj.selectedValues[i].value;
	    				}
	    				else
	    				{
	    					elem[k].checked = false;
	    					elem.value = JSONObj.selectedValues[i].value;
	    				}
	    			}
    			}
    			else if ( controlType == "hidden" ) 
    			{ 
    			//alert(conrolName + " --- " + JSONObj.selectedValues[i].value + "==" + document.getElementById(conrolName).name);
    			
					if(document.getElementById('LIST_BOX_' + conrolName))
					{
						var table = document.getElementById(conrolName + '_table');
						//alert(table);
						for (var j = 0; j < table.rows.length; j++)
						{
						//alert(conrolName);
							if (JSONObj.selectedValues[i].value != '' && table.rows[j].cells[0].innerHTML.indexOf(JSONObj.selectedValues[i].value) != -1)
							{
						    	table.rows[j].cells[0].className = 'listbox-hilite-selected';
						    	document.getElementById(conrolName).value = j;
						    }
						    else
						    {
						    	table.rows[j].cells[0].className = 'listbox-item';
						    }
						}
						
					}
    			
    
    				if (conrolName.indexOf('GROUP_1') != -1 && getControlType(conrolName+"GROUP_1") == "text")
    				{
    				  	 document.getElementById(conrolName).value = JSONObj.selectedValues[i].value; 
    				}

    			}
    		}
    }

    disableColumn(colArr);
  } catch ( e ) { alert(e); } 
}


function saveRowJson(tableName, columnToEnable) {
saveRow(tableName, columnToEnable);
}

function saveRow(tableName, columnToEnable) {
  try {
	   var map = getAllControlNameValues();
    var createdTable = remote.saveRow(tableName, map);

    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    //var colArr = columnToEnable.split(",") ;
    postScrollSortStable_Load( tableName );
    postScrollSortStable_Sort( tableName );
    //clearFormAndEnableFields(colArr);
  } catch ( e ) { alert(e); } 
}

function postJson()
{
  try {
	   var map = getAllControlNameValues();
	updateRequestWithPostedForm(map);
  } catch ( e ) { alert(e); } 
}

function deleteRow(tableName) {
  var idx = ScrollSortHandler.selectedIndex[tableName];
  try {
    var createdTable = remote.deleteRow(tableName, idx);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Load( tableName );
  } catch ( e ) { alert(e); } 
}


function addColumn(tableName) {
  try {
	   var map = getAllControlNameValues();
    var createdTable = remote.addColumn(tableName, map);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Load( tableName );
  } catch ( e ) { alert(e); } 
}


function deleteColumn(tableName) {
  try {
	   var map = getAllControlNameValues();
    var createdTable = remote.deleteColumn(tableName, map);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Load( tableName );
  } catch ( e ) { alert(e); } 
}


function rebuildTable(tableName) {
  try {
	   var map = getAllControlNameValues();
    var createdTable = remote.rebuildTable(tableName, map);
    document.all[tableName+"panelContainer"].innerHTML = createdTable;
    eval("callScrollSortTable_"+tableName)();
    postScrollSortStable_Load( tableName );
    postScrollSortStable_Sort( tableName );
  } catch ( e ) { alert(e); } 
}


function generateComboAndBuildOnCell( cell, table, columnId, rowIdx ) {
  try {
	   var retVal = remote.buildSSCombo();
    var JSONObj = eval('('+ retVal + ')');
    var comboItem = JSONObj.combo;
    var controlName = document.createElement( "input" );    controlName.id = columnId + "txt";
    controlName.name = columnId + "txt";
    controlName.onkeydown = 'ComboBox_testKey(event)';
    var spanId = table+"_"+columnId+"_"+rowIdx;
    var span = document.getElementById(spanId);
    span.innerHTML = '';
    span.appendChild( controlName );
    var controlNameArr = new Array();
    for ( var i=0; i<comboItem.length; i++ ) { 
    		controlNameArr[i] = new ComboBoxItem( comboItem[i], comboItem[i], false, {});
    }
    var methodName = "updateValueInScrollSortTable('"+table+"','"+columnId+"','"+rowIdx+"')";
    new ComboBox(columnId, document.getElementById(columnId + "txt"), controlNameArr, false, methodName, false, null, null, false, false, false, null);
  } catch ( e ) { alert(e); } 
}

function updateValueInScrollSortTable(table, columnId, rowIdx) {
  try {
	   var selectedValue = document.getElementById(columnId);
    remote.setSelectedValueInScrollSortTable( selectedValue.value, table, columnId, rowIdx );
    var spanId = table+"_"+columnId+"_"+rowIdx;
    var span = document.getElementById(spanId);
    span.innerHTML = selectedValue.value;
  } catch ( e ) { alert(e); } 
}

function editRowPostMsg(table, action, msg)
{
	if(testAndSetSelectedIndexIdFromTable(table,msg)) 
	{ 
		setActionForFormAndSubmit(action); 
	};
	return false;
}

function editRowPost(table, action)
{
	if(testAndSetSelectedIndexIdFromTable(table,'Please select an item to edit.')) 
	{ 
		setActionForFormAndSubmit(action); 
	};
	return false;
}

function editRowJson(table)
{
	if(testAndSetSelectedIndexIdFromTable(table,'Please select an item to edit.')) 
	{ 
		editRow(table);
	};
	return false;
}

function editRowJsonMsg(table, selectMsg)
{
	if(testAndSetSelectedIndexIdFromTable(table,selectMsg)) 
	{ 
		editRow(table);
	};
	return false;
}

function deleteRowPost(table, action)
{
  if(testAndSetSelectedIndexIdFromTable(table,'Please select an item to delete.')) 
  { 
      setActionForForm(action);enableConfirmDialog('Are you sure you want to delete this item?','SmartForm'); 
  };
  return false;
}

function deleteRowPostMsg(table, action, selectMsg, promptMsg)
{
  if(testAndSetSelectedIndexIdFromTable(table,selectMsg)) 
  { 
      setActionForForm(action);enableConfirmDialog(promptMsg,'SmartForm'); 
  };
  return false;
}


function deleteRowJsonMsg(table, selectMsg)
{
	if(testAndSetSelectedIndexIdFromTable(table,selectMsg)) 
	{ 
		deleteRow(table);
	}
	;return false;
}

function deleteRowJson(table)
{
  if(testAndSetSelectedIndexIdFromTable(table,'Please select an item to delete.')) 
  { 
      deleteRow(table);
  };
  return false;

}

function executeRowJson(table)
{
	if (remote.getEditScrollSortTableStatus(table) == 'EDIT')
	{
		saveRowJson(table);
	}
	else
	{
		addRowJson(table);
	}
}

function executeRowJsonMsg(table, selectMsg)
{
	if (remote.getEditScrollSortTableStatus(table) == 'EDIT')
	{
		saveRowJsonMsg(table,selectMsg);
	}
	else
	{
		addRowJsonMsg(table,selectMsg);
	}
}


		function xgridSearch(grid){  	
	 	  	  var xml = remote.search(getAllControlNameValues());
	 	  	  grid.clearAll();
	  		  grid.loadXMLString(xml);
        }

   	 	   	
   	 	   	
   	 	function xgridDefaultDoOnDrag(sourceRowId, targetRowId,sourceGrid, targetGrid)
		{
		   var sourceLevel = sourceGrid.getLevel(sourceRowId);
		   var targetLevel = targetGrid.getLevel(targetRowId);
		   if (targetLevel != sourceLevel - 1)
		   {
		      enableAlertDialog('Operation not allowed.');
		      return false;
		   }
		   return true;
		} 
		
		function xgridDefaultDoOnTreeDrop(sourceRowId, targetRowId, id, sourceGrid, targetGrid){
		   try
		   {
    		 var params = {"gridId": sourceGrid.entBox.id, "eventName":"doOnDrop",  "sourceRowId" : sourceRowId, "targetGridId" : targetGrid.entBox.id, "targetRowId" : targetRowId };
  		     var result = remote.callXGridListener(toJSON(params));
			 var jsonResult = xGridGetJSONResult(result);
  		     var xml = jsonResult.sourceGridContent;
  		     sourceGrid.clearAll();
  		     sourceGrid.loadXMLString(xml);
  		     sourceGrid.openItem(targetRowId);
  		   }
  		   catch(e) 
  		   {
   		     alert(e);
  		   }
		}
		
		 function addMessage(messageText, level){
		
					var pageMessageDiv = document.getElementById('pageMessageDiv');
					var createNewMessageDiv = null;
					//we can have something else before this, but not after
					var messageDiv = pageMessageDiv.lastChild;
					if((messageDiv == null) || ('message' != messageDiv.className))	{
						createNewMessageDiv = true;
						//case 1, the messageDiv doesn't exist(the firstChild is null, of the first child has a diff className)
					}
					else
					{
						//check to see if we display the same type, 
						//NOTE that if the messageDiv exist we assume it has a first child of type span, cheching this would make the code more difficult to understand
						var existingSpan = messageDiv.firstChild;
						if( level != existingSpan.className){
								//we already have a div but contains a span with different level
								//check to see if we have another div, cause we started with the last child
								var siblingMessageDiv = messageDiv.previousSibling;
								//NOTE that we can't asume that a second div exists, we must check for this
								if((siblingMessageDiv == null) || ('message' != siblingMessageDiv.className)){
									//create a new span with the class name we need
									//NOTE that we assume that if a second div node exists then it has the proper class and of course, the proper span
									createNewMessageDiv = true;
									//case 1, the messageDiv does exists, but it has a span of different level
								}
								else
								{
									//we fould the div where we need to add the message
									messageDiv = siblingMessageDiv;
								}
						}
					}
					if(createNewMessageDiv){
						//create the div
						messageDiv = document.createElement('div');
						messageDiv.className = 'message';
						pageMessageDiv.appendChild(messageDiv);
					}
					var messageSpan = document.createElement('span');
					messageSpan.className = level;
					
					var displayText = document.createTextNode(messageText);
					
					messageSpan.appendChild(displayText);
					messageDiv.appendChild(messageSpan);
					
					
				}
				
				function validate()
				{
					cleanMessages();
				 	var parms = getAllControlNameValues();
				 	var msgs = remote.validate(parms);
				 	if (msgs)
				 	{
				 		for (var i = 0; i < msgs.length; i++)
				 		{
						   addMessage(msgs[i],'error');
						}
						return false;
					}
					else
					{
						return true;
					}
				}
		
		
				function cleanMessages(){	
					var pageMessageDiv = document.getElementById('pageMessageDiv');
					var childrenDivs = pageMessageDiv.childNodes;
					for(var i=0;i<childrenDivs.length;i++){
						if('MsgBox'!=childrenDivs[i].id){
							pageMessageDiv.removeChild(childrenDivs[i]);
						}
					}
				}  
				
				
				
function setVisible(obj)
{ 
	obj = document.getElementById(obj);
	obj.style.visibility = (obj.style.visibility == 'visible') ? 'hidden' : 'visible';
}
function placeIt(obj)
{
	obj = document.getElementById(obj);
	if (document.documentElement)
	{
		theLeft = document.documentElement.scrollLeft;
		theTop = document.documentElement.scrollTop;
	}
	else if (document.body)
	{
		theLeft = document.body.scrollLeft;
		theTop = document.body.scrollTop;
	}
	theLeft += x;
	theTop += y;
	obj.style.left = theLeft + 'px' ;
	obj.style.top = theTop + 'px' ;
	setTimeout("placeIt('layer1')",500);
}