/* -------------------------------------------------------------------------------------
	FILE:		Common.js
	PURPOSE:	Client side routines common to the Job Shop Control Project

	Copyright 2008 (c) FlowTech Solutions, Inc.		(www.FlowTech-Solutions.com)

	Permission is hereby granted, free of charge, to any person obtaining
	a copy of this software and associated documentation files (the
	"Software"), to deal in the Software without restriction, including
	without limitation the rights to use, copy, modify, merge, publish,
	distribute, sublicense, and/or sell copies of the Software, and to
	permit persons to whom the Software is furnished to do so, subject to
	the following conditions:

	The above copyright notice and this permission notice shall be
	included in all copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
	LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
	OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
	WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-------------------------------------------------------------------------------------- */

//
// -----		DISPLAY FUNCTIONS
//

	// DISPLAY AJAX TEXT/HTML RESULTS IN A POPUP WINDOW (generally for table results, user selection)
	function DisplayInformationInPopup(transport,optns,results)
	{
		optns = optns || {render:{}};

		if (optns.convertHTML)
		{
			$(document).observe("Popup:Show",function(){
				var	popupelm = $('Popup')
						rows = popupelm.select('table.SQLTABLE tbody > tr > td');
				rows.each(function(e){
					if (e.innerHTML.indexOf('RENDERHTML')>=0)
						e.innerHTML = HtmlToChar(e.innerHTML);
				});
			});
		}

		Popup.show({className:			optns.render.className||"PopupInfo",
							type:					"MESSAGE",
							title:						optns.render.title||'',
							showButtons:		optns.render.buttons||'OK|Ok',
							top:						optns.render.top||"center",
							left:						optns.render.left||"center",
							width:					optns.render.width||"250px",
							height:					optns.render.height,
							draggable:				true,
							scrollable:				true,
							modal:					optns.render.modal||false,
							autoClose:			false,
							message:				results || 'No information to display.'
							});
	}


	// DISPLAY AJAX RESULTS IN AN OVERLAY (generally for form entry pages)
	function DisplayInformationInOverlay(transport,optns,results)
	{
		optns = optns || {render:{}};
		Overlay.pop('Maintenance', {
							className:		"overlay",									// default window style/skin	 (overlay=>modal overlay, help=>modeless overlay)
							top:					optns.render.top||"center",		// absolute position of the top edge (px units assumed)
							left:					optns.render.left||"center",		// absolute position of the left edge (px units assumed)
							width:				optns.render.width||"auto",		// default window width (px units assumed)
							height:				optns.render.height||"auto",		// default window height (px units assumed)
							resizable:			optns.render.resizable||true,		// allows user to resize the window (uses chrome support)
							draggable:		optns.render.draggable||true,	// enable titlebar window dragging (uses chrome support)
							modal:				optns.render.modal||true,			// makes window modal or modeless
							scrollable:			optns.scrollable||"auto",			// vertical, horizontal, auto
							url:					optns.render.url||null,				// url to populate the overlay from
							html:				results,										// HTML to populate into the overlay (done before url)
							title:					optns.render.title||'',					// Accessability attribute for the iframe and title of the overlay
							busy:				{message:"Loading information ...", delayFog:0, delaySpinner:150},
							returnFieldFocus : optns.render.returnFieldFocus||null,	// form field to receive focus when the overlay is closed
							extendedProperty:	{optns:optns}
							});
		return false;
	}


	// DISPLAY AJAX RESULTS IN A SEPARATE BROWSER WINDOW (generally for reports)
	//	Make sure  C:\Program Files\Mozilla Firefox\defaults\pref\all.js exists
	function DisplayInformationInWindow(transport,optns,results)
	{
		optns = optns || {render:{}};
		var params =	{	left:				optns.render.left||100,
									top:				optns.render.top||100,
									height:			optns.render.height||600,
									width:			optns.render.width||700,
									status:			optns.render.status||'no',
									resizable:		optns.render.resizable||'yes',
									titlebar:			optns.render.titlebar||'no',
									menubar:		optns.render.menubar||'no',
									toolbar:		optns.render.toolbar||'no',
									location:		optns.render.location||'no',
									scrollbars:		optns.render.scrollbars||'no',
									channelmode:optns.render.channelmode||'no',
									directories:	optns.render.directories||'no',
									fullscreen:		optns.render.fullscreen||'no'
								};
		params = Object.extend(params, optns.render||{});
		var winParms = Object.toQueryString(params).replace(/&/g,',');
		var newwindow = window.open('about:blank','_blank',winParms);
		newwindow.document.write( results );
		newwindow.document.close();
		newwindow.focus();
		return newwindow;
	}


	// IDENTIFIES THE TABLE ROW SELECTED IN THE GRID WINDOW
	function getSelectedRow(uiAction, keyvalue)
	{
		// Make sure the user selected an grid item
		var tr = (!keyvalue || keyvalue=='') ? $$('.GridItemSelectStyle') : $$('tr[keyvalue="'+keyvalue+'"]');
		if (tr.length != 1)
		{
			if (uiAction != 'IGNORE')
				alert( uiAction || 'You must select a item first.' );
			return null;
		}

		// Assemble an object, properties are fieldname (gridFields order must match grid content)
		var lovArray = eval('['+gridFields.replace(/\+/g,' ').replace(/\|/g,',').replace(/\}\{/g,'},{')+']');
		var field, value, obj = {};
		tr = tr[0];
		obj.keyname = tr.readAttribute('keyname');
		obj.keyvalue = tr.readAttribute('keyvalue');
		for (var c=1; c<tr.cells.length; c++)
		{
			if (lovArray.length >= c && lovArray[c-1].Code)
			{
				obj[lovArray[c-1].Code] =  tr.cells[c].innerHTML.stripScripts().stripTags();;
			}
		}
		return( obj );
	}


	// IDENTIFIES AND RETRIEVES THE SELECTED ROW IN THE POPUP TABLE
	//		Popup table generally produced via Ajax transaction using common transactions
	function getSelectedRowData(nomsg)
	{
		var row = $$('table.SQLTABLE tbody > tr.SQLTABLERowSelect');
		if (!row || row.length==0)
		{
			//alert("Unable to identify the selected row.");
			if (!nomsg)	PopMessage('Error','Unable to identify the selected row.');
			return(null);
		}
		row = row[0];

		// Collect all field info of the selected row
		var rowCell, fieldName, fieldValue;
		var SelectedData = {};
		for (var i=0; i<row.cells.length; i++)
		{
			rowCell = $(row.cells[i]);
			var fieldName = rowCell.readAttribute('name').toLowerCase();
			var fieldValue = rowCell.innerHTML.stripScripts().stripTags();
			SelectedData[fieldName] = HtmlToChar(fieldValue);
		}
		return(SelectedData);
	}


	// Adds Green/Gray bar background row coloring and enables a single row selection
	function AddSelectionBehavior(evnt)
	{
		// -> all even rows within all table bodies
		$$('table.SQLTABLE tbody > tr:nth-child(even)').invoke('addClassName','SQLTABLEGreenBar');
		// -> all odd rows within all table bodies
		$$('table.SQLTABLE tbody > tr:nth-child(odd)').invoke('addClassName','SQLTABLEGrayBar');

		// Make all rows within the popup selectable
		var rows = $$('table.SQLTABLE tbody > tr');
		rows.each(function(e){
			var elm = e;
			e.observe('click',function(evnt){
				$$('table.SQLTABLE tbody > tr').invoke('removeClassName','SQLTABLERowSelect');
				elm.addClassName('SQLTABLERowSelect');
				});
			});
	}


	// Auto-Select for single record results from a search (selectable) Checks for a single result, select it and auto click OK button
	//				Event.observe(document,"Popup:Show",function(PopupContext){SingleSelectBehavior('OK','0',PopupContext);});
	function SingleSelectBehavior(TriggerButton, ResultTableIndex, PopupContext)
	{
		try
		{
			var	PopupElm = PopupContext.memo.popupElement,
					TriggerButtonID = (!TriggerButtonID || TriggerButtonID=='') ? 'Popup_OK' : 'Popup_'+TriggerButton,
					ResultTableID = (!ResultTableID || ResultTableID=='') ? 'tbl_0' : 'tbl_'+ResultTableIndex,
					TriggerButtonElm  = $(PopupElm.select('#'+TriggerButtonID)[0]),
					ResultTable = PopupElm.select('table.SQLTABLE[id="'+ResultTableID+'"]')[0],
					nrows = ResultTable.tBodies[0].rows.length,
					row = ResultTable.tBodies[0].rows[0];
			if (nrows != 1) return;
			row.addClassName('SQLTABLERowSelect');

			function FireTheButtonClick()
			{
				Event.fire(document,"Popup:"+TriggerButton,{
					options:clone(PopupContext.memo.options),
					eventName:"Popup:"+TriggerButton,
					newFilter:'',
					newSort:'',
					newDropdown:''
					});
				window.setTimeout(Popup.hide,10);
			}
			window.setTimeout(FireTheButtonClick,10);
		}
		catch (e) { }
		return(true);
	}


	// Check Ajax results
	function IsResultsOK(results,ignore)
	{
		ignore = ignore || false;
		if ( !results || results == '' || results == '<HTML></HTML>' || (results.substr(0,'<HTML>'.length) == '<HTML>' && results.indexOf('SQLTABLE')<0))
		{	// High probability we have an error return of some sort.
			var msgcontents = results ||'';
			if (results && results.length>13 && results.substr(0,6) == '<HTML>')
				msgcontents = results.substring(6,results.length-7);
			if (!ignore)	 {msgcontents=(msgcontents=='')?'No Results':msgcontents; alert(msgcontents);}
			return(false);
		}
		return(true);
	}


	// OPEN A SEPARATE BROWSER WINDOW
	//		http://www.w3schools.com/jsref/met_win_open.asp
	function OpenWindow(url, optns)
	{
		var params =	{	left:				100,
									top:				100,
									height:			600,
									width:			700,
									status:			'no',
									resizable:		'yes',
									scrollbars:		'yes',
									titlebar:			'no',
									menubar:		'no',
									toolbar:		'no',
									location:		'no',
									channelmode:'no',
									directories:	'no',
									fullscreen:		'no'
								};
		params = Object.extend(params, optns||{});
		var winParms = Object.toQueryString(params).replace(/&/g,',');
		var newwindow = window.open(url||'about:blank', '_blank', winParms, true);
		newwindow.focus();
		return newwindow;
	}


	// Produces HTML Table strings from Datasets
	function RenderHtmlTable(datasets, tableclass)
	{
		tableclass = tableclass || 'SQLTABLE';
		datasets = !Object.isArray(datasets) ? [datasets] : datasets;

		var	dataset,d, c,cl,column,columns, r,rl,row,rows, tables=[],table,thead,tbody,tr,tfoot, cellvalue, isAry;

		for (d=0; d<datasets.length; d++)
		{
			dataset = datasets[d];
			columns = dataset.columns;
			rows = dataset.rows;
			thead = '';
			tbody = '';
			tfoot = '';

			for (c=0,cl=columns.length; c<cl; c++)
			{
				column = columns[c];
				column.propertyname = column.name;
				//column.propertyname = column.propertyname.replace(/ /g, '').Replace(/:/g, '').Replace(/\$/, '').Replace(/\-/, '');
				column.propertyname = column.property || column.propertyname.normalize();
				thead += '<th class="'+column.datatype+'" id="'+column.name+'" name="'+column.name+'" datatype="'+column.datatype+'" ordinal="'+column.ordinal+'" property="'+column.propertyname+'">'+ column.name + '</th>';
				tfoot += '<td class="'+column.datatype+'" id="'+column.name+'_foot" name="'+column.name+'_foot" datatype="'+column.datatype+'" ordinal="'+column.ordinal+'" property="'+column.propertyname+'"><!--dnc--></th>';
			}
			thead = '<thead><tr>' + thead + '</tr></thead>';
			tfoot = '<tfoot><tr>' + tfoot + '</tr></tfoot>';

			for (r=0,rl=rows.length; r<rl; r++)
			{
				row = rows[r];
				isAry = Object.isArray(row);
				tr='';
				for (c=0,cl=columns.length; c<cl; c++)
				{
					column = columns[c];
					cellvalue = isAry ? row[c] : row[column.propertyname];
					tr += '<td class="'+column.datatype+'" id="'+column.name+r+'" name="'+column.name+'" ordinal="'+column.ordinal+'">'+ cellvalue + '</td>';
				}
				tr = '<tr id="rw_'+r+'">' + tr + '</tr>';
				tbody += tr;
			}
			tbody = '<tbody>' + tbody + '</tbody>';

			table = '<table id="tbl_'+d+'" class="'+tableclass+'">' + thead + tbody + tfoot + '</table>';
			tables.push(table);
		}
		return(tables);
	}


	// TOOLBAR:	 SCREENPRINT
	function ScreenPrint()
	{
		window.print();
		return(false);
	}



//
// -----		MESSAGE POPPER and COMMON USER CONFIRMATION MESSAGES
//

	// Display common popup messages (Error, Information, Help, Confirm, ConfirmDelete, ConfirmCancel)
	function PopMessage(msgType, message, fnctn, eventargs, optns)
	{
		msgType = msgType || '';
		message = message ||'';
		eventargs = eventargs ||'';
		optns = optns || {};
		Object.extend(optns, {className:"PopupInfo"});

		function PopupButtonListener(evnt)
		{
			$(document).stopObserving('Popup:OK',PopupButtonListener);
			$(document).stopObserving('Popup:YES',PopupButtonListener);
			$(document).stopObserving('Popup:CANCEL',PopupButtonListener);
			$(document).stopObserving('Popup:NO',PopupButtonListener);
			//alert('Received event - '+'\n'+WebService.decode(Object.toQueryString(evnt.memo)).replace(/&/g,'\n') );
			evnt.eventName = (evnt && evnt.memo) ? evnt.memo.eventName||'' : '';
			evnt.args = eventargs;
			var booleanValue = (evnt.eventName=='Popup:OK' || evnt.eventName=='Popup:YES') ? true : false;
			//var fnctn = evnt.memo.options.extendedProperties.fnctn;
			if ( typeof(fnctn) == 'function' )
			{
				try{
					booleanValue = fnctn(evnt);
					}
				catch(e) {alert('eval failure'); Overlay.dump(e);}
			}
			return( booleanValue );
		}

		// Initiate the popup message
		var title, msg, buttons;
		switch (msgType)
		{
			case 'Warning':
			case 'Error':
				title = msgType + ' Message';
				msg = '<span style="font-color: #CC0033">'+message+'</span>';
				buttons = (optns && optns.showButtons) ? optns.showButtons :'OK|Ok';
				Object.extend(optns, {className:"PopupWarn"});
				break;
			case 'Information':
				title = 'Informational Message';
				msg = message ||'';
				buttons = (optns && optns.showButtons) ? optns.showButtons :'OK|Ok';
				Object.extend(optns, {className:"PopupInfo"});
				break;
			case 'Help':
				title = 'Online Help';
				msg = message ||'';
				Object.extend(optns, {width:'550px', height:'500px'});
				buttons = (optns && optns.showButtons) ? optns.showButtons :'OK|Close';
				Object.extend(optns, {className:"Popup"});
				break;
			case 'Confirm':
				title = 'Confirmation Required';
				msg = message ||'OK to proceed?';
				buttons = (optns && optns.showButtons) ? optns.showButtons :'YES|Yes,NO|No';
				Object.extend(optns, {className:"PopupInfo"});
				break;
			case 'ConfirmDelete':
				title = 'Delete Confirmation Required';
				msg = message ||'You are about to Delete this entry, click Confirm to proceed with delete.';
				buttons = (optns && optns.showButtons) ? optns.showButtons :'YES|Confirm,NO|Cancel';
				Object.extend(optns, {className:"PopupWarn"});
				break;
			case 'ConfirmCancel':
				title = 'Cancel Confirmation';
				msg = message ||'You are about to Cancel this process, you may loose any changes you have made. Click No to return and save changes.';
				buttons = (optns && optns.showButtons) ? optns.showButtons :'YES|Yes,NO|No';
				Object.extend(optns, {className:"PopupWarn"});
				break;
			case 'Flash':
				title = 'Information';
				msg = message ||'';
				buttons = '';
				Object.extend(optns, {className:"PopupInfo"});
				break;
			default:
				return(false);
		}

		msg = '<p style="font-family: tahoma, verdana, arial; font-size:10pt; font-weight:bold; color:black; text-align:center; padding:1px 4px 6px 4px;">' + msg + '</p>';
		$(document).stopObserving('Popup:OK');
		$(document).stopObserving('Popup:YES');
		$(document).stopObserving('Popup:CANCEL');
		$(document).stopObserving('Popup:NO');
		$(document).observe('Popup:OK',PopupButtonListener);
		$(document).observe('Popup:YES',PopupButtonListener);
		$(document).observe('Popup:CANCEL',PopupButtonListener);
		$(document).observe('Popup:NO',PopupButtonListener);
		Popup.show({className:			optns.className,
							type:					"MESSAGE",
							title:						title||'',
							showButtons:		buttons||"OK|Ok",
							draggable:				true,
							top:						optns.top||"center",
							left:						optns.left||"center",
							width:					optns.width||"350px",
							height:					optns.height||"auto",
							scrollable:				true,
							modal:					true,
							autoClose:			false,
							window:				(msgType == 'Help' ? window.top : window.self),
							message:				msg||'',
							extendedProperties: {msgType:msgType, message:message, fnctn:fnctn}
							});
		return(false);
	}

	function ConfirmDelete(controlId)
	{
		var selectedRow = $$('tr[class="GridItemSelectStyle"]');
		if (!selectedRow || selectedRow.length<=0)
		{
			PopMessage('Information','You must select an entry to delete first, then click Delete.');
			return(false);
		}
		selectedRow = selectedRow[0];
		var Id = selectedRow.cells[1].innerHTML ||'';

		function PostDelete(evnt)
		{
			if (evnt && evnt.eventName == 'Popup:YES' && __doPostBack && controlId && controlId!='')
				__doPostBack(controlId,'');
		}

		var message = 'You are about to Delete this entry.' + '<br/>Click the <i>Confirm</i> button to proceed with delete.' ;
		PopMessage('ConfirmDelete', message, PostDelete, controlId);
		return(false);
	}

	function ConfirmDeleteAll(controlId)
	{
		function PostDelete(evnt)
		{
			if (evnt && evnt.eventName == 'Popup:YES' && __doPostBack && controlId && controlId!='')
				__doPostBack(controlId,'');
		}

		var message = 'You are about to Delete <b>ALL</b> entries.' + '<br/>Click the <i>Confirm</i> button to proceed with deleting ALL entries.' ;
		PopMessage('ConfirmDelete', message, PostDelete, controlId);
		return(false);
	}

	function GetConfirm(msg)
	{
		return ( confirm(msg||("Press OK to proceed.")) );
	}

	// Javascript Prompt popup, must type YES
	function GetDeleteConfirm()
	{
		var cnfrm=prompt("Please enter YES to confirm DELETE. ","NO");
		var tf = cnfrm.toUpperCase();
		return ( (tf == 'YES') ? true:false );
	}

	//$(document).observe('Overlay:destroyed',RefreshPage);
	function RefreshPage(evnt,ID)
	{
		var keyid = $("KEY_ID");
		if (keyid) keyid.value = ID|'';
		$(document).stopObserving("Overlay:destroyed",RefreshPage);
		if (typeof(__doPostBack) == 'function' && $('PAGE_ICON') )
			__doPostBack('PAGE_ICON', '');
		else
		{
			if (window.RURL && window.RURL!='')
				location.href = window.RURL;
			else
				location.href=URLCommand('REFRESH','');
		}
	}

	// Used to display any system/server messages e.g. Record Has Been Saved
	function PopSystemMessage(ServerMessage)
	{
		function CloseOverlay(evnt)
		{
			if (evnt && evnt.eventName == 'Popup:OK' && Overlay && Overlay.isAChildOverlay())
			{
				$(document).observe("Overlay:destroyed",function(evnt){setTimeout(RefreshPage,100);});
				Overlay.destroy();
			}
			return(true);
		}
		PopMessage('Information', ServerMessage, CloseOverlay);
	}


	// Used to display context specific helpany system/server messages e.g. Record Has Been Saved
	function PopHelp(requestUrl)
	{
		var	optns = {render:{scrollbars:'yes', width:760, height:600, top:40}},
				parsedUrl = parseUri (location.href),
				url = parsedUrl.protocol + "://" + parsedUrl.host + (parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
						(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +		requestUrl;
		optns.render.left = window.screen.availWidth - (optns.render.width+40);

		// Allow only a single help window
		if (window.top.HelpWindow && !window.top.HelpWindow.closed) window.top.HelpWindow.close();
		window.top.HelpWindow = null;

		// Dynamic retreival of the help page
		var req = new Ajax.Request(url,
				{	method: 'get',
					parameters: '',
					onSuccess: function(transport){window.top.HelpWindow=DisplayInformationInWindow(transport,optns,transport.responseText);},
					onFailure: function(transport){window.top.HelpWindow=DisplayInformationInWindow(transport,optns,transport.responseText);},
					onException: function(transport){window.top.HelpWindow=DisplayInformationInWindow(transport,optns,transport.responseText);}
					}  );

		return(false);
	}


//
// -----		CALENDAR DATE FUNCTIONS
//

	// Establish Date related behaviors
	//$(document).observe("Calendar:Selected",populateDate);
	//$(document).observe("Calendar:Clear",clearDate);
	//$$('input[validate="mmddyyyy"]').each(function(elm){ReformatDate(elm);});

	// Pop the calendar control
	function PopCalendar(DateFieldID, left, top, selectableDates)
	{
		var	DateField = $(DateFieldID),
				offsets = DateField.cumulativeOffset();
		top = top || offsets[1];
		left = left ||offsets[0]+100;
		if ( (left+210) >  document.viewport.getWidth()) {top=null; left=null;}
		selectableDates = selectableDates ||	"+*,-<01/01/2008,->01/01/2020";
		Calendar.show({
							top:						top||"center",		// absolute position of the top edge of the calendar
							left:						left||"center",		// absolute position of the left edge of the calendar
							className:				"Calendar",				// specifies a skin for the control
							selectableDates:		selectableDates,
							/*selectableDates:	"+*,-<01/01/2008,->12/31/2008,-08/04/2008,-08/06/2008,+01/01/2009",*/
							selectedDate:			DateField.value,
							extendedProperty:		{targetElementID:DateFieldID, targetElementValue:DateField.value}
							});
	}

	// Listener routine for "Calendar:Selected" custom event
	function populateDate(evnt)
	{
		//alert('evnt.memo.selectedDate='+evnt.memo.selectedDate.format('MM/dd/yyyy'));
		var targetElement = $(evnt.memo.extendedProperty.targetElementID);
		targetElement.value = evnt.memo.selectedDate.format('MM/dd/yyyy');
		targetElement.focus();
	}

	// Listener routine for "Calendar:Clear" custom event
	function clearDate(evnt)
	{
		var targetElement = $(evnt.memo.extendedProperty.targetElementID);
		targetElement.value = '';
		targetElement.focus();
	}

	// Basic date validation based on specified format (default to MM/dd/yyyy)
	function ReformatDate(elmid,fmt)
	{
		var element = $(elmid);
		if (!element || element.value=='') return true;
		var elementValue = element.value.trim();
		if (elementValue.indexOf(' ')>=0) elementValue = elementValue.substr(0,elementValue.indexOf(' '));
		fmt = ((fmt+'')=='') ? null : fmt;
		if ( Date.isValid(elementValue,fmt) )
			{
			var dt = Date.parseString(elementValue,fmt);
			element.value = dt.format( (!fmt ? "MM/dd/yyyy":fmt) );
			return true;
			}
		alert("Invalid date,  please use "+(fmt ? fmt:"MM/DD/YYYY")+" format.");
		element.focus();
		return false;
	}

	// Basic date validation based on specified format (default to hh:mm:ss)
	function ReformatTime(elmid,fmt)
	{
		var element = $(elmid);
		if (!element || element.value=='') return true;
		var elementValue = element.value.trim();
		fmt = ((fmt+'')=='') ? null : fmt;
		if ( Date.isValid(elementValue, fmt||['HH:mm:ss','HH:mm'] ) )
			{
			var dt = Date.parseString(elementValue, fmt||['HH:mm:ss','HH:mm'] );
			element.value = dt.format( (!fmt ? "HH:mm:ss":fmt) );
			return true;
			}
		alert("Invalid time,  please use "+(fmt ? fmt:"HH:mm:ss")+" format.");
		element.focus();
		return false;
	}

	// JScript to populate a dropdown control dynamically. (adds to options list)
	function PopulateDropDown(FieldID,ValueTextDelimitedString)
	{
		var Field = $(FieldID);
		if (!Field || !Field.options || !ValueTextDelimitedString || ValueTextDelimitedString=='') return;
		var ValueTextPairs = ValueTextDelimitedString.split('|');
		for (var i=0; i<ValueTextPairs.length; i++)	{
			var ValueText = ValueTextPairs[i].split('^');
			Field.options[Field.options.length] = new Option(ValueText[1], ValueText[0], false, false);
			}
	}

	// Accepts a properties object and converts to html attributes string
	function Obj2HTML(obj)
	{
		var str ='', type;
		if ( !obj )	return(str);
		for(k in obj)
		{
			type = typeof(obj[k]);
			if ( type == 'string' || type == 'number' || type == 'boolean')
				str += k +'="'+ obj[k] + '" ';
		}
		return(str);
	}


//
// -----		FIELD ROUTINES
//

	// HTML TO Character conversion
	function HtmlToChar(strng)
	{
		if ( !strng || strng=='' || !strng.toString ) return('');
		var Chr = strng.toString();
		return Chr.split("&lt;").join("<").split("&gt;").join(">").split("&quot;").join('"').split("&apos;").join("'").split("&amp;").join("&").split("&nbsp;").join(" ");
	}

	// HTML TO Character conversion
	function CharToHtml(strng)
	{
		if ( !strng || strng=='' || !strng.toString ) return('');
		return(strng.escapeHTML());
		var Html = strng.toString();
		return Html.split("<").join("&lt;").split(">").join("&gt;").split('"').join('&quot;').split("'").join("&apos;").split("&").join("&amp;").split(" ").join("&nbsp;");
	}


	// If javascript version prior to 1.1
	if (location.replace == null)
		location.replace = location.assign;


//
// -----		URL FUNCTIONS	(URLCommand)
//

	// Assembles and submits a command to the current page
	function NAV(CommandName,CommandArgument, qsID, qsFKID)
	{
		var parsedUrl = parseUri (location.href);
		var qsObj = (parsedUrl.query||'').toQueryParams();

		if (qsObj.module) delete qsObj.module;
		if (qsObj.Module) delete qsObj.Module;
		if (qsObj.MODULE) delete qsObj.MODULE;

		qsObj["Module"] = window.Module;
		qsObj["CN"] = CommandName;
		qsObj["CA"] = CommandArgument;
		qsObj["ID"] = qsID;
		qsObj["PARENTID"] = qsID;
		qsObj["FKID"] = qsFKID;

		var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			parsedUrl.file +
			('?' + Object.toQueryString(qsObj)) +
			(parsedUrl.anchor && parsedUrl.anchor !='' ? '#' + parsedUrl.anchor : '');

		location.href=updatedUrl;
	}

	// Injects COMMANDNAME and COMMANDARGUMENT name/value pairs into the url querystring
	function URLCommand(CommandName,CommandArgument,ExistingURL)
	{
		ExistingURL=StuffQuery("CN",CommandName,ExistingURL);
		return StuffQuery("CA",CommandArgument,ExistingURL);
	}

	// injects a name=value pair into the query string
	function StuffQuery(Param, Value, ExistingURL)
	{
		if (ExistingURL == '')	return('');
		var	url = (ExistingURL ? ExistingURL : location.href),
				parsedUrl = parseUri (url),
				qsObj = (parsedUrl.query||'').toQueryParams();
		qsObj[Param] = Value;		// should replace any existing parameter by the same name
		var	qsStr = Object.toQueryString(qsObj);

		var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			parsedUrl.file +
			('?' + qsStr) +
			(parsedUrl.anchor && parsedUrl.anchor !='' ? '#' + parsedUrl.anchor : '');
		return updatedUrl;
	}


	// Specific routine to assemble the URL for the Maintenance Overlay page
	function AssembleMaintURL(Page, Module, ID)
	{
		Page = Page || 'FormTemplatePage';

		var ExistingURL = location.href;

		// Parse the query string into an object with properties (hash)
		var ParamToDelete, ParamsToDelete = "MODULE,Module,module,CN,CA,ACTION,Action,Action".split(",");
		var parsedUrl = parseUri (ExistingURL);
		var qsObj = (parsedUrl.query||'').toQueryParams();

		// Remove unwanted querystring fields
		while ( (ParamToDelete=ParamsToDelete.shift()) )
		{
			if ( 'undefined' != typeof(qsObj[ParamToDelete]) )
			{
				eval("delete qsObj."+ParamToDelete);
			}
		}

		// Reassemble the query string from the query object
		qsObj = Object.extend(qsObj, {Module:Module, ID:ID, ACTION:'EDIT'});
		var qsStr = Object.toQueryString(qsObj);

		// Assemble the URL for the Maintenance Overlay
		var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			(Page + '.aspx') +
			('?' + qsStr) +
			(parsedUrl.anchor && parsedUrl.anchor !='' ? '#' + parsedUrl.anchor : '');
		return(updatedUrl);
	}

	// Specific routine to assemble the URL for the Maintenance Overlay page
	//		'|URL:GridTemplatePage.aspx?Module=JOBPURCHASEMATERIALSUMMARY&ACTION=[VS:ACTION]&ID=[QS:ID]&FKID=[QS:ID]'	-- Accepts relative URL only
	//	e.g. http://jcstest.smfspecialty.com/GridTemplatePage.aspx?ACTION=EDIT&Module=PURCHASEORDERDETAILSUMMARY&ID=19360&PARENTID=19360&FKID=19360
	function AssembleSummaryURL(Module, ID)
	{
		var	Page = 'GridTemplatePage',
				ExistingURL = location.href,
				parsedUrl = parseUri (ExistingURL);

		// Assemble the URL for the Maintenance Overlay
		var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			(Page + '.aspx') +
			('?&Module='+Module+'&ID='+ID+'&FKID='+ID+'&PARENTID='+ID) +
			(parsedUrl.anchor && parsedUrl.anchor !='' ? '#' + parsedUrl.anchor : '');
		return(updatedUrl);
	}


	// Removes querystring names format: ClearQuery(ExistingURL,sq_name1,sq_name2,...)
	//		If no sq_name provide, all are removed.
	function ClearQueryParams(ExistingURL)
	{
		var	url = (ExistingURL ? ExistingURL : location.href),
				parsedUrl = parseUri (location.href),
				qsObj = (parsedUrl.query||'').toQueryParams(),
				ParamToDelete, ParamsToDelete = $A(arguments);
		ParamsToDelete.shift();

		if (ParamsToDelete.length == 0 || !parsedUrl.query || parsedUrl.query == '')
		{
			var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
				(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
				(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
				parsedUrl.file +
				(parsedUrl.anchor && parsedUrl.anchor!='') ? '#' + parsedUrl.anchor : '';
			return updatedUrl;
		}

		while ( (ParamToDelete=ParamsToDelete.shift()) )
		{
			if ( 'undefined' != typeof(qsObj[ParamToDelete]) )
			{
				eval("delete qsObj."+ParamToDelete);
			}
		}

		var updatedUrl = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			parsedUrl.file +
			('?' + Object.toQueryString(qsObj)) +
			(parsedUrl.anchor && parsedUrl.anchor !='' ? '#' + parsedUrl.anchor : '');

		return updatedUrl;
	}

	//	parseUri 1.2.1		(c) 2007 Steven Levithan <stevenlevithan.com>		MIT License
	/* Sample usage			DOES NOT PARSE AN @ SIGN IN THE QUERY STRING CORRECTLY
		// Assemble URL to navigate to (start with current URL, retain params, stuff Job_ID and pagename in)
		var parsedUrl = parseUri(location.href);
		var queryParms = (parsedUrl.query||'').toQueryParams();
		queryParms = Object.extend(queryParms, {Module:'JOBMAINT', ID:Job_ID});
		var url = parsedUrl.protocol + "://" + parsedUrl.host +
			(parsedUrl.port && parsedUrl.port!='' ? ':'+parsedUrl.port : '') +
			(parsedUrl.directory && parsedUrl.directory!='' ? parsedUrl.directory:'/') +
			'FormTemplatePage.aspx' +
			'?' + Object.toQueryString(queryParms);
	*/
	function parseUri(str)
	{
		var o = parseUri.options,
			m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
			uri = {},
			i = 14;

		while (i--) uri[o.key[i]] = m[i] || "";

		uri[o.q.name] = {};
		uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
			if ($1) uri[o.q.name][$1] = $2;
		});

		return uri;
	};

	parseUri.options =
	{
		strictMode: true,
		key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
		q:   {
			name:   "queryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
		},
		parser: {
			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
			loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
		}
	};


//
//	-----		LOAD  JAVASCRIPTand STYLESHEET  FILES
//

	//	loadJs('/path/to/scripts.js', function(script) { myFunction();  });
    function loadJs(path, onload)
    {
        var script = new Element('script', {
            src  : path,
            type : 'text/javascript'
        });

        if (onload) {
            if (Prototype.Browser.IE) {
                Event.observe(script, 'readystatechange', function(e) {
                    if (this.readyState == 'loading')
                        return;

                    onload();
                }.bind(script));
            }
            else
                Event.observe(script, 'load', onload.bind(script));
        }

        $$('head')[0].insert(script);
    }

	//	Loads a style sheet on demand
	function loadStyleFile(StyleSheetName)
	{
		var	headID = document.getElementsByTagName("head")[0],
				cssNode = document.createElement('link');
		cssNode.type = 'text/css';
		cssNode.rel = 'stylesheet';
		cssNode.href = StyleSheetName;
		cssNode.media = 'screen';
		headID.appendChild(cssNode);
	}


//
//	-----		CLONE
//
	function clone(obj)
	{
		var	seenObjects = [],
				mappingArray = [],
				recursionlevel = 0;
		function recurseclone(obj)
		{
			recursionlevel++;
			if (recursionlevel > 15)
			{
				window.status = 'recursion level:'+recursionlevel;
				recursionlevel--;
				return(obj);
			}
			if (typeof(obj) != 'object' || obj == null) {recursionlevel--; return(obj);}
			try
			{

				var indxOf = seenObjects.indexOf(obj);
				if (indxOf == -1)
				{	// START New object to clone
					var c = obj instanceof Array ? [] : {};
					for (var i in obj)
					{
						var prop = obj[i];
						if (typeof(prop) == 'object')
						{
							if (prop instanceof Array)
							{
								c[i] = [];
								for (var j=0, jl=prop.length; j < jl; j++)
								{
									if (typeof prop[j] != 'object')
										{
											c[i].push(prop[j]);
											seenObjects.push(prop[j]);
											mappingArray.push(prop[j]);
										}
										else
										{
											var cpy = recurseclone(prop[j]);
											c[i].push(cpy);
											seenObjects.push(prop[j]);
											mappingArray.push(cpy);
										}
								}
							}
							else
							{
								c[i] = recurseclone(prop);
								seenObjects.push(prop);
								mappingArray.push(c[i]);
							}
						}
						else
						{	// most likely a string, boolean, number, function, object
							if (typeof(prop) != 'undefined')
							{
								c[i] = prop;
								//seenObjects.push(prop);
								//mappingArray.push(c[i]);
							}
						}
					}

					recursionlevel--;
					return(c);
				}	// END New object to clone
				else
				{	// Already cloned item (through circular pointers)
					recursionlevel--;
					return mappingArray[indxOf];
				}
			}
			catch (e)
			{
				//alert(e.message);
			}
		}
		return( recurseclone(obj) );
	}
	/*	 previous version of the method, remove if no problems found with modified method
		function clone(obj)
		{
			var	seenObjects = [],
					mappingArray = [];
			function _clone(obj)
			{
				if (typeof(obj) != 'object' || obj == null) return(obj);
				var indxOf = seenObjects.indexOf(obj);
				if (indxOf == -1)
				{	// START New object to clone
					var c = obj instanceof Array ? [] : {};
					for (var i in obj)
					{
						var prop = obj[i];
						if (typeof prop == 'object')
						{
							if (prop instanceof Array)
							{
								c[i] = [];

								for (var j = 0; j < prop.length; j++)
								{
									if (typeof prop[j] != 'object')
										{
											seenObjects.push(prop[j]);
											mappingArray.push(prop[j]);
											c[i].push(prop[j]);
										}
										else
										{
											c[i].push(_clone(prop[j]));
										}
								}
							}
							else
							{
								c[i] = _clone(prop);
								seenObjects.push(c[i]);
								mappingArray.push(c[i]);
							}
						}
						else
						{
							c[i] = prop;
							seenObjects.push(c[i]);
							mappingArray.push(c[i]);
						}
					}

					return(c);
				}	// END New object to clone
				else
				{	// Already cloned item (through circular pointers)
					return mappingArray[indxOf];
				}
			}

			return( _clone(obj) );
		}
	*/


//
//	-----		OPACITY
//

	// Sets the opacity / transparency of an element to a specified opacity.
	// Supports IE, Gecko (Firefox, Netscape), WebKit (Safari, Chrome)
	// argDivName: Either the name of the Element or the Object itself
	// argOpacity: Opacity to set (0 to 100)
	function setOpacity(ElmName, argOpacity)
	{
		// Updated to support all browsers including Safari / Chrome
		var value = parseInt(argOpacity) / 100;
		var elm = $(ElmName);
		if (elm)
		{
			if (Prototype.Browser.IE)
			{
				elm.filters.alpha.opacity = (value*100);
				return;  // Stop at special case for IE to improve performance
			}
			elm.style.opacity = value;
			elm.style.MozOpacity = value;
			elm.style.KhtmlOpacity = value;
		}
	}

	// Determine the page dimensions
	function getPageSize(documentbody)
		{
			documentbody = documentbody || document.body;
			var windowWidth, windowHeight, pageHeight, pageWidth;
			if ( documentbody  != document.body )
			{
				windowWidth = $(documentbody).getWidth();
				windowHeight = $(documentbody).getHeight();
				pageWidth = documentbody.scrollWidth;
				pageHeight = documentbody.scrollHeight;
			}
			else
			{
				var xScroll, yScroll, dde = document.documentElement;
				if (window.innerHeight && window.scrollMaxY)
				{
					xScroll = document.body.scrollWidth;
					yScroll = window.innerHeight + window.scrollMaxY;
				}
				else if (document.body.scrollHeight > document.body.offsetHeight)
				{ // all but Explorer Mac
					xScroll = document.body.scrollWidth;
					yScroll = document.body.scrollHeight;
				}
				else
				{ // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
					xScroll = document.body.offsetWidth;
					yScroll = document.body.offsetHeight;
				}

				// If the ScrollHeight from the document element is taller, use that
				if (dde && dde.scrollHeight > yScroll)
					yScroll = dde.scrollHeight;

				if (self.innerHeight)
				{  // all except Explorer
					windowWidth = self.innerWidth;
					windowHeight = self.innerHeight;
				}
				else if (dde && dde.clientHeight)
				{ // Explorer 6 Strict Mode
					windowWidth = dde.clientWidth;
					windowHeight = dde.clientHeight;
				}
				else if (document.body)
				{ // other Explorers
					windowWidth = document.body.clientWidth;
					windowHeight = document.body.clientHeight;
				}

				// for small pages with total height less then height of the viewport
				if( yScroll < windowHeight )
				{
					pageHeight = windowHeight;
				}
				else
				{
					pageHeight = yScroll;
				}

				// for small pages with total width less then width of the viewport
				if(xScroll < windowWidth)
				{
					pageWidth = windowWidth;
				}
				else
				{
					pageWidth = xScroll;
				}
			}

			var scrOfX = 0, scrOfY = 0;
			if (typeof( window.pageYOffset ) == 'number')
			{
				//Netscape compliant
				scrOfY = window.pageYOffset;
				scrOfX = window.pageXOffset;
			}
			else if (document.body && (document.body.scrollLeft || document.body.scrollTop))
			{
				//DOM compliant
				scrOfY = document.body.scrollTop;
				scrOfX = document.body.scrollLeft;
			}
			else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
			{
				//IE6 standards compliant mode
				scrOfY = document.documentElement.scrollTop;
				scrOfX = document.documentElement.scrollLeft;
			}
			return( {pageWidth: pageWidth ,pageHeight: pageHeight ,
						windowWidth: windowWidth, windowHeight: windowHeight,
						scrollLeft: scrOfX, scrollTop: scrOfY} );
		}



//
// -----		DEBUG ROUTINES
//

	// -----	DUMP OBJECT		(can be used for dummping an object in a debug window, Note! is also used by codebase)
	/*
	var dmp =
	{
			debugmode : true,

			logError : function(err)
			{
				err.browser = navigator.userAgent;
				dmp.dumpObject( err );
				return err;
			},

			encodeToHtml : function (strng)
			{
				if ( !strng || strng=='' ) return strng;
				if (!strng.toString) return '!ERROR-Unable to inspect!';
				var encodedHtml = strng.toString();
				return encodedHtml.split("\x3C").join("&lt;").split("\x26").join("&amp;").split("\x3E").join("&gt;").split("\x22").join("&quot;");
			},

			inspect: function(obj, maxLevels, level)
			{
				var str = '', type, msg;

				// Start Input Validations
				// Don't touch, we start iterating at level zero
				if(level == null)  level = 0;

				// At least you want to show the first level
				if(maxLevels == null) maxLevels = 1;
				if(maxLevels < 1)
					return '<font color="red">Error: Levels number must be > 0</font>';

				// We start with a non null object
				if(obj == null)
				return '<font color="red">Error: Object <b>NULL</b></font>';
				// End Input Validations

				// Each Iteration must be indented
				str += '<ul>';

				// Start iterations for all objects in obj
				for(property in obj)
				{
					try
					{
					// Show "property" and "type property"
					type =  typeof(obj[property]);
					switch (type)
					{
					case "function":
						if ( obj[property] )		str += '<li>(' + type + ') ' + property + '()</li>';
						break;
					case "string":
						str += '<li>(' + type + ') ' + property + ( (obj[property]==null)?(': <b>null</b>'):(': <b>'+decodeURIComponent(obj[property]))) + '</b></li>';
						break;
					case "boolean":
						str += '<li>(' + type + ') ' + property + ( (obj[property]==null)?(': <b>null</b>'):(': <b>'+obj[property] ? 'true':'false')) + '</b></li>';
						break;
					case "number":
						str += '<li>(' + type + ') ' + property + ( (obj[property]==null)?(': <b>null</b>'):(': <b>'+obj[property])) + '</b></li>';
						break;
					case "object":
						if ('splice' in obj && 'join' in obj)
							str += '<li>(array) ( ' + property + ' )</li>';
						else
							str += '<li>(' + type + ') ' + property + '</li>';
						// We keep iterating if this property is an Object, non null
						// and we are inside the required number of levels
						if( (obj[property] != null) && (level+1 < maxLevels) )
							str += dmp.inspect(obj[property], maxLevels, level+1);
						break;
					}
					}
					catch(err)
					{
					// Is there some properties in obj we can't access? Print it red.
					if(typeof(err) == 'string') msg = err;
					else if(err.message)        msg = err.message;
					else if(err.description)    msg = err.description;
					else                        msg = 'Unknown';
					str += '<li><font color="red">(Error) ' + property + ': ' + msg +'</font></li>';
					}
				}

					// Close indent
					str += '</ul>';
				return str;
			},
			dumpObject : function(obj,maxlevels)
			{
				if ( !dmp.debugmode ) return;
				var str = dmp.inspect(obj,maxlevels);
				if (dmp.debugwindow && !dmp.debugwindow.closed)	dmp.debugwindow.close();
				dmp.debugwindow = null;
				dmp.debugwindow = window.open('about:blank','_blank','top=100,left=50,width=550,height=500,directories=no,location=no,scrollbars=yes,resizable=yes');
				dmp.debugwindow.document.write( str +'<br />-----------------------------------------------------------------------------------<br />');
				dmp.debugwindow.document.close();
				return;
			}
	}

	// Listener for the OK button
	function PopMessageOK(evnt)
	{
		alert('Received event - OK button click from the Message Popup'+'\n'+WebService.decode(Object.toQueryString(evnt.memo)).replace(/&/g,'\n') );
	}
	// Listener for the OK button
	function PopMessageCANCEL(evnt)
	{
		alert('Received event - CANCEL button click from the Message Popup'+'\n'+WebService.decode(Object.toQueryString(evnt.memo)).replace(/\&/g,'\n') );
	}

	// Send a message to the FireBug console
	function printfire()
	{
	   if (document.createEvent)
	   {
		  printfire.args =  'arguments';
		  var ev = document.createEvent("Events");
		  ev.initEvent("printfire", false, true );
		  dispatchEvent(ev);
	   }
	}

	*/




/*
<script type="text/javascript">
// <![CDATA[

	var __aspxAgent = navigator.userAgent.toLowerCase();
	var __aspxOpera = (__aspxAgent.indexOf("opera") > -1);
	var __aspxIE = (__aspxAgent.indexOf("msie") > -1 && !__aspxOpera);

	window.xr_NavigateUrl = function (url, target)
		{
			if (__aspxIE)
				xr_NavigateUrlForIE(url, target);
			else
				xr_NavigateUrlForNonIE(url, target);
		}

	function xr_NavigateUrlForIE(url, target)
	{
		if(url==null) return;
		var a = document.createElement("a");
		a.setAttribute('href',url);
		if(target != null)  a.setAttribute('target',target);
		document.body.appendChild(a);
		a.click();
		document.body.removeChild(a);
	}

	function xr_NavigateUrlForNonIE(url, target)
	{
		var javascriptPrefix = "javascript:";
		if(url == "")
			return;
		else
		if(url.indexOf(javascriptPrefix) != -1)
			eval(url.substr(javascriptPrefix.length));
		else
		{
			if(target != "")
				_aspxNavigateTo(url, target);
			else
				location.href = url;
		}
	}

	function _aspxNavigateTo(url, target)
	{
		var lowerCaseTarget = target.toLowerCase();
		if("_top" == lowerCaseTarget)
			top.location.href = url;
		else if("_self" == lowerCaseTarget)
			location.href = url;
		else if("_search" == lowerCaseTarget)
			window.open(url, 'blank');
		else if("_media" == lowerCaseTarget)
			window.open(url, 'blank');
		else if("_parent" == lowerCaseTarget)
			window.parent.location.href = url;
		else if("_blank" == lowerCaseTarget)
			window.open(url, 'blank');
		else
		{
			var frame = _aspxGetFrame(top.frames, target);
			if(frame != null)
				frame.location.href = url;
			else
				window.open(url, 'blank');
		}
	}

	function _aspxGetFrame(frames, name)
	{
		if(_aspxIsExists(frames[name])) return frames[name];
		for(var i = 0; i < frames.length; i++)
		{
			try
			{
				var frame = frames[i];
				if(frame.name == name) 	return frame;
				frame = _aspxGetFrame(frame.frames, name);
				if(frame != null)   	return frame;
			}
			catch(e) {	}
		}
		return null;
	}

// ]]>
</script>



*/
