// file Javascript(Javascript.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
var popupTarget;
var popupID;
var popupModifier;
var lastPopup = 0;
var PWindow;
var TPNextPos = 1;
var onload_actions = new Array();
var default_actions = new Array();
var delete_actions = new Array();
var kb_actions = new Object();

var nonDataSuffix;
var d = document;

var fSel = document.frmSelections;

var calcItems;
var regColsRows = /(SUM\(|=)*\s*(\w+[\s\w]*)\[([^!\d#\s]*)(#?)([!\d]*)(:?)([^!\d#\s]*)(#?)([!\d]*)\]\)*/i;
var valColsRows = new Array('all', 'operation', 'tableName', 'column', 'numberSign', 'row', 'colon', 'column2', 'numberSign2', 'row2');

var newStyleUpdate=false;
var ssError = false;
var start, end;
var frmUpdate;
var inputCatalog;

	function LS_last() {
		var url=document.location.href;
		url = url.replace(/&p_id=(\d)*/,'');
		var sp = getURLParm('start', '');
		var lp = document.frmSelections.lastpage.value;
		if (sp == '') {
			document.location.href = document.location.href+'&amp;start=' + lp;
		} else {
			document.location.href=url.replace('start=' + sp,'start=' + lp);
		}
	}
	function LS_first() {
		var url=document.location.href;
		url = url.replace(/&p_id=(\d)*/,'');
		var sp = getURLParm('start', '');
		if (sp == '')
			document.location.href = document.location.href + '&start=1';
		else
			document.location.href=url.replace('start=' + sp,'start=1');
	}
	function LS_next() {
		var url=document.location.href;
		url = url.replace(/&p_id=(\d)*/,'');
		var sp = getURLParm('start', '');
		if (sp == '') {
			sp = document.frmSelections.startpage.value;
			if (!sp || sp == '') document.location.href = document.location.href+'&start=2';
			else document.location.href = document.location.href+'&start=' + (parseInt(sp)+1);
		} else {
			document.location.href=url.replace('start=' + sp,'start=' + (parseInt(sp)+1));
		}
	}
	function LS_prev(){
		var url=document.location.href;
		url = url.replace(/&p_id=(\d)*/,'');
		var sp = getURLParm('start', '');
		if (sp == '') {
			sp = document.frmSelections.startpage.value;
			document.location.href = document.location.href+'&start=' + (parseInt(sp)-1);
		} else
			document.location.href=url.replace('start=' + sp,'start=' + (parseInt(sp)-1));
		
	}

	function LS_next_Ajax() {
		go_searchP2(TPNextPos + 1);
		TPNextPos +=1;
		return false;
	}
	function LS_prev_Ajax() {
		go_searchP2(TPNextPos - 1);
		TPNextPos = TPNextPos - 1;
		return false;
	}
	function LS_first_Ajax() {
		go_searchP2(1);
		TPNextPos = 1;
		return false;
	}
	function LS_last_Ajax() {
		go_searchP2($('lastpage').value);
		TPNextPos = $('lastpage').value;
		return false;
	}

function go_searchP2(start) {
	var str = '';
	document.body.style.cursor='wait';
	if ($('spin')) $('spin').style.display='';
	str = document.getElementById('FullLast_searchP').value;
	var url = 'linkedsearch_direct.asp';		
	var pars = str +'&start=' + start + '&rndNum=' + Math.random()*9999;
	var target = 'TwoPaneSearchResults';	
	var myAjax = new Ajax.Updater(target, url, { method: 'get', parameters: pars, onComplete: function (){if ($('spin')) $('spin').style.display='none'; InitMenu('menuBargrid1');  if ($('XMLRequestJava')) eval($('XMLRequestJava').value); document.body.style.cursor='default';} });			
	return false;
}

function RemoveItemFastSQL(Page, ButtonName, Parm, Val) {
	readform();
	var posturl = 'pageactions.asp?action=route&amp;formatoption=refresh&amp;retrievemode=page&amp;buttonid=' + Page + '/' + ButtonName + '&amp;passthroughparms=yes&amp;' + Parm + '=' + Val;
    var pars = Form.serialize('frmUpdate'); 
	pars = pars + '&rndNum=' + Math.random()*9999;
	alert(pars);
      var myAjax = new Ajax.Request(posturl, { method: 'post', postBody: pars, onFailure: function (){SaveFailed();}, onSuccess: function (){if($('spin')) {$('spin').style.display='none';} }});
      return false;
}


function addReplaceURLParm(url,parm,parmval) {
	
	var newStr;
	parm = parm.replace(/\?/gi, '\\\?');
	var re = new RegExp(parm + "=([^&]*)","gi");
	
	newStr = url;
	if (newStr == null)			 // if no cookies for this page, set this one as only one
		newStr = parm + '=' + parmval;
		
	else if (newStr.match(re)) {	// if this name value, already set, update
		newStr = newStr.replace(re, parm + '=' + escape(parmval)); 
		}
	else						// if this name value not present in cookie, add it to end
		newStr = newStr + '&' + parm + '=' + parmval;
	return newStr;
}

function AjaxSave() {
      divMessage.innerHTML='Saving...please wait.';
      if (document.BeforeBGSave)   {
	BeforeBGSave();	//author can create this function in the Page Template 
   	}
	else try {if(BeforeBGSave) BeforeBGSave();} catch(e) {}   //needed try-catch after finding AfterBGSave dynamically added via subpage
								//not visible with document.AfterBGSave but otherwise this check throws an error.

      var posturl = 'bgsave.asp';
      var pars = Form.serialize('frmUpdate'); 
      var myAjax = new Ajax.Updater('divMessage', posturl, { method: 'post', parameters: pars, onComplete: function (){if($('spin')) {$('spin').style.display='none';} AfterSave(); } });
      return false;
}

function AfterSave() {
 var Pos;
 var JobTypeVal;
 var JobID;
 var JobOffice;
 var JobNum;
 if (document.AfterBGSave) { 
	AfterBGSave(); //author can create this function in the Page Template
 } 
 else try {if(AfterBGSave) AfterBGSave();} catch(e) {}  //needed try-catch after finding AfterBGSave dynamically added via subpage
							//not visible with document.AfterBGSave but otherwise this check throws an error.

divMessage.innerHTML='Save Complete.';
if (document.frmSelections) document.frmSelections.Saved.value = '1';
if (document.frmSelections) 
{
	if (document.frmSelections.pkg2.value.indexOf('t=Jobs@@@@f=JobType') > -1) 
	{
		window.location.reload();
	}
	if (document.frmSelections.pkg2.value.indexOf('t=Jobs@@@@f=Office') > -1) 
	{
		window.location.reload();
	}
}
try { clearChanged(); } catch (e) {}
	PotentialRefresh();
}

function AutoAdjustElementTitle() {
 var DivTitle = document.getElementById('divPageNameFirst');
 var PageTitle = getElementByName('Title');
 if ((DivTitle)&&(PageTitle)){
	DivTitle.innerHTML = getElementByName('Template').value + ': ' + PageTitle.value;
	}
}
	
var regExp_removetags = /<\/?[^>]+>/gi;
function RemoveTags(xStr){
	xStr = xStr.replace(regExp_removetags,"");
	return xStr;
}

function inc_back_count() {
	var bc = parseInt(getURLParm('bc', 0));
	return '&bc=' + ++bc;
}
function go_back_count() {
	var bc = parseInt(getURLParm('bc', 0));
	setTimeout("history.go(" + -bc + ");", 1);
}
function getContentDocument(obj) {
	if (obj.contentDocument) {
		//alert('w3c');
		return obj.contentDocument;
	}	else if (obj.contentWindow) {
		//alert('ie5.5-6p');
		return obj.contentWindow.document;
	}	else if (obj.document && !failed) {
		//alert('ie5m');
		return obj.document;
	} else {
		alert('Houston we have an IE 5.0 PC.');
		return null;
	}
}
function urlReplace(obj, url) {	//JS2FIREFOX [added]:
	var io = getContentDocument(obj);
	io.location.replace(url);
}
function submit_bg_form(form) {
	form.submit();
}
function handPointer(obj) { // JS2FIREFOX [added]: utility function added for mouseovers 
			obj.style.cursor =  'hand';
			if (obj.style.cursor != 'hand') obj.style.cursor = 'pointer';
			//if (obj.getAttribute('title')) setStatus( obj.getAttribute('title') );
		}
function getElementByName(name) {
	if (!name || name == '') return null;
	// the inputs aren't cataloged, until an element is requested (no reason to add load time if it's not used)
	if (!inputCatalog) catalogAllInputs();
	
	var obj = inputCatalog[name];
	return (obj ? obj : document.getElementById(name)); 
}
var regGetField = new RegExp();
regGetField.compile("f=([^@]*)", "i");
function catalogAllInputs() {
	//var startTime = new Date();
	inputCatalog = new Object();
	catalogItems('INPUT');
	catalogItems('SELECT');
	catalogItems('TEXTAREA');
	//window.status = 'Catalog time:' + ((new Date()).valueOf() - startTime.valueOf())/1000 + 'ms'; 
}
function catalogItems(type) {
	var objs = document.getElementsByTagName(type);
	for (var j=0; j < objs.length; j++) {
		//if (type == 'SELECT') alert('found select');
		
		if ((type == 'INPUT' && objs[j].type == 'hidden') || !objs[j].getAttribute('name') || (objs[j].getAttribute('name').substr(0, 3) != 'Val' && objs[j].getAttribute('name').substr(0, 10) !='TargetLink')) continue;
		//if (type == 'SELECT') alert('doing select');
		catalogItem(objs[j]);
	}
}
function catalogItem(obj) {
	var name = null;
	var	pkg = obj.getAttribute('pkg');
		if (pkg && pkg != '') {
			// if this is a package based item, look for field name in pkg attribute
			var search = regGetField.exec(pkg);
			if (search && search[1]) name = search[1];
		}
		if (!name) {
			// if we didn't find a name earlier, then look for the 'Label' hidden input in the same cell as the input
			var inner_inputs = (obj.parentNode ? obj.parentNode.getElementsByTagName('INPUT') : null);
			if (inner_inputs && inner_inputs.length < 10) // if there are too many inputs, something is fishy and I don't trust the situation
			for (var i=0; i < inner_inputs.length && !name; i++) {
				if (inner_inputs[i].getAttribute('name') && inner_inputs[i].getAttribute('name') == 'Label') name = inner_inputs[i].getAttribute('value');
			}
		}
		if (!name) {
			name = obj.getAttribute('name');
		}
		if (name && name != '') inputCatalog[name] = obj;
}
function showFirstTab() {
	var tabs = divTabRow.getElementsByTagName('TD');
	//alert(tabs.length);
	tabs[0].onclick();
}
function load_help(template) {
	var tabname = '';
	var tab;
	try {
		if (selected_tab) tab = document.getElementById('divTab' + selected_tab);
		if (tab) tabname = tab.firstChild.innerHTML;
	} catch (e) {}
	if (template=='') template = PageName;
	window.open('help/help.asp?template=' + template + '#' + tabname, 'Help','toolbar=no,status=no,scrollbars=yes,menubar=no,resizable=yes,width=640,height=500'); return false;
}

function load_clientQA(id) {
    var posturl = 'clientqa.asp';
    var pars = 'id='+id + '&rnd=' + Math.random() * 9999;
	if (pars!='') posturl = posturl+'?'+pars;
	Dialog.confirm({url: posturl, options: {method: 'get'}},  
					{windowParameters: {className: "alphacube", draggable:true, resizable: false, width:550,height:500, style:"background-color: FFFFCC;"}, 
						okLabel: "Save", 
						ok: function (){ 
							//alert('Saved.');
							save_clientQA();
							return true;
							} , top: 10});
      return false;
}
function save_clientQA() {
	divMessage.innerHTML='Saving...please wait.';
	if (document.BeforeBGSave)   {
		BeforeBGSave();	//author can create this function in the Page Template 
	}
	else try { if(BeforeBGSave) BeforeBGSave();} catch(e) {}   //needed try-catch after finding AfterBGSave dynamically added via subpage
	CalcPercentCompleteQA();
	var posturl = 'clientqa.asp';
	var pars = Form.serialize('frmUpdate'); 
	pars = 'action=update&'+pars;
	var myAjax = new Ajax.Updater('somedivnotpresent', posturl, { method: 'post', parameters: pars, 
						onSuccess: function(resp) {
									var tx = resp.responseText;
									if (tx.indexOf('updated.')>-1) {
										divMessage.innerHTML='Questions and Answers saved.';
										said = $('salesAssignmentID').value;
										ajaxSaveNotes(said,'QA updated.');
									}
								} 
					});
	return false;
}
function CalcPercentCompleteQA() {

 var QARecCount = $('RecCount').value;
 var QANumComplete = 0;
 var QAPercentComplete;
 var allTextAreaObjs = document.getElementsByTagName('textarea');
 if(allTextAreaObjs)
 {
  for(var selectCounter = 0;selectCounter<allTextAreaObjs.length;selectCounter++)
  {
   var currentSelectObj = allTextAreaObjs.item(selectCounter);
   if(currentSelectObj.name.substr(0, 7) == 'textQA_'){
	if(currentSelectObj.innerHTML.length > 0){
		QANumComplete++;
	}
   }
  }
 }

	QAPercentComplete = (QANumComplete / QARecCount) * 100
	QAPercentComplete = Math.round(QAPercentComplete) 
	$('QAPctComplete').value = QAPercentComplete
	if (QAPercentComplete > 20 && $('Reassign_CSD_Div')){$('Reassign_CSD_Div').style.display='';};
	if (QAPercentComplete < 20 && $('Reassign_CSD_Div')){$('Reassign_CSD_Div').style.display='none';};
}
function load_helpv2(template) {
	  document.getElementById('HelpResourceDiv').style.display='';
      var posturl = 'VersaITHelpv2.asp';
      var pars = 'action=get&page=' + template + '&rnd=' + Math.random() * 9999;
	  var myAjax = new Ajax.Updater('HelpContents', posturl, { method: 'get', parameters: pars, 
							onComplete: function (){ AlterAllSelects('hidden'); slideIn(); } });
      return false;
}

function close_help() {
	AlterAllSelects('');
	document.getElementById('HelpResourceDiv').style.display = 'none';
	document.getElementById('HelpResourceDiv').style.left = '-320px';
	document.getElementById('HelpResourceDiv').style.top = '-320px';
}

function AlterAllSelects(visibility)
{
 var allSelectObjs = document.getElementsByTagName('select');
 if(allSelectObjs)
 {
  for(var selectCounter = 0;selectCounter<allSelectObjs.length;selectCounter++)
  {
   var currentSelectObj = allSelectObjs.item(selectCounter);
   currentSelectObj.style.visibility=visibility;
  }
 }
}


var targetX = 10;     // Final position (x)
var targetY = 10;     // Final position (y)

function slideIn() 
{
	//alert('Slidin');
	var floater = document.getElementById('HelpResourceDiv');
	var floatLeft = parseFloat(floater.style.left.replace('px', ''));
	var floatTop = parseFloat(floater.style.top.replace('px', ''));
	var newX = (floatLeft + ((targetX - floatLeft) / 12) + 3);
	var newY = (floatTop + ((targetY - floatTop) / 12) + 3);
	floater.style.left = newX + 'px';
	floater.style.top = newY + 'px';
	if ( newX < targetX || newY < targetY){
	  setTimeout('slideIn()', 10);
	}
}

function doUpdate() {
	alert('Error: The FastUpdate_v2 update code waS not loaded. Cannot save.');
}
function queue_for_update() {
}
function versait_back() {
	alert('here');
	var back = -1;
	if (document.frmSelections.iframe_hits.value) back = back - eval(document.frmSelections.iframe_hits.value);
	setTimeout("history.go(" + back + ");", 1);
}
//document.onback = versait_back;
function doOnloadActions() {
	while (onload_actions.length > 0) {
		act = onload_actions.shift();
		eval(act);
	}
}

function subMatch(regName, matchName) {
	var localArray = eval('val' + regName);
	for (var looper = 0; looper < localArray.length; looper++) {
		if (localArray[looper] == matchName) return looper;
	}
	return null;
}

function FlagChange(ElementID)
{
	try {
	  document.frmSelections.Saved.value=0;
	  eval("document.frmSelections.Changed" + ElementID +".value=0");
	  
	}
	
	catch (error) {
		return;
	}
	
	var possibleSS = document.getElementById('calc' + ElementID);
	if (possibleSS != null) {
		calcAll();
	}
	return true;
}
function FlagChangeV2(InputElement)
{
	//try {
	//alert(InputElement.tagName);
	document.frmSelections.Saved.value=0;
	InputElement.setAttribute("Changed",1);
	
	if (queue_for_update) {
		queue_for_update(InputElement, true);
	}
	if (InputElement.getAttribute("flagrow")) {
		//alert('flagrow');
		//find parent TR
		var oParent = InputElement.parentNode;
		
		//alert(oParent.nodeName);
		while ( (oParent.nodeName !='BODY' && oParent.nodeName != 'TR') ) {
			oParent = oParent.parentNode;
			//alert(oParent.nodeName);
		}
		
		if (oParent.nodeName=='TR') {
			//alert('TR');
			oParent.setAttribute("Changed",1);
			Elements = oParent.getElementsByTagName("input");
			for (var i=0; i<Elements.length; i++) {
				if(Elements.item(i).getAttribute("Changed")) {			
				//alert(Elements.item(i).tagName);
					Elements.item(i).setAttribute("Changed",1);
				}
			}
			
			Elements = oParent.getElementsByTagName("select");
			for (var i=0; i<Elements.length; i++) {
				if(Elements.item(i).getAttribute("Changed")) {			
						Elements.item(i).setAttribute("Changed",1);
				}
			}
			
			Elements = oParent.getElementsByTagName("textarea");
			for (var i=0; i<Elements.length; i++) {
				if(Elements.item(i).getAttribute("Changed")) {			
						Elements.item(i).setAttribute("Changed",1);
				}
			}
		}
	
	}

	return true;
}
function getURLParmX(str, default_) {
	if (!(window.location.href.indexOf(str) > 0)) return default_;
	var temp = window.location.href.substr( window.location.href.indexOf(str)+str.length+1);
	var str = temp;
	if (temp.indexOf('&') > 0) str = temp.substr (0, temp.indexOf('&') );
	if (str.charAt(str.length-1) == '#') return str.substr(0,  str.length-1);
	return str;
}
function getURLParm(key, default_)
{
  if (default_==null) default_=""; 
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null){
	if (key == 'key')
		if(Page) 
			return Page;
		else
			return default_;	
	else
		return default_;
	}
  else
    return qs[1];
} 
function calcAll() {
	subMatch ('ColsRows', 'column');
	if (ssError) return;
	if (calcItems == null)
		calcItems = document.getElementsByName("calc");
		
	for (var i=0; i < calcItems.length; i++) {
		if (calcItems[i].formula.charAt(0) == '=') {
			calcCell(calcItems[i]);
		}
	}	
}

function calcCell(calcItem) {
	var oldval;
	var resolvedFormula = resolveRefs(calcItem);
	if (resolvedFormula != null) {
		var valItem = document.getElementsByName("Val" + calcItem.value);
		try {
			oldval = valItem[0].value;
			if (valItem[0] != null) valItem[0].value = eval(resolvedFormula);
			valItem[0].value = Math.round(valItem[0].value*100)/100  
			if (oldval != valItem[0].value) eval("document.frmSelections.Changed" + calcItem.value +".value=0");
		}
		catch (e) {
			ssError = true;
			alert('Error calculating spread sheet');
		}
	}
}

function resolveRefs(calcItem) {
	var looper, tRow, colNum, rowNum, replacementVal, strTemp;
	var re = new RegExp(regColsRows);
	var formula = calcItem.formula.substr(1);
	var references = formula.match(re);
	var currRow = getParentElem(calcItem, 'TR');
	var tBody = getParentElem(currRow, 'TBODY');
	var regReplace;
	
	
	
	while (references != null) {
		var operation = references[subMatch('ColsRows', 'operation')];
		
		if (references[subMatch('ColsRows', 'numberSign')] == '#') {
			tRow = currRow;
			rowNum = null;
		} else if (references[subMatch('ColsRows', 'row')] != '') {
			rowNum = references[subMatch('ColsRows', 'row')];
			tRow = null;
			//go get specified row
		} else { // no row or '#' specified, must need whole column
			rowNum = null;
			tRow = null;
		}
		
		
		if (references[subMatch('ColsRows', 'column')] != null) {
			colNum = references[subMatch('ColsRows', 'column')].charCodeAt(0) - 64;			
		}
		
		if (colNum != null && tRow != null) 
			replacementVal = getCellValue(tRow, colNum);
		else if (colNum != null && rowNum != null) {
			if (references[subMatch('ColsRows', 'tableName')] == 'this') {					
					replacementVal = getCellValueFromTable(tBody, rowNum, colNum);
				}			
			else 
				replacementVal = getCellValueFromTableName(references[subMatch('ColsRows', 'tableName')], rowNum, colNum);
		}
		else if (tRow == null) { // working on all rows in a single column
			replacementVal = propagateOnColumn(currRow, colNum, operation);
		}
		
		if (replacementVal == null || replacementVal == '') replacementVal = 0;
		
		strTemp = references[0]
		strTemp = strTemp.replace(/\[/, "\\\[");
		strTemp = strTemp.replace(/\]/, "\\\]");
		strTemp = strTemp.replace(/\)/, "\\\)");
		strTemp = strTemp.replace(/\(/, "\\\(");
		regReplace = new RegExp(strTemp,"gi")
		
		formula = formula.replace(regReplace, replacementVal);
		
		// find the next 'tablename[]' set
		references = RegExp.rightContext.match(re);
	}
	return(formula);
	
}
function propagateOnColumn(tRow, colNum, operation) {
	var tBody = getParentElem(tRow, 'TBODY');
	var op;
	var cVal, sReturn;
	switch (operation.toLowerCase()) {
		case 'sum(':
			op = ' + ';
			break;
		case 'prod(':
			op = ' * ';
			break;
		case 'sub(':
			op = ' - ';
			break;
	}

	sReturn = null;
	for (var looper = 1; looper < tBody.childNodes.length; looper ++) {
		if (tBody.childNodes[looper] != tRow) //make sure we don't include current row
			if ((cVal = getCellValue(tBody.childNodes[looper], colNum)) != null) {
				if (looper == 1)
					sReturn = cVal;
				else
					sReturn = sReturn + op + cVal;
			}
	}

	return sReturn
	
}


function getCellValueFromTableName(tableName, rowNum, colNum) {
	//alert(tableName);
	var tBody = document.getElementById('tb' + tableName);
	if (tBody == null) return null;
	
	tBody = tBody.childNodes[0];
	return getCellValueFromTable(tBody, rowNum, colNum);
}

function getCellValueFromTable(tBody, rowNum, colNum) {
	if (rowNum == '!')
		var tRow = tBody.childNodes[tBody.childNodes.length - 1];
	else
		var tRow = tBody.childNodes[rowNum];
	return (getCellValue(tRow, colNum));
}

function getCellValue(tRow, colNum) {
	var looper = 0;
	var column = tRow.childNodes[colNum];
	var targetCell = column.childNodes[looper++];
		
	while ( (targetCell !=null && targetCell.name != null && targetCell.name.substr(0,3) != 'Val') || (targetCell != null && targetCell.name == null) ) {
		
		targetCell = column.childNodes[looper++];
	}
	if (targetCell != null && targetCell.name != null && targetCell.name.substr(0,3) == 'Val')
		return targetCell.value;
	return null;
}

function getParentElem(item, elem) {
	var tElem;
	tElem = item.parentNode;
	while (tElem.nodeName != elem && tElem.nodeName != 'BODY') {
		tElem = tElem.parentNode;
	}
	if (tElem.nodeName == elem) {
		return tElem;
	}
	return null;
}


function getTable(tableName, calcItem) {
	// probably should add caching here for tables
	var tBody;
	if (tableName == 'this')
		tBody = calcItem.parentNode;
	while (tBody.nodeName != 'TBODY') {
		tBody = tBody.parentNode;
	}
	if (tBody.nodeName == 'TBODY') {
		alert('got it');
	}
}

function ValidateMask(item, mask)
{
	var required = item.mask;
	if (mask != "") {
		var re = new RegExp(mask);
		var matches = item.value.match(re);
		
		if (matches == null) {
			//alert("Item: " + item.name + " must be of the form: " + required + ". Please correct this and resubmit.");
			alert("Item must be of the form: " + required + ". Please correct this and resubmit.");
			return false;
		}
	}
	return true;
}

function HandleSpecial(item, e)
{
	item.selection=document.selection.createRange();
	var currMask = item.mask;
	
	if (isMaskValid(item.value, currMask)) {
		var dup = item.selection.duplicate();
		var pos = 0-dup.move("character",-255);
		
		var dup = item.selection.duplicate();
		dup.move("character",1);
		
		var modPos = 0;
		
		if (pos < currMask.length) {
			switch (e.keyCode) {
			case 8: 
				// backspace key
				if (item.selection.text.length > 0) { // clear out any selected text 
					// if dealing with an actual selection
					var data = stripOutData(item.value, currMask, pos+item.selection.text.length);
					var newText = applyMask(data, currMask, pos);
					document.selection.clear();
					while (dup.expand("character"));
					dup.text = nonDataSuffix + newText;// + nonDataSuffix;
					
					return false;
					break;
				}
				
				if (currMask.charAt(pos-1) != '#' && currMask.charAt(pos-1) != '&') {
					// if trying to delete a non data character, skip over it
					dup.text = item.value.charAt(pos-1) + item.value.charAt(pos)
					item.selection.expand("character");
					item.selection.text = "";
					
					return true;
				}
				
				while (dup.expand("character"));
				var data = stripOutData(item.value, currMask, pos);
				var newText = applyMask(data, currMask, pos-1);
				dup.text = newText;// + nonDataSuffix;
				
				item.selection.expand("character");
				
				item.selection.text = "";
				return true;
				break;
				
			case 46:
				// delete key
				if (item.selection.text.length > 0) { // clear out any selected text 
					var data = stripOutData(item.value, currMask, pos+item.selection.text.length);
					var newText = applyMask(data, currMask, pos + modPos);
					document.selection.clear();
					while (dup.expand("character"));
					dup.text = nonDataSuffix + newText;// + nonDataSuffix;
					
					return true;
					break;
				}
				
				while (currMask.charAt(pos) != '#' && currMask.charAt(pos) != '&') {
					if (pos == item.value.length) return false; // jump out if no data left to delete
					pos++;
					modPos = -1;
				}
				while (dup.expand("character"));
				
				//alert(item.value);
				var data = stripOutData(item.value, currMask, pos+1);
				//alert(data);
				var newText = applyMask(data, currMask, pos + modPos);
				//alert(newText);
				dup.text = nonDataSuffix + newText;// + nonDataSuffix;
					
				return true;
				break;
			}
		}
	}
	return true;
}

function CheckMask(item, e)
{
	var passThrough = false;
	var currMask = item.mask;
	var newChar = String.fromCharCode(e.keyCode)
	var modPos = 1;
	
	item.selection=document.selection.createRange();
	if (item.selection.text.length > 0) {
		document.selection.clear(); // clear out any selected text
	}
	//item.selection.text = "" // clear out any selected text
		
	if (isMaskValid(item.value, currMask)) {
		var dup = item.selection.duplicate();
		var pos = 0 - dup.move("character",-255);
		var dup = item.selection.duplicate();
		dup.move("character", 1);
		while (dup.expand("character"));
		if (pos < currMask.length) { // if we're within the confines of the mask
			var data = stripOutData(item.value, currMask, pos);
			var tempString = "";
			var looper = pos;
			if (currMask.charAt(looper) != '#' && currMask.charAt(looper) != '&' && item.value.charAt(looper) != '' && currMask.charAt(looper) != newChar) {
				while (looper < currMask.length && looper < item.value.length && currMask.charAt(looper) != '#' && currMask.charAt(looper) != '&' && item.value.charAt(looper) != '' && currMask.charAt(looper) != newChar) {
					tempString = currMask.charAt(looper);
					looper++;
				}
				passThrough = true;
				modPos = tempString.length + 1;
				newChar = tempString + newChar;
			}
			if ((currMask.charAt(pos) == '#' && (newChar >= '0' && newChar <= '9')) || (currMask.charAt(pos) == newChar) || passThrough) { // at somepoint, when we do letter only mask, we will need some of this stuff //&& (currMask.charAt(pos) = '&' || (newChar > '0' || newChar < '9'))) {
				passThrough = false;
				// mask wants number and we got a number
				if (isMaskFilled(item.value, currMask)) {
					// if mask is filled up, we throw a
					data = data.substr(1);
				}
				var newText = applyMask(data, currMask, pos+modPos); // modPos will usually be 1, but will be 0 when entering prior to a non-data char
				
				if (pos < item.value.length) {
					// adding numbers in middle of text
					dup.text = newText				
					item.selection.expand("character");
				} else {
					// if appending numbers on end of text
					dup.text = newText				
				}
				
				item.selection.text = newChar + nonDataSuffix;
			}
			return false;
		} else {
			// we're outside mask, they can do whatever they want
		}
	}
	else {
		// mask isn't valid, they can do whatever they want

	}
	return true;
}

function applyMask(data, mask, startPos)
{
	var output="";
	var dataCount=0;
	nonDataSuffix="";
	// consume all data
	for (var looper=startPos; dataCount < data.length; looper++) {
		//alert('maskchar' + mask.charAt(looper));
		if (looper > mask.length || mask.charAt(looper) == '#' || mask.charAt(looper) == '&') {
			output = output + data.charAt(dataCount);
			dataCount++;
		} else {
			if (dataCount > 0) {
				// never want lead character to be a dash (non data)
				output = output + mask.charAt(looper);
			} else {
				nonDataSuffix = nonDataSuffix + mask.charAt(looper);
			}
			//if (looper == mask.length) return output;
		}
		
	}
	// append any non-data mask stuff
	for (var looper = looper; looper < mask.length; looper++) {
		if (mask.charAt(looper) != '#' && mask.charAt(looper) != '&') {
			output = output + mask.charAt(looper)
		} else {
			return output;
		}
	}
	return output;
}

function stripOutData(input, mask, startPos)
{
	var output="";
	for (var looper=startPos; looper < input.length; looper++) {
		if (looper >= mask.length || mask.charAt(looper) == '#' || mask.charAt(looper) == '&') {
			output = output + input.charAt(looper);
		}
	}
	return output;
}

function isMaskValid(input, mask)
{
	for (var looper=0; looper < mask.length; looper++) {
		if (looper >= input.length) {
			return true;
		}
		else {
			if (mask.charAt(looper) == '#' && (input.charAt(looper) < '0' || input.charAt(looper) > '9')) {
				return false;
			} else {	
					if (mask.charAt(looper) != '#' && mask.charAt(looper) != input.charAt(looper)) {
						//if (mask.charAt(looper) == ' ')	return true;
						return false;
					}
				//}
			}
		}
	}
	return true;
}

function isMaskFilled(input, mask)
{
	if (mask.length > input.length) return false;
	return true;
}

function VerifySave(dont_wait, target_obj)	//JS2FIREFOX [changed] - added target_obj param
{
	if(typeof worksheetCustomExit!="undefined")
	{	
		if(!worksheetCustomExit())
			return false;
	}

	if (newStyleUpdate && outstandingUpdates()) {
		
		if (confirm("Changes have been made to this page. Press OK if you wish to save these changes and continue")) {
			//if (confirm("Changes have been made to this page. Press OK if you wish to discard these changes and continue"))
			doUpdate(dont_wait);
			return true;
		} else
		return (confirm("Do you wish to continue with requested action without saving?"));
	}
	
	//following specifically for Testgate, question page.
	try {
		SaveHTML(selectedEditObj);
	} catch (e) {}
	
	
	if (document.frmSelections.Saved.value==-1)
	{               
		document.frmSelections.Saved.value=0;
		return true;
	}               
	if (document.frmSelections.Saved.value==0)
	{	
		//For FastUpdate, cookie requested action, call "Save" onclick, then check for "nextaction" cookie afterwards.
		//Assume there is a "Save" button with an "onclick"
		if(document.getElementById('Save')) {
			var savecmd = document.getElementById('Save').getAttribute('onclick');
			//alert('Save: '+document.getElementById('Save').nodeName+':'+savecmd);
			
			var srcEl = (window.event && window.event.srcElement) ? window.event.srcElement : target_obj;			//JS2FIREFOX [changed]

			if(srcEl) {
				var cmd=srcEl.getAttribute('cmd');
				//alert('1' + cmd);
				if(srcEl.tagName=='DIV')
					if(srcEl.getAttribute('cmd')) {
						cmd = srcEl.getAttribute('cmd');
						//alert('2' + cmd);
				
					}
					if(cmd==null && srcEl.tagName!='A' && srcEl.parentNode.tagName=='A') { 
					cmd = srcEl.parentNode.getAttribute('onclick');
					//alert('3' + cmd);
				
					} 
					else {
					cmd = srcEl.getAttribute('onclick');
					//alert('4' + cmd);
				
					}

				if(cmd==null) cmd='';
				cmd = cmd.toString().replace(/function anonymous\(\)/,"")
				cmd = cmd.toString().replace(/return false/,"")
				cmd = cmd.toString().replace(/parent\.parent\.VerifySave\(([^\)]*)\)/,"true")
				cmd = cmd.toString().replace(/parent\.VerifySave\(([^\)]*)\)/,"true")
				cmd = cmd.toString().replace(/VerifySave\(([^\)]*)\)/,"true")
				//alert('cmd: '+cmd); 

				//document.frmUpdate['nextaction'].value = cmd;
				//alert('nextaction: '+document.frmUpdate['nextaction'].value); 
			}
		}
		else savecmd=''

		if (showModalDialog)	// if we're in IE, use the new dialog
			var retVal = msgbox("Changes have been made to this page. Please select an action to take.", 'vbCancelCont_DontSaveCont_SaveDefaultButton1Question', 'Save Changes?');
		else
			retVal = confirm("Changes have been made to this page. Do you wish to save and continue?") ? 8 : -2;
		if (retVal==8) {
			//if (confirm("Changes have been made to this page. Do you wish to save and continue?"))
			
			//alert(savecmd.toString().indexOf('readform'));
			if(savecmd.toString().indexOf('readform')>0) {	//Does the Save button have "readform" in it?
				//set frmUpdate.nextaction
				if(cmd) {
					//alert('test:' + cmd);
					setCookie('checknextaction', '1');		
					setCookie('nextaction', escape(cmd) );
				}
				else	setCookie('checknextaction', '0');
				try {
					document.getElementById('Save').onclick();	//execute Save
				}
				catch (error) { return;}
				return false;
			} else {
				document.frmSelections.Saved.value=-1;
				return true;
			}
		} else if (retVal==-2) {
			return (confirm("Do you wish to continue with requested action without saving?"));
		} else if (retVal==9) {
			return true;
		} else {
			return false;
		}
		
	}
	else
		return true;
}

function VSaveButton(url)
{

	document.frmSelections.action = url;

	if (document.frmSelections.Saved.value==-1)
	{	
		document.frmSelections.Saved.value=0;
		return true;
	}	
	if (document.frmSelections.Saved.value==0)
	{	


		var pattern = /Save(\w+)/g;
		var saveFound;
		var buttons = document.getElementsByTagName('a');
		var num = buttons.length;
		var currItem; 
		var SaveButton = 'no';
		var j = 1;
		while (j < num) {
			currItem = buttons[j];
			if (currItem.innerText.substr(0, 4) == 'Save') {
				SaveButton = 'yes';
				j = num;
			}
		j++;
		}

		if (SaveButton == 'yes')
		{
			//alert('SaveButton onclick=' + currItem.onclick);

			if (confirm("Changes have been made to this page. Do you wish to save and continue?"))
			{
				document.frmSelections.Saved.value=-1;
				//merge urls
				var DisplayURLParts = url.split('&');
				var SaveURL = "" + currItem.onclick;
				var SaveURLParts = SaveURL.split("'");
				var NewURL = SaveURLParts[1].split("&")[0];
				NewURL = NewURL + '&' + SaveURLParts[1].split("&")[3];
				NewURL = NewURL + '&' + DisplayURLParts[0].split("?")[1];
				NewURL = NewURL + '&mergedurl=y';
				var num2 = DisplayURLParts.length;
				var k = 1;
				while (k < num2) {
					NewURL = NewURL + '&' + DisplayURLParts[k];

				k++;
				}
				
				//alert('NewURL=' + NewURL);
				document.frmSelections.action = NewURL;



				return true;
			}
			else
			{
				if (confirm("Do you wish to continue with requested action without saving?"))
				{
					return true;
				}
				else
				{
					return false;
				}
			}
		}
		else
		{
			return true;
		
		}	
	}
	else
		return true;
}
function determineEndAction() {
		//alert('test' + getURLParm("dontbackrefresh", "f"));
		//return 0;
		if (getURLParm("dontbackrefresh", "f") == "t")
			return 0;
		return 2;
}
function PotentialRefresh()
{
	  var endstr = document.cookie.indexOf ("checknextaction=1");
					 if (endstr > -1 && document.frmSelections.EndAction)
	{
			 //	alert('a');
									 var nextaction = getCookie('nextaction');
					nextaction = unescape(nextaction);
					//alert('Cookie nextaction='+nextaction);
					setCookie('checknextaction', '0');
					setCookie('nextaction', '');
					document.frmSelections.Saved.value=-1;
														eval(nextaction);
														//setTimeout('alert("ok");' + nextaction, 5000);
	}
	
	endstr = document.cookie.indexOf ("backreload");
	if (endstr > -1)
	{
				//alert('here');
					document.cookie = "EndAction=none";
					//window.location.reload(true);
					setTimeout("window.location.reload(true);", 1);
														//window.location.replace(window.location.href);
														//alert('here');
	}
	document.frmSelections.Saved.value=1;
	return true;
}

function PotentialBackNavigation()
{
	if (document.frmSelections.EndAction.value ==1)
	{
		document.frmSelections.EndAction.value = 0;
		setTimeout("history.go(-2);", 1);
	}
	if (document.frmSelections.EndAction.value == 2)
	{
		document.frmSelections.EndAction.value = 0;
		document.cookie = "EndAction=backreload";
		setTimeout("history.go(-2);", 1);
	}
	
	return true;
}


function FlagChangeMulti(isChecked,ElementID)
{
	// this is used for both Reverse PV selection changes, as well as attendance page changes for the Tech Connect 2 application.
	// Note, ElementID cannot contain a colon.
	var intNumBoxes;
	document.frmSelections.Saved.value=0;
	
	intNumBoxes = eval("document.frmSelections." + ElementID +".length");
	
	if (typeof(intNumBoxes) != "undefined")
	{
		ElementID = ElementID + "[0]"
	}
	if (isChecked) {
		eval("document.frmSelections." + ElementID +".value=1");
	}
	else {
		eval("document.frmSelections." + ElementID +".value=0");
	}
		
	return true;
}


function EntryIsChecked()
{
	var Checked; //as Boolean
	var intNumBoxes, x; // as integer
	
	Checked=false;
	
	intNumBoxes = document.frmSelections.chkPage.length;
	if (typeof(intNumBoxes) == "undefined")
	{
		// if only entry checked, true otherwise false
		Checked = document.frmSelections.chkPage.checked;
	}
	else
	{
		x=0;
		while (x<intNumBoxes)
		{
			if (document.frmSelections.chkPage[x].checked)
			{
				Checked = true;
			}
			x++;
		}
	}
	if (!Checked) alert("You must select at least 1 entry for this function.");
	return Checked;
}

function ItemIsChecked()
{
	var Checked; //as Boolean
	var intNumBoxes, x; // as integer
	
	Checked=false;
	
	intNumBoxes = document.frmSelections.chkItem.length;
	if (typeof(intNumBoxes) == "undefined")
	{
		// if only entry checked, true otherwise false
		Checked = document.frmSelections.chkItem.checked;
	}
	else
	{
		x=0;
		while (x<intNumBoxes)
		{
			if (document.frmSelections.chkItem[x].checked)
				Checked = true;
			x++;
		}
	}
	if (!Checked) alert("You must select at least 1 item for this function.");
	return Checked;
}


function PopUp(ID, popupPage, IDmodifier, initValue) {
	var openURL = 'display.asp?formatoption=popup&retrievemode=page&pagetype=POPUP+PAGE&key=' + popupPage + '&' + initValue;
	var w = 640, h=480;
	var openParms = 'location=no,scrollbars=yes,resizable=yes,width='+w+',height='+h;
	popupID = ID;
	LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
	TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
	openParms = openParms+',top='+TopPosition+',left='+LeftPosition

	if (IDmodifier == null) {
		popupModifier = '';
	} else {
		popupModifier = IDmodifier;
	}
		
	try {
		if (popupModifier.substr(0,2) == '??') 
			popupTarget = document.frmSelections[popupModifier];
		else {
			popupTarget = eval("document.frmSelections.Val" + popupModifier + ID);
			if (!popupTarget) popupTarget = eval("document.frmSelections.TargetLink" + popupModifier + ID);
			if (!popupTarget) popupTarget = document.getElementById(ID);
		}
		
	}
	catch (error) {
		return;
	}
	
	if (popupPage.indexOf('.') > -1) {
		openURL = popupPage;
	}

	if (popupPage.indexOf('lookup.asp') > -1 || popupPage.indexOf('lookupv2.asp') > -1) {
		//alert(popupPage);
	    if (document.location.href.indexOf('xID=') > -1) {
		pos = document.location.href.indexOf("xID=")
		if (pos > -1)	{
		    xID = document.location.href.substring(pos + 3, document.location.href.length)
		    if (xID.indexOf("&") >= 0)
			xID = unescape(xID.substring(1, xID.indexOf("&")))	
		    openURL = openURL+'&xID='+xID;
		}
	    }
	}

	if (lastPopup != popupPage || typeof(PWindow) == 'undefined') {
		// if window has never been opened, or this is a different popup, open it
		PWindow=open(openURL,'PWindow',openParms);
		if (PWindow.opener == null) PWindow.opener = self;
		PWindow.focus();
		lastPopup = popupPage;
	}
	else {
		// if this popup is already open, or already opened and closed.
		try {
			// reapply focus
			PWindow.focus();
		} catch (error) {
			// if the popup had been closed, reopen it
			PWindow=open(openURL,'PWindow',openParms);
			if (PWindow.opener == null) PWindow.opener = self;
			lastPopup = popupPage;
		}
	}
}

function DatePopUp(ID,IDmodifier) {
	var openURL = 'datepopup.htm';
	var openParms = 'location=no,scrollbars=no,resizable=no,width=250,height=230';
	popupID = ID;
	if (IDmodifier == null) {
		popupModifier = '';
	} else {
		popupModifier = IDmodifier;

	}
	try {
		if (popupModifier.charAt(0)=='?' && document.frmSelections.elements[IDmodifier]) {
			popupTarget = document.frmSelections.elements[IDmodifier];
			}
		else {
			popupTarget = eval("document.frmSelections.Val" + popupModifier + ID);
			if (!popupTarget) popupTarget = eval("document.frmSelections.TargetLink" + popupModifier + ID);
		}
	}
	
	catch (error) {
		return;
	}
	
	
	if (typeof(PWindow) == 'undefined') {
		// if window has never been opened, or this is a different popup, open it
		PWindow=open(openURL,'PWindow',openParms);
		if (PWindow.opener == null) PWindow.opener = self;
		PWindow.focus();
	}
	else {
		// if this popup is already open, or already opened and closed.
		try {
			// reapply focus
			PWindow.focus();
		} catch (error) {
			// if the popup had been closed, reopen it
			PWindow=open(openURL,'PWindow',openParms);
			if (PWindow.opener == null) PWindow.opener = self;
		}
	}
}



var changedLinkText = "alert('test2');";
function changedLink() {
	var temp = new Function(changedLinkText);
	temp();
	return false;
}

function RPV(Value) {
	return returnPopupValue(Value);
}
function returnPopupValue(Value) {
	//alert(Value);
		var sets;
		
		var loop;
		if (Value.indexOf("=") == -1) {
			// simple assignment (no ='s)
			
			try {
				opener.popupTarget.value = Value;
				//alert(opener.popupID);				
				opener.FlagChange(opener.popupID);
			} catch (error) {
				popupTarget.value = Value;
			}
		}
		else {
			if (Value.indexOf("&&") == -1) {
				handleReturn(Value)			
			} else {
				sets = Value.split("&&");
				for(loop = 0; loop < sets.length; loop++) {
					handleReturn(sets[loop])
				}
			}
		}
		try {
			opener.FlagChangeV2(opener.document.getElementById(opener.popupID))
		} catch (error) {}
		try {
			opener.FlagChange(opener.popupID);
		} catch (error) {
		}
	
	window.close();
}

function handleReturn(text) {
	var pairs;
	var target;
	var j=1;
	var finders;
	
	pairs = text.split("=");
	if (pairs[0].substr(0,14) == 'AttributeVal!!') {
		var temp = 'AttributeLabel' + opener.popupID;
		finders = pairs[0].split("!!");
		var num = opener.document.getElementsByTagName('input').length;
		var currItem; 
		while (j < num) {
			currItem = opener.document.getElementsByTagName('input')[j];	
			if (currItem.value == finders[1] && currItem.name.substr(0,temp.length) == temp) {
				target = eval("opener.document.frmSelections.AttributeVal" + opener.popupID + currItem.name.substring(temp.length));
				j = num;
			}
		j++;
		}
		target.value = pairs[1];
		return false;
	}
	if (pairs[0].substr(0,10) == '@@linkpage' || pairs[0].substr(0,4) == '@@lp') {
		var pattern = /key=[\d]*/i;
		
		var temp = opener.document.getElementById('link' + opener.popupID).onclick.toString();
		temp = temp.substring(temp.indexOf('{') + 2, temp.length - 3) + ';'; // rip out function text
		// this line of code removes the return false found at start of onclick when there is no selected value already ('None')
		if (temp.substring(0, 13) == 'return false;') temp = temp.substring (14);
		temp = temp.replace(pattern, "key=" + pairs[1]); // change key value
		// set function text into hidden javascript variable in calling page
		opener.changedLinkText = temp;
		// change onclick to point to a function in the calling page, which invokes the text set above
		opener.document.getElementById('link' + opener.popupID).onclick = opener.changedLink;
		
		try {
			opener.document.getElementById('link' + opener.popupID).parentNode.getElementsByTagName('INPUT')[3].value = pairs[1]; //WSH 6/8/06 put in to support lookup.asp changes on links in new Sunglass system. Relies on input being 4th one in TD
		}catch (error) {

		}

		opener.popupTarget.value = pairs[1]; // set new link value\
		opener.FlagChange(opener.popupID);
		return false;
	}
	if (pairs[0].substr(0,10) == '@@linktext' || pairs[0].substr(0,4) == '@@lt') {
		opener.document.getElementById('link' + opener.popupID).innerText = pairs[1]; // change link text
		return false;
	}
	
	try {
		target = eval("opener.document.frmSelections." + pairs[0] + opener.popupID);
		target.value = pairs[1];
	} catch (error) {
		alert('Error finding target.');
		return false;
	}
	
	
}

// *************************************************************
// This area deals with cursor positioning and pressing enter
firstElement = 0;
netscape = "";
ver = navigator.appVersion; len = ver.length;
for(iln = 0; iln < len; iln++) if (ver.charAt(iln) == "(") break;
netscape = (ver.charAt(iln+1).toUpperCase() != "C");

var default_actions_return = true;

function keyDown(DnEvents) { // handles keypress
	// determines whether Netscape or Internet Explorer
	var event = (DnEvents) ? DnEvents : window.event					// JS2FIREFOX [changed]
	var k = event.keyCode;																			// JS2FIREFOX [changed]
	//window.status = k + '!';
	var action = kb_actions[k + '_'];
	if (k == 13) { // enter key pressed
		var src = (event.target) ? event.target : event.srcElement;		// JS2FIREFOX [changed]
		if (src.name.substr(0,3)=='Val') {
			eval('FlagChange('+src.name.substr(3,9)+')');
		}
		//alert(document.getElementById('QuickSearch').value);
		if(document.frmDefaultAction.DefaultAction && (document.frmDefaultAction.DefaultAction)){
			//following line is to ensure that onchange event occurs for textbox
			try {
				document.frmSelections.elements[firstElement].focus();
				document.frmSelections.elements[firstElement].blur();
			} catch (e) {}
				intEnterActions = document.frmDefaultAction.DefaultAction.length;
				if (typeof(intEnterActions) == "undefined")
				// if only 1
					eval(document.frmDefaultAction.DefaultAction.value);
				else
				// if more than 1
					eval(document.frmDefaultAction.DefaultAction[0].value);
		}
		for (var j=0; j < default_actions.length; j++) {
			eval(default_actions[j]);

			
		}
		
	} else if (k == 46) { // del key pressed
		for (var j=0; j < delete_actions.length; j++) {
			eval(delete_actions[j]);
			
		}
	} else if (action) {
		if (eval(action['ctrl']) == event.ctrlKey && eval(action['shift']) == event.shiftKey && eval(action['alt']) == event.altKey)   {
			eval(action['action']);
		}
	}
	if(!default_actions_return){
		default_actions_return = true;
		return false;
	}

}

document.onkeydown = keyDown; // work together to analyze keystrokes
if (netscape) document.captureEvents(Event.KEYDOWN|Event.KEYUP);


function attachKeyPress(action, code, ctrlkey, altkey, shiftkey) {
	var temp = new Object;
	temp['ctrl'] = (ctrlkey ? 'true' : 'false');
	temp['alt'] = (altkey ? 'true' : 'false');
	temp['shift'] = (shiftkey ? 'true' : 'false');
	temp['action'] = action;
	
	kb_actions[code + '_'] = temp;
	
}


// *************************************************************

function keypress_number(decimal) {
	var keypressed = window.event.keyCode;
	var ElementText  = window.event.srcElement.value ;
	if (keypressed == 45){
		if (ElementText.length!=0) {
			window.event.keyCode = 0;
		}
	
	}
	else {
		if (decimal) {
			var Reg = /\./g;
			if (Reg.test(ElementText)) {
				if( (keypressed >= 48 && keypressed <= 57) == false) {
					window.event.keyCode = 0;
				}
			}
			else {
				if ((keypressed >= 48 && keypressed <= 57 || keypressed == 46) == false) {
					window.event.keyCode = 0;
				}
			}
		}

		else {
			if ((keypressed >= 48 && keypressed <= 57) == false) {
				window.event.keyCode = 0;
			}
		}
	}
}

function keypress_date() {
	var keypressed = window.event.keyCode;
	var ElementText  = window.event.srcElement.value ;
	if (keypressed == 45){
		if (ElementText.length!=0) {
			window.event.keyCode = 0;
		}
	}
	else {
		if ((keypressed >= 48 && keypressed <= 57 || keypressed == 45 || keypressed == 47) == false) {
			window.event.keyCode = 0;
			}
	}
}

function setCursor() {
	
	var dontrefresh = getCookie('dontrefresh');
	setCookie('dontrefresh', 'false');
	if (dontrefresh == 'true') return;
	for (x = 0; x < document.frmSelections.length; x++) {
		if (document.frmSelections.elements[x].type == "text" || document.frmSelections.elements[x].type=="password") {
			try {
				document.frmSelections.elements[x].focus();
				firstElement = x;
			} catch (error) {}
			return;
		}
	}
}


// *************************************************************

function openwin(url,wintype)
{

 if (wintype=="screen1") window.open(url, wintype,'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=250,height=500');
 if (wintype=="screen2") window.open(url, wintype,'');
 if (wintype=="screen3") window.open(url, wintype,'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1,width=350,height=150');
}


// Cookie Functions
function setStrData(instr, name, value) {
	var pattern = new RegExp(name + "=([^;])*","gi");
	var str;
	instr = unescape(instr);
	if (!instr || instr=='null' || instr=='' || instr=='undefined') {
		str = name + "=" + escape(value) + '; ';
		return escape(str);
	}
	/*alert(instr);
	alert(pattern.test(instr));*/
	if (pattern.test(instr)) {
		instr = instr.replace(pattern, name + "=" + escape(value));
	} else {
		instr = instr + name + '=' + value + '; ';
	}
	return escape(instr);
	//alert(inst.replace(pattern, "key=" + pairs[1]); // change key value
}
function getStrData(instr, name) {
	var pattern = new RegExp(name + "=([^;])*","gi");
	if (!instr || instr=='null' || instr=='' || instr=='undefined') {
		return instr;
	}
	var results = pattern.exec(instr);
	if (results && results.length > 0) {
		return (unescape(unescape(results[0]))).substr(name.length+1);
	}
	return instr;
}
// name - name of the cookie
// value - value of the cookie
// [expires] - expiration date of the cookie (defaults to end of current session)
// [path] - path for which the cookie is valid (defaults to path of calling document)
// [domain] - domain for which the cookie is valid (defaults to domain of calling document)
// [secure] - Boolean value indicating if the cookie transmission requires a secure transmission
// * an argument defaults when it is assigned null as a placeholder
// * a null placeholder is not required for trailing omitted arguments
function setCookie(name, value, expires, path, domain, secure, subname) {
	if (subname) {
			var value_str = getCookie(name);
			//value_str = value_str.replace(/\?/gi, '\\\?');*/
			//alert('before :' + value_str);
			value = setStrData(value_str, subname, value);
			//alert('after: ' + value);
	}
  var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}

// name - name of the desired cookie
// * return string containing value of specified cookie or null if cookie does not exist
function getCookie(name, subname) {
	var dc = document.cookie;
	if (subname) {
			//alert('before g: ' + dc);
			dc = getStrData(dc, name);
			name = subname;
			//alert('after g, subname=' + subname  + ': ' + dc);
	}
  var prefix = name + "=";
  var begin;
  if (dc.substring(0,prefix.length)==prefix) {
    //alert(dc.substring(0,prefix.length));
    begin = 0;
  }
  else {
     begin = dc.indexOf("; " + prefix);
     if (begin == -1) {
       begin = dc.indexOf(prefix);
       if (begin != 0) return null;
     } else
       begin += 2;
  }
  var end = dc.indexOf(";", begin);
  if (end == -1)
    end = dc.length;

  return unescape(dc.substring(begin + prefix.length, end));
}

// name - name of the cookie
// [path] - path of the cookie (must be same as path used to create cookie)
// [domain] - domain of the cookie (must be same as domain used to create cookie)
// * path and domain default if assigned null or omitted if no explicit argument proceeds
function deleteCookie(name, path, domain) {
  if (getCookie(name)) {
    document.cookie = name + "=" + 
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}

var expdate = new Date(); 
expdate.setTime(expdate.getTime() + 20*24*60*60*1000); 

function setVersaCookie(page, name, value) {
	var newStr;
	name = name.replace(/\?/gi, '\\\?');
	var re = new RegExp(name + "=([^&]*)","gi");
	
	newStr = getCookie('page' + page);
	if (newStr == null)			 // if no cookies for this page, set this one as only one
		newStr = name + '=' + value;
		
	else if (newStr.match(re))	// if this name value, already set, update
		newStr.replace(re, name + '=' + value);
	else						// if this name value not present in cookie, add it to end
		newStr = newStr + '&' + name + '=' + value;
	
	var expdate = new Date(); 
	expdate.setTime(expdate.getTime() + 20*24*60*60*1000); 

	setCookie('page' + page, newStr, expdate);
}

function deleteVersaCookie(page, name) {
	var newStr;
	var re = new RegExp(name + "=[^&]*","gi")

	newStr = getCookie('page' + page);
	if (newStr.match(re)) {	// if this name value, already set, delete it
		newStr = newStr.replace(re, '');
		newStr = newStr.replace(/&&/gi, '&');
	}
	setCookie('page' + page, newStr, expdate);
	
}
function openFullScreen() {
					var width, height;
					if (screen.availHeight) { 
						width = screen.availWidth-5;
						height = screen.availHeight-60;
					} else if (window.outerWidth) {
						width = window.outerWidth;
						height = window.outerHeight;
					}
					//alert(height);
			
			var win = window.open(window.location, 'FullScreen', 'top=0, left=0, location=no, titlebar=yes, menubar=no, width=' + width + ', height=' + height + ', resizable=yes, scrollbars=yes, status=yes, toolbar=no');
			win.resizeTo( screen.availWidth, screen.availHeight );

}

function goto_page(page, xid, target, fo) {
	var usefo
	if(fo)
		usefo = fo
	else
		usefo = 'basic display'
	//setCookie('tab', '0', null, null, null, null, page + '_' + xid);
	if (target == 'parent')
		parent.location.href='display.asp?key=' + page + '&fo=' + usefo + '&rm=page&xID=' + xid
	else
		window.location.href='display.asp?key=' + page + '&fo=' + usefo + '&rm=page&xID=' + xid
	
}

function ajaxRefresh(url,target,SQLID)
{	
	//alert(url);
	//$(target).innerHTML = '<span>Loading...Please Wait</span>';
	//$(target).innerHTML = url;
	
	url =  url + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;
	
	if ( $('spin_'+SQLID) ) $('spin_'+SQLID).style.visibility = 'visible';
	
	var myAjax = new Ajax.Updater(target, url, { method: 'get', parameters: "", 
	                              onComplete: function (r) 
								  {													  
									if ( $('XMLRequestJava_'+SQLID) )
									{
										//alert($('XMLRequestJava').value );
									    eval( $('XMLRequestJava_'+SQLID).value );
									}
									
									if ( $('spin_'+SQLID) ) $('spin_'+SQLID).style.visibility = 'hidden';
									
								  } });
}

function ajaxPageActions(url,tablenames)
{


	//var extraPars = 'FormatOption=' + escape(getElementByName('FormatOption').value) + '&CurrURL=' + escape(getElementByName('CurrURL').value) + '&Saved=' + escape(getElementByName('Saved').value) + '&EndAction=' + escape(getElementByName('EndAction').value) + '&iframe_hits=' + escape(getElementByName('iframe_hits').value) + '&newLoad=' + escape(getElementByName('newLoad').value) + '&pkg2=' + escape(getElementByName('pkg2').value) + '&Page=' + escape(getElementByName('Page').value) + '&PageID=' + escape(getElementByName('PageID').value) + '&LastUpdated=' + escape(getElementByName('LastUpdated').value) + '&AddEntryOnLinkPaste=' + escape(getElementByName('AddEntryOnLinkPaste').value);
	var extraPars = 'FormatOption=' + escape(getElementByName('FormatOption').value) 
	+ '&CurrURL=' + escape(getElementByName('CurrURL').value) 
	+ '&Saved=' + escape(getElementByName('Saved').value) 
	+ '&EndAction=' + escape(getElementByName('EndAction').value) 
	+ '&iframe_hits=' + escape(getElementByName('iframe_hits').value) 
	+ '&newLoad=' + escape(getElementByName('newLoad').value) 
	+ '&Page=' + escape(getElementByName('Page').value) 
	+ '&PageID=' + escape(getElementByName('PageID').value) 
	+ '&LastUpdated=' + escape(getElementByName('LastUpdated').value);

	if (getElementByName('AddEntryOnLinkPaste')){
		extraPars += '&AddEntryOnLinkPaste=' + escape(getElementByName('AddEntryOnLinkPaste').value);
	}
	else
	{
		extraPars += '&AddEntryOnLinkPaste=true'; 
	}

	url = url + "&" + extraPars + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;
	
	var target = 'divMessage'	
	
	var myAjax = new Ajax.Updater(target, url, { method: 'post', parameters: "", 
	                              onComplete: function (d) 
								  {
									//alert(d.responseText);
									if ( tablenames )
									{
										var tables = tablenames.split(",");
										
										for( var k=0; k< tables.length; k++ )
										{
											//alert(tables[k]);
											RefreshTable(tables[k]);
										}
									}								
								  } });
}

function RefreshTable(tablename)
{
	var tableObj;
	var tbls = document.getElementsByTagName("TABLE");
	
	for( var i=0; i < tbls.length; i++ )
	{
		if (tbls[i].getAttribute("TableName"))
		{
			if (tbls[i].getAttribute("TableName") == tablename)
			{
				tableObj = tbls[i];
				break;
			}
		}
	}
	
	//Now we have the table-- lets find the Refresh Link in previousSibling (center)
	if (tableObj) 
	{
		var aTags = (tableObj.previousSibling).getElementsByTagName("A");
		
		for( var j=0; j < aTags.length; j++ )
		{		
			if (aTags[j].getAttribute("title"))
			{
				if (aTags[j].getAttribute("title") == "Refresh Results")
				{
					aTags[j].click();
					break;
				}
			}
		}
	}
}


function GenLetterLink(Source,xID,LetterPageNum,AltID,SendVia)
{
if (AltID == '') AltID = 0;
if (Source > 0){
	window.location.href = 'pageactions.asp?action=generateletter&amp;source='+ Source +'&amp;letter=' + LetterPageNum + '&amp;sendvia='+ SendVia +'&amp;altid='+ AltID +'&amp;formatoption=basic display&amp;retrievemode=page&amp;key=8568&amp;xSourseID='+ xID +'&amp;ppwp=yes'; 
}

}

function GenLetterEmailLink(Source,xID,LetterPageNum,AltID,SendVia,Letter,xState)
{
if (AltID == '') AltID = 0;
if (Source > 0){
	//alert('Letter:' + Letter + ', index:' + Letter.indexOf('ADL'));
	if(Letter.indexOf('ADL') > -1) {
		//alert('GenLetterEmailLink - ADL');
		document.frmSelections.action = 'pageactions.asp?action=route&formatoption=refresh&retrievemode=page&buttonid=7106/ADL Letter&passthroughparms=yes&??STATE='+ xState +'&??xID='+ xID; 
		document.frmSelections.submit(); 
	}
	else
	{
		window.location.href = 'pageactions.asp?action=generateletter&source='+ Source +'&letter=' + LetterPageNum + '&sendvia='+ SendVia +'&altid='+ AltID +'&formatoption=basic display&retrievemode=page&key=8568&xSourseID='+ xID +'&ppwp=yes'; 
	}
}

}

function toggleLeftNav()
{
}

function GetURLQvals(url) 
	{
		var keypattern = /key=[\d]*/i;
		var formatoptionpattern = /formatoption=[^&]*/gi;
		var retrievemodepattern = /retrievemode=[^&]*/gi;
		var fopattern = /fo=[^&]*/gi;
		var rmpattern = /rm=[^&]*/gi;
		var amppattern = /&[^?]*/gi;
		//temp = temp.replace(pattern, "key=" + pairs[1]); // change key value
		
		var modurl=url;
		modurl = modurl.substr(modurl.indexOf('asp?')+4);
		modurl = modurl.replace(/&p_id=(\d)*/,'');
		modurl = modurl.replace(keypattern,'');
		modurl = modurl.replace(formatoptionpattern,'');
		modurl = modurl.replace(retrievemodepattern,'');
		modurl = modurl.replace(fopattern,'');
		modurl = modurl.replace(rmpattern,'');
		modurl = modurl.replace(amppattern,'');
		return modurl;
	}

function AdvanceProcessingDate(theD)
{
	var answer = confirm("You are about to advance the processing date.  Are you sure you want to continue?");
	if (answer)
	{
		var url = 'AjaxActions.asp'; 
		var pars = 'action=AdvanceProcessingDate';
		pars = pars + '&verify='+theD;
		pars = pars + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;
		
		var target = 'divProcessingDate';	
		var myAjax = new Ajax.Updater(target, url, { method: 'post', parameters: pars, 
		                              onComplete: function (d) 
									  {
										//alert(d.responseText);
									  } });
	}
	return false;
}

function GetGenLetters(State,User,Req,SourcePage,Source,Alt,Arena,xID)
{
	//display.asp?formatoption=search%20results&key=7106&retrievemode=searchpage&KSource=8524&id=99999&??STATE=FL%&??USER=7007%&??REQR=EXEC%&??SOURCEPAGE=111163&Source=8587&??ALTID=8524%&??ARENA=Sales%&xID=15114
	// If we have already ajaxed it once, no need to do it again!
	if ($('GenLetterResultsClose')) {
		TempHideSelects('hidden');
		$('GenLetterResults').style.display ='';
		return false;
	}
	
		var url = 'linkedsearch_direct.asp?id=7104/FastSQL'; 
		url = url + '&??STATE=' + State;
		url = url + '&??USER=' + User;
		url = url + '&??REQR=' + Req;
		url = url + '&??SOURCEPAGE=' + SourcePage;
		url = url + '&??GENSOURCE=' + Source;
		url = url + '&??ARENA=' + Arena;
		url = url + '&??ALTID=' + Alt;
		url = url + '&??xID=' + xID;
		url = url + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;

		var target = 'GenLetterResults';
		var myAjax = new Ajax.Updater(target, url, { method: 'post', parameters: "", 
		                              onComplete: function (d) 
									  {
										TempHideSelects('hidden');
										$('GenLetterResults').innerHTML = '<div id="GenLetterResultsClose" style="position:absolute;top:1;left:1;background:white;width:99%;text-align:right;"><img src="images/close.gif" onclick="CloseGetGenLetters();"/></div><br/>' + d.responseText;
										$('GenLetterResults').style.display ='';
									  } });

	return false;
}

function CloseGetGenLetters()
{
	TempHideSelects('visible');
	$('GenLetterResults').style.display ='none';
}	

function TempHideSelects(action) 
{
//possible values for action are 'hidden' and 'visible'
if (action!='visible'){action='hidden';}

if (navigator.appName.indexOf("MSIE")) 
{
	for (var S = 0; S < document.forms.length; S++)
	{
		for (var R = 0; R < document.forms[S].length; R++) 
		{
			if (document.forms[S].elements[R].options) 
			{
				document.forms[S].elements[R].style.visibility = action;
			}
		}
	} 
}

}



function getWindowHeight() {
var windowHeight=0;
if (typeof(window.innerHeight)=='number') {
	windowHeight=window.innerHeight;
}
else {
	if (document.documentElement&&document.documentElement.clientHeight) {
		windowHeight=document.documentElement.clientHeight;
		}
		else {
			if (document.body&&document.body.clientHeight) {
			windowHeight=document.body.clientHeight;
			}
		}
	}
return windowHeight;
}

function getWindowWidth() {
var windowWidth=0;
if (typeof(window.innerWidth)=='number') {
	windowWidth=window.innerWidth;
}
else {
	if (document.documentElement&&document.documentElement.clientWidth) {
		windowWidth=document.documentElement.clientWidth;
		}
		else {
			if (document.body&&document.body.clientWidth) {
			windowWidth=document.body.clientWidth;
			}
		}
	}
return windowWidth;
}


function centerdiv2(div) {
		var winh = getWindowHeight();
		var winw = getWindowWidth();
		var divh = (div.style.height=='') ? 280 : div.style.height;		
		var divw = (div.style.width=='') ? 600 : div.style.width;		
		div.style.top=''+((winh/2)-(divh/2))+'px';
		div.style.left=''+((winw/2)-(divw/2))+'px';
}


function CreditBureauComplete()
{
	//document.frames['Search_Results'].location.replace('Blankresults.htm');
	setCookie('saved_recs',' ');
	document.frames['Search_Results'].setRecCheckboxes();
}

function worksheetCustomExit()
{
	//Guardian does not want to use this
	return true;
}



function promptButtons(tablenames) {
	return buttonStr = "<CENTER>" + new st_button("ajaxPromptActions('pageactions.asp?action=applyprompts&amp;formatoption=refresh&amp;retrievemode=page', '" + tablenames + "');  return false;", "", "UIButtonred", "Submit", "cmd_Submit", "Submit", null).create()
		+ new st_button("promptWin.close(); return false;", "", "UIButtonred", "Cancel", "cmd_Cancel", "Cancel", null).create() + "</CENTER>";
}

function ajaxPromptActions(url, tablenames) {
	document.frmPrompt.action = url;
	$('frmPrompt').request( {
		onComplete: function (d) {
			promptWin.close();
			RefreshTable(tablenames);
		}
	});
}

function ajaxRouter(url, tablenames, options) {
	document.frmSelections.action = url;
	$('frmSelections').request( {
		onComplete: function (d) {
			if (d.responseText.indexOf('<div id="divPromptBody"') > 0) {
				var start = d.responseText.indexOf("<Form")
				var end = d.responseText.indexOf("</Form>")
				//var formStr =  new RegExp('<FORM\b[^>]*>(.*?)</FORM>', 'i');
				var formStr = d.responseText.substring(start, end + 7).replace(/frmSelections/gi, 'frmPrompt');
				
				var ajax_options = new Hash({width:600, height:500, zIndex: 100, resizable: false, title: "", hideEffect:Element.hide, showEffect:Element.show, draggable:true, wiredDrag: true, destroyOnClose: true });
				ajax_options = ajax_options.merge(options)
				promptWin = new Window(ajax_options);
				promptWin.getContent().innerHTML= formStr + promptButtons(tablenames);
				promptWin.showCenter(true);
			} else {
				//refreshTables(tablenames);
				
				RefreshTable(tablenames);
				
			}
		}
	});
}


function validateThisDate(fld) {
    var RegExPattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
    var errorMessage = 'Please enter valid date as month, day, and four digit year.\nYou may use a slash, hyphen or period to separate the values.\nThe date must be a real date. \nFormat mm/dd/yyyy.';
    if ((fld.value.match(RegExPattern))||fld.value=='') {
        //alert('Date is OK'); 
		var x = fld.getAttribute('oldbackground');

		if (fld.getAttribute('oldbackground'))
			fld.style.background = fld.getAttribute('oldbackground');
    } else {

        alert(errorMessage);
		fld.setAttribute('oldbackground',(fld.style.background == '' ? 'white' : fld.style.background));
		fld.style.background='red';
		fld.focus();
    } 
}

function load_bug_report()
{

	var posturl = 'http://spreadsheets.google.com/embeddedform?key=p5kg0i_2XKSeTYQ-TQVHYQA&hl=en&gridId=0';
    var pars = '&rnd=' + Math.random() * 9999;
	if (pars!='') posturl = posturl+'?'+pars;
	var win = new Window({url: posturl, options: {method: 'get'}, className: "alphacube",  width:510, height:670, zIndex: 100, resizable: true, title: "<b>Report a Bug!</b>", hideEffect:Element.hide, showEffect:Element.show, draggable:true, wiredDrag: true})
		win.showCenter();
    return false;
}

//expression(constExpression(ieBox ? "100px" : "80px"));
function constExpression(x) {
   //x = document.body.scrollWidth;
   var LeftNavOffset = 0;
   if (document.getElementById('divLeftNav')){
	if (document.getElementById('divLeftNav').style.display=='')
	{
		LeftNavOffset = 210;
   }
   }
   x = document.body.offsetWidth-35-LeftNavOffset;
   return x;
}

function CM_SaveDebtorNotes(noteid){
var notesBy = $('FindMyUserID').value;
	if (notesBy!='') {
		if ($('SaveNotesID').innerHTML!=''){
			$('SaveNotesID').innerHTML = $('SaveNotesID').innerHTML + ' by ' +notesBy;
		}
		else{
			alert('Please enter notes before clicking.');
			return false;
		}
	}
	var theNotes = $('SaveNotesID').innerHTML;
	var url = 'worksheetActions.asp';
	var pars = 'action=SetDebtorNotes&xID=' + noteid 
			 + '&notes=' + escape(theNotes)
			 + '&rnd='+ (Math.random() * Date.parse(new Date())) ;
		 
	var target = 'divMessage';				
	if( $('notesSpinner') ) $('notesSpinner').style.visibility = 'visible';
	var myAjax = new Ajax.Updater(target, url, { method: 'get', parameters: pars, 
						onComplete: function(r) 
									{										
										$('divMessage').value = unescape(r.responseText);
										if( $('notesSpinner') ) $('notesSpinner').style.visibility = 'hidden';
										document.location.reload();
									} });

}

var MyReturnflag = false;
function ValidateItemPhone(TextItem)
{
	var url = 'worksheetActions.asp';
	var pars = 'action=CheckInvPhone&xID=' + TextItem.RecID
			 + '&Phone=' + TextItem.value
			 + '&Page=' + Page
			 + '&rnd='+ (Math.random() * Date.parse(new Date())) ;
		 
	var target = 'divMessage';				
	if( $('notesSpinner') ) $('notesSpinner').style.visibility = 'visible';
	var myAjax = new Ajax.Updater(target, url, { method: 'get', parameters: pars, asynchronous: false, 
						onComplete: function(r) 
									{										
										if( $('notesSpinner') ) $('notesSpinner').style.visibility = 'hidden';
										
										if (r.responseText.indexOf('Error:')>-1)
										{
											
											//alert(ValidateItemPhone);
											var items, mess, ph;
											items = r.responseText.split("|");
												mess = items[0];
												ph = items[1];
											TextItem.value = ph.substr(0,12);
											TextItem.style.background = 'Yellow';
											$('divMessage').innerHTML = mess;
											MyReturnflag = false;
										}
										else
										{
											TextItem.style.background = 'White';
											//alert(ValidateItemPhone);
											MyReturnflag = true;
										}
									} });
//alert('Flag: ' + MyReturnflag);
return MyReturnflag;									
}

function UpdateUserTypePerm(e)
{
			var UserTypeID = e.uid;
			var PermVal = e.options(e.selectedIndex).value;
			var PermID = e.id;
			
			var url = 'AjaxActions.asp?action=SetUserTypePerm'; 
			url = url + '&UserTypeID=' + UserTypeID;
			url = url + '&PermVal=' + PermVal;
			url = url + '&PermID=' + PermID;			
			url = url + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;

			var target = '';
			var myAjax = new Ajax.Updater(target, url, { method: 'post', parameters: "", 
										  onComplete: function (d) 
										  {

											}
										  } );
}



function getContentDocument(obj) {
	if (obj.contentDocument) {
		//alert('w3c');
		return obj.contentDocument;
	}	else if (obj.contentWindow) {
		//alert('ie5.5-6p');
		return obj.contentWindow.document;
	}	else if (obj.document ) { //&& !failed
		//alert('ie5m');
		return obj.document;
	} else {
		alert('Houston we have an IE 5.0 PC.');
		return null;
	}
}

function urlReplace(obj, url) {	//JS2FIREFOX [added]:
	var io = getContentDocument(obj);
	io.location.replace(url);
}

var xmlEditWin;
function xmlEdit(id,title){
	var winh = getWindowHeight() - 100;
	var winw = getWindowWidth() - 50;
	var newTitle = '<b>' + title + '</b>';
	var posturl = 'xmledit.asp';
    var pars = 'action=EditLargeText&ID=' + id + '&rnd=' + Math.random() * 999999;
	if (pars!='') posturl = posturl+'?'+pars;
	xmlEditWin = new Window({url: posturl, options: {method: 'get'}, className: "alphacube",  width: winw, height: winh, zIndex: 100, resizable: true, title: newTitle, hideEffect:Element.hide, showEffect:Element.show, draggable:true, wiredDrag: true})
		xmlEditWin.showCenter();
    return false;

}


function getXYpos(elem) {
   if (!elem) {
      return {"x":0,"y":0};
   }
   var xy={"x":elem.offsetLeft,"y":elem.offsetTop}
   var par=getXYpos(elem.offsetParent);
   for (var key in par) {
      xy[key]+=par[key];
   }
   return xy;
}

function UpdateGenericItem(element){
	updatefield(element.tbl, element.fld, element.RecID, element.value,'');
}

function updatefield(table, field, id, value, user){
var url = 'AjaxActions.asp?action=updatefield'; 
	url = url + '&TABLE=' + table;
	url = url + '&FIELD=' + field;
	url = url + '&ID=' + id;
	url = url + '&VALUE=' + value;
	url = url + '&USER=' + user;
	url = url + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())) ;

	var target = '';
	var myAjax = new Ajax.Updater(target, url, { method: 'post', parameters: "", 
	  onComplete: function (d) 
	  { } });

return false;
}


// *************************************************************
// TABLE SORT FUNCTIONS
// *************************************************************

var ua = navigator.userAgent.toLowerCase()
var isIE = ( (ua.indexOf('msie') != -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) ); 
var css_offset_ff = isIE ? 0 : 1;
var css_offset_ie = isIE ? 1 : 0;

onload_actions.push('attachKeyPress("if (document.getElementById(\'Save and Return\')) {document.getElementById(\'Save and Return\').onclick();}", 83, true);');


// **************************************************************************************************************************
// New - Combining all JS files
// document.write('<SCRIPT LANGUAGE="JavaScript" SRC="js/date.js"></SCRIPT>');
// document.write('<SCRIPT LANGUAGE="JavaScript" SRC="js/msgbox.js"></SCRIPT>');
// document.write('<SCRIPT LANGUAGE="JavaScript" SRC="js/button_gen.js"></SCRIPT>');
// document.write('<SCRIPT LANGUAGE="JavaScript" SRC="js/simple_server_comm.js"></SCRIPT>');
// document.write('<SCRIPT LANGUAGE="JavaScript" SRC="ajaxactions.js"></SCRIPT>');
// **************************************************************************************************************************


// --END--	 -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Date(Date.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}


function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}


function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}


function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	

function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
	
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
function getDateFromFormat(val,format){
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}


function parseDate(val) {
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}


// --END--	 -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file msgbox(msgbox.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

var strMsgboxPath = 'js/'; 	// adjust this line to reflect the web app's relative path to the jsMsgbox files (e.g. '/inc/controls/jsMsgbox/')
var vbOK=1, vbCancel=2, vbAbort=3, vbRetry=4, vbIgnore=5, vbYes=6, vbNo=7;
function msgbox(prompt, buttons, title, helpfile, context){
	// guess at height (based on # of line-breaks) 
	var h = 2;
	if(prompt.search(/\r\n/g)!=-1){h = prompt.match(/\r\n/g).length+1;}
	h = 110 + (h*12.5);	// base-110px + 12.5px/line

	// guess at width (based on longest line's char-count)
	var w = 30;
	if(prompt.search(/[^\r\n]*[\r\n]?/gm)!=-1){
		var lines = prompt.match(/[^\r\n]*[\r\n]?/gm);
		for(var l=0; l<lines.length; l++){
			if(lines[l].length>w){w=lines[l].length};
		}
	}
	w-=30;
	if(w<0){w=0};
	w = 220 + (w*7.5);	// base 210px + 7.5px/char
	
	var strFeatures = 'dialogHeight:' + h + 'px; dialogWidth:' + w + 'px; scroll:no; status:no; help:no; resizable:yes;';
	return showModalDialog(strMsgboxPath + 'js_msgbox.html?d=11', arguments, strFeatures);	// fast live ver
}

// --END--	 -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file button_gen(button_gen.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


var special_classes = new Object();
special_classes['UIButtonred'] = 'custom1';
special_classes['UIButtonreddesign'] = 'custom2';

function custom1(scale) {
	if (!scale) scale = 1;
	// dimensions for the end points I'm using is 12 wide by 26 high
	var height = (scale * 24);
	var width = (height * .5);		// 12 / 26
	var fontsize = (height * .5)-2;	// 12 pt font / 26
	var fontweight = 'bold';
	
	with (this) {
	var action = onclick;
	
 	str = '<table class="button_custom1_table"  border="0" cellspacing="0" cellpadding="0" onmouseover="handPointer(this)" onclick="' + action + '" id="' + id + '" style="' + style + '" href="' + href + '" >'
	+ '			<tr>'
	+ '				<td width="' + width + '" height="' + height + '"><img src="images/blueleft2.gif" style="width: ' + width + 'px; height: ' + height + 'px"/></td>'
	+ '				<td height="' + height + '" style="background-image: url(images/bluemiddle2.gif);vertical-align: middle;"><span class="button_custom1">' + label + '</span></td>'
	+ '				<td width="' + width + '" height="' + height + '"><img src="images/blueright2.gif" style="width: ' + width + 'px; height: ' + height + 'px"/></td>'
	+ '			</tr>'
	+ '		</table>';
 
 
	}
	return str;
}


function custom2(scale) {
	if (!scale) scale = 1;
	// dimensions for the end points I'm using is 12 wide by 26 high
	var height = (scale * 24);
	var width = (height * .5);		// 12 / 26
	var fontsize = (height * .5)-2;	// 12 pt font / 26
	var fontweight = 'bold';
	
	with (this) {
	var action = onclick;
	
  	str = '<table class="button_custom1_table"  border="0" cellspacing="0" cellpadding="0" onmouseover="handPointer(this)" onclick="' + action + '" id="' + id + '" style="' + style + '" href="' + href + '" >'
	+ '			<tr>'
	+ '				<td width="' + width + '" height="' + height + '"><img src="images/blueleft2.gif" style="width: ' + width + 'px; height: ' + height + 'px"/></td>'
	+ '				<td height="' + height + '" style="background-image: url(images/bluemiddle2.gif);vertical-align: middle;"><span class="button_custom2">' + label + '</span></td>'
	+ '				<td width="' + width + '" height="' + height + '"><img src="images/blueright2.gif" style="width: ' + width + 'px; height: ' + height + 'px"/></td>'
	+ '			</tr>'
	+ '		</table>';
 
	}
	return str;
}

function simulate_A(obj, verifySave, popup) {
	if ((verifySave && VerifySave(true)) || !verifySave) {
		if (popup) {
			window.open(obj.getAttribute('href'));
			}
		else {
			document.location = obj.getAttribute('href');
		}
	}
	
}

function st_button(onclick, href, class_, title, id, label, style, pf, ondblclick) {
	// if we have a special class defined for this css class, then search for and
	//  call the custom function. Otherwise, use default A tag.
	this.ondblclick = (onclick ? onclick : '');
	this.onclick = (onclick ? onclick : '');
	this.href = (href ? href : '');
	this.class_ = (class_ ? class_ : '');
	this.title = (title ? title : '');
	this.id = (id ? id : '');
	this.label = (label ? label : '');
	this.style = (style ? style : '');	
	this.pf = (pf ? pf : '0');	
}

st_button.prototype.create = function() {
	var func;
	if (this.pf > '0'){
		if (varPermissionsString.substr(this.pf-1,1)=='0'){
			return '';
		}
	}
	if (special_classes[this.class_]) {
		try {
			func = eval(special_classes[this.class_]);
		} catch (e) {}
		
		if ( typeof func == 'function' ) {
			return func.apply(this, arguments);
		}
	}
	if (this.href!='')
		return '<a href="' + this.href + '" onclick="' + this.onclick + '" id="' + this.id + '" title="' + this.title + '" class="' + this.class_ + '" style="' + this.style + '">' + this.label + '</a>';
	else
		return '<a href="/jsError.html" onclick="' + this.onclick + '" id="' + this.id + '" title="' + this.title + '" class="' + this.class_ + '" style="' + this.style + '">' + this.label + '</a>';
}


// --END-- -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file simple_server_comm( simple_server_comm.js) {  nuthing  };
// --START-- -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

var IFrameObj; // our IFrame object
function callToServer(fullcall){
	urlReplace(document.getElementById('pageactions_bg'), fullcall);
}



// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file ajaxactions(ajaxactions.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

function load_SalesProjectionsEntry(id) {
	id=getURLParm('key', '');
	alert('load_SalesProjectionsEntry for SU id='+id);
    var posturl = 'sp_entry.asp';
    var pars = 'id='+id + '&rnd=' + Math.random() * 9999;
	if (pars!='') posturl = posturl+'?'+pars;
	Dialog.confirm({url: posturl, options: {method: 'get'}},  
					{windowParameters: {className: "alphacube", draggable:true, resizable: false, width:550, style:"background-color: FFFFCC;"}, 
						okLabel: "Save", 
						ok: function (){ 
							save_SalesProjectionsEntry();
							return true;
							} , top: 100});
      return false;
}

function save_SalesProjectionsEntry() {
    if (divMessage) divMessage.innerHTML='Saving...please wait.';
	if (document.BeforeBGSave)   {
		BeforeBGSave();	//author can create this function in the Page Template 
	}
	else try { if(BeforeBGSave) BeforeBGSave();} catch(e) {}   //needed try-catch after finding AfterBGSave dynamically added via subpage
	var posturl = 'sp_entry.asp';
	var pars = Form.serialize('frmUpdate'); 
	pars = 'action=update&'+pars;
	var myAjax = new Ajax.Updater('somedivnotpresent', posturl, { method: 'post', parameters: pars, 
						onSuccess: function(resp) {
									var tx = resp.responseText;
									if (tx.indexOf('updated.')>-1) {
										divMessage.innerHTML='Questions and Answers saved.';
									}
								} 
					});
	return false;
}



// --END-- -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Prototype(Prototype.js) {  nuthing  };
// --START-- -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,



/*  Prototype JavaScript framework, version 1.5.1_rc3
 *  (c) 2005-2007 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://www.prototypejs.org/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.5.1_rc3',

  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      (document.createElement('div').__proto__ !==
       document.createElement('form').__proto__)
  },

  ScriptFragment: '<script[^>]*>([\u0001-\uFFFF]*?)</script>',
  JSONFilter: /^\/\*-secure-\s*(.*)\s*\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch(type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }
    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (object.ownerDocument === document) return;
    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (value !== undefined)
        results.push(property.toJSON() + ': ' + value);
    }
    return '{' + results.join(', ') + '}';
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({}, object);
  }
});

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}

Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $R(0, this, true).each(iterator);
    return this;
  },

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

Date.prototype.toJSON = function() {
  return '"' + this.getFullYear() + '-' +
    (this.getMonth() + 1).toPaddedString(2) + '-' +
    this.getDate().toPaddedString(2) + 'T' +
    this.getHours().toPaddedString(2) + ':' +
    this.getMinutes().toPaddedString(2) + ':' +
    this.getSeconds().toPaddedString(2) + '"';
};

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback(this);
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return this;
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : this;
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return {};

    return match[1].split(separator || '&').inject({}, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (hash[key].constructor != Array) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  times: function(count) {
    var result = '';
    for (var i = 0; i < count; i++) result += this;
    return result;
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json)))
        return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

with (String.prototype.escapeHTML) div.appendChild(text);

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }
}

var $break    = new Object();
var $continue = new Object();

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator(value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator) {
    var index = -number, slices = [], array = this.toArray();
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.map(iterator);
  },

  all: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      result = result && !!(iterator || Prototype.K)(value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator) {
    var result = false;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push((iterator || Prototype.K)(value, index));
    });
    return results;
  },

  detect: function(iterator) {
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(pattern, iterator) {
    var results = [];
    this.each(function(value, index) {
      var stringValue = value.toString();
      if (stringValue.match(pattern))
        results.push((iterator || Prototype.K)(value, index));
    })
    return results;
  },

  include: function(object) {
    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = fillWith === undefined ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator) {
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator) {
    var trues = [], falses = [];
    this.each(function(value, index) {
      ((iterator || Prototype.K)(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator) {
    return this.map(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
}

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

if (Prototype.Browser.WebKit) {
  $A = Array.from = function(iterable) {
    if (!iterable) return [];
    if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&
      iterable.toArray) {
      return iterable.toArray();
    } else {
      var results = [];
      for (var i = 0, length = iterable.length; i < length; i++)
        results.push(iterable[i]);
      return results;
    }
  }
}

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse)
  Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(value && value.constructor == Array ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  indexOf: function(object) {
    for (var i = 0, length = this.length; i < length; i++)
      if (this[i] == object) return i;
    return -1;
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  },

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (value !== undefined) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.Opera){
  Array.prototype.concat = function() {
    var array = [];
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for (var i = 0, length = arguments.length; i < length; i++) {
      if (arguments[i].constructor == Array) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  }
}
var Hash = function(object) {
  if (object instanceof Hash) this.merge(object);
  else Object.extend(this, object || {});
};

Object.extend(Hash, {
  toQueryString: function(obj) {
    var parts = [];
    parts.add = arguments.callee.addPair;

    this.prototype._each.call(obj, function(pair) {
      if (!pair.key) return;
      var value = pair.value;

      if (value && typeof value == 'object') {
        if (value.constructor == Array) value.each(function(value) {
          parts.add(pair.key, value);
        });
        return;
      }
      parts.add(pair.key, value);
    });

    return parts.join('&');
  },

  toJSON: function(object) {
    var results = [];
    this.prototype._each.call(object, function(pair) {
      var value = Object.toJSON(pair.value);
      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);
    });
    return '{' + results.join(', ') + '}';
  }
});

Hash.toQueryString.addPair = function(key, value, prefix) {
  key = encodeURIComponent(key);
  if (value === undefined) this.push(key);
  else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
}

Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
  _each: function(iterator) {
    for (var key in this) {
      var value = this[key];
      if (value && value == Hash.prototype[key]) continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  keys: function() {
    return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $H(hash).inject(this, function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  remove: function() {
    var result;
    for(var i = 0, length = arguments.length; i < length; i++) {
      var value = this[arguments[i]];
      if (value !== undefined){
        if (result === undefined) result = value;
        else {
          if (result.constructor != Array) result = [result];
          result.push(value)
        }
      }
      delete this[arguments[i]];
    }
    return result;
  },

  toQueryString: function() {
    return Hash.toQueryString(this);
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  },

  toJSON: function() {
    return Hash.toJSON(this);
  }
});

function $H(object) {
  if (object instanceof Hash) return object;
  return new Hash(object);
};

// Safari iterates over shadowed properties
if (function() {
  var i = 0, Test = function(value) { this.key = value };
  Test.prototype.key = 'foo';
  for (var property in new Test('bar')) i++;
  return i > 1;
}()) Hash.prototype._each = function(iterator) {
  var cache = [];
  for (var key in this) {
    var value = this[key];
    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;
    cache.push(key);
    var pair = [key, value];
    pair.key = key;
    pair.value = value;
    iterator(pair);
  }
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
}

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (typeof responder[callback] == 'function') {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) {}
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   ''
    }
    Object.extend(this.options, options || {});

    this.options.method = this.options.method.toLowerCase();
    if (typeof this.options.parameters == 'string')
      this.options.parameters = this.options.parameters.toQueryParams();
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
  _complete: false,

  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Hash.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      if (this.options.onCreate) this.options.onCreate(this.transport);
      Ajax.Responders.dispatch('onCreate', this, this.transport);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous)
        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (typeof extras.push == 'function')
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    return !this.transport.status
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState];
    var transport = this.transport, json = this.evalJSON();

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + this.transport.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(transport, json);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = this.getHeader('Content-type');
      if (contentType && contentType.strip().
        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
          this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
      Ajax.Responders.dispatch('on' + state, this, transport, json);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) { return null }
  },

  evalJSON: function() {
    try {
      var json = this.getHeader('X-JSON');
      return json ? json.evalJSON() : null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
  initialize: function(container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function(transport, param) {
      this.updateContent();
      onComplete(transport, param);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.container[this.success() ? 'success' : 'failure'];
    var response = this.transport.responseText;

    if (!this.options.evalScripts) response = response.stripScripts();

    if (receiver = $(receiver)) {
      if (this.options.insertion)
        new this.options.insertion(receiver, response);
      else
        receiver.update(response);
    }

    if (this.success()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(query.snapshotItem(i));
    return results;
  };

  document.getElementsByClassName = function(className, parentElement) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  }

} else document.getElementsByClassName = function(className, parentElement) {
  var children = ($(parentElement) || document.body).getElementsByTagName('*');
  var elements = [], child;
  for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
    if (Element.hasClassName(child, className))
      elements.push(Element.extend(child));
  }
  return elements;
};

/*--------------------------------------------------------------------------*/

if (!window.Element) var Element = {};

Element.extend = function(element) {
  var F = Prototype.BrowserFeatures;
  if (!element || !element.tagName || element.nodeType == 3 ||
   element._extended || F.SpecificElementExtensions || element == window)
    return element;

  var methods = {}, tagName = element.tagName, cache = Element.extend.cache,
   T = Element.Methods.ByTag;

  // extend methods for all tags (Safari doesn't need this)
  if (!F.ElementExtensions) {
    Object.extend(methods, Element.Methods),
    Object.extend(methods, Element.Methods.Simulated);
  }

  // extend methods for specific tags
  if (T[tagName]) Object.extend(methods, T[tagName]);

  for (var property in methods) {
    var value = methods[property];
    if (typeof value == 'function' && !(property in element))
      element[property] = cache.findOrStore(value);
  }

  element._extended = Prototype.emptyFunction;
  return element;
};

Element.extend.cache = {
  findOrStore: function(value) {
    return this[value] = this[value] || function() {
      return value.apply(null, [this].concat($A(arguments)));
    }
  }
};

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    $(element).style.display = 'none';
    return element;
  },

  show: function(element) {
    $(element).style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, html) {
    html = typeof html == 'undefined' ? '' : html.toString();
    $(element).innerHTML = html.stripScripts();
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  replace: function(element, html) {
    element = $(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    if (element.outerHTML) {
      element.outerHTML = html.stripScripts();
    } else {
      var range = element.ownerDocument.createRange();
      range.selectNodeContents(element);
      element.parentNode.replaceChild(
        range.createContextualFragment(html.stripScripts()), element);
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $A($(element).getElementsByTagName('*')).each(Element.extend);
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (typeof selector == 'string')
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return expression ? Selector.findElement(ancestors, expression, index) :
      ancestors[index || 0];
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    var descendants = element.descendants();
    return expression ? Selector.findElement(descendants, expression, index) :
      descendants[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return expression ? Selector.findElement(previousSiblings, expression, index) :
      previousSiblings[index || 0];
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return expression ? Selector.findElement(nextSiblings, expression, index) :
      nextSiblings[index || 0];
  },

  getElementsBySelector: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  getElementsByClassName: function(element, className) {
    return document.getElementsByClassName(className, element);
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      if (!element.attributes) return null;
      var t = Element._attributeTranslations;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name])  name = t.names[name];
      var attribute = element.attributes[name];
      return attribute ? attribute.nodeValue : null;
    }
    return element.getAttribute(name);
  },

  getHeight: function(element) {
    return $(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      return true;
    return false;
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).add(className);
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).remove(className);
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
    return element;
  },

  observe: function() {
    Event.observe.apply(Event, arguments);
    return $A(arguments).first();
  },

  stopObserving: function() {
    Event.stopObserving.apply(Event, arguments);
    return $A(arguments).first();
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);
    while (element = element.parentNode)
      if (element == ancestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = Position.cumulativeOffset(element);
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value) {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles, camelized) {
    element = $(element);
    var elementStyle = element.style;

    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property])
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
          (camelized ? property : property.camelize())] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = $(element).getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = element.style.overflow || 'auto';
    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  }
};

Object.extend(Element.Methods, {
  childOf: Element.Methods.descendantOf,
  childElements: Element.Methods.immediateDescendants
});

if (Prototype.Browser.Opera) {
  Element.Methods._getStyle = Element.Methods.getStyle;
  Element.Methods.getStyle = function(element, style) {
    switch(style) {
      case 'left':
      case 'top':
      case 'right':
      case 'bottom':
        if (Element._getStyle(element, 'position') == 'static') return null;
      default: return Element._getStyle(element, style);
    }
  };
}
else if (Prototype.Browser.IE) {
  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset'+style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      style.filter = filter.replace(/alpha\([^\)]*\)/gi,'');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  // IE is missing .innerHTML support for TABLE-related elements
  Element.Methods.update = function(element, html) {
    element = $(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    var tagName = element.tagName.toUpperCase();
    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
      var div = document.createElement('div');
      switch (tagName) {
        case 'THEAD':
        case 'TBODY':
          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
          depth = 2;
          break;
        case 'TR':
          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
          depth = 3;
          break;
        case 'TD':
          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
          depth = 4;
      }
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      depth.times(function() { div = div.firstChild });
      $A(div.childNodes).each(function(node) { element.appendChild(node) });
    } else {
      element.innerHTML = html.stripScripts();
    }
    setTimeout(function() { html.evalScripts() }, 10);
    return element;
  }
}
else if (Prototype.Browser.Gecko) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

Element._attributeTranslations = {
  names: {
    colspan:   "colSpan",
    rowspan:   "rowSpan",
    valign:    "vAlign",
    datetime:  "dateTime",
    accesskey: "accessKey",
    tabindex:  "tabIndex",
    enctype:   "encType",
    maxlength: "maxLength",
    readonly:  "readOnly",
    longdesc:  "longDesc"
  },
  values: {
    _getAttr: function(element, attribute) {
      return element.getAttribute(attribute, 2);
    },
    _flag: function(element, attribute) {
      return $(element).hasAttribute(attribute) ? attribute : null;
    },
    style: function(element) {
      return element.style.cssText.toLowerCase();
    },
    title: function(element) {
      var node = element.getAttributeNode('title');
      return node.specified ? node.nodeValue : null;
    }
  }
};

(function() {
  Object.extend(this, {
    href: this._getAttr,
    src:  this._getAttr,
    disabled: this._flag,
    checked:  this._flag,
    readonly: this._flag,
    multiple: this._flag
  });
}).call(Element._attributeTranslations.values);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    var t = Element._attributeTranslations, node;
    attribute = t.names[attribute] || attribute;
    node = $(element).getAttributeNode(attribute);
    return node && node.specified;
  }
};

Element.Methods.ByTag = {};

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
 document.createElement('div').__proto__) {
  window.HTMLElement = {};
  window.HTMLElement.prototype = document.createElement('div').__proto__;
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || {});
  else {
    if (tagName.constructor == Array) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = {};
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    var cache = Element.extend.cache;
    for (var property in methods) {
      var value = methods[property];
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = cache.findOrStore(value);
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = {};
    window[klass].prototype = document.createElement(tagName).__proto__;
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (typeof klass == "undefined") continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;
};

var Toggle = { display: Element.toggle };

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(element);
    this.content = content.stripScripts();

    if (this.adjacency && this.element.insertAdjacentHTML) {
      try {
        this.element.insertAdjacentHTML(this.adjacency, this.content);
      } catch (e) {
        var tagName = this.element.tagName.toUpperCase();
        if (['TBODY', 'TR'].include(tagName)) {
          this.insertContent(this.contentFromAnonymousTable());
        } else {
          throw e;
        }
      }
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.insertContent([this.range.createContextualFragment(this.content)]);
    }

    setTimeout(function() {content.evalScripts()}, 10);
  },

  contentFromAnonymousTable: function() {
    var div = document.createElement('div');
    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
    return $A(div.childNodes[0].childNodes[0].childNodes);
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },

  insertContent: function(fragments) {
    fragments.reverse(false).each((function(fragment) {
      this.element.insertBefore(fragment, this.element.firstChild);
    }).bind(this));
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.appendChild(fragment);
    }).bind(this));
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment,
        this.element.nextSibling);
    }).bind(this));
  }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);
/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create();

Selector.prototype = {
  initialize: function(expression) {
    this.expression = expression.strip();
    this.compileMatcher();
  },

  compileMatcher: function() {
    // Selectors with namespaced attributes can't use the XPath version
    if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression))
      return this.compileXPathMatcher();

    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e]; return;
    }
    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(typeof c[i] == 'function' ? c[i](m) :
    	      new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le,  m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(typeof x[i] == 'function' ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
    return this.matcher(root);
  },

  match: function(element) {
    return this.findElements(document).include(element);
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
};

Object.extend(Selector, {
  _cache: {},

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: "[@#{1}]",
    attr: function(m) {
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (typeof h === 'function') return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
      'checked':     "[@checked]",
      'disabled':    "[@disabled]",
      'enabled':     "[not(@disabled)]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, m, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
    className:    'n = h.className(n, r, "#{1}", c); c = false;',
    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
    },
    pseudo:       function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s)/,
    attrPresence: /^\[([\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._counted = true;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._counted) {
          n._counted = true;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
	      if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      tagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() == tagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!nodes && root == document) return targetNode ? [targetNode] : [];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr) {
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._counted) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._counted) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled) results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv.startsWith(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
  },

  matchElements: function(elements, expression) {
    var matches = new Selector(expression).findElements(), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._counted) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (typeof expression == 'number') {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    var exprs = expressions.join(','), expressions = [];
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements, getHash) {
    var data = elements.inject({}, function(result, element) {
      if (!element.disabled && element.name) {
        var key = element.name, value = $(element).getValue();
        if (value != null) {
         	if (key in result) {
            if (result[key].constructor != Array) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return getHash ? data : Hash.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, getHash) {
    return Form.serializeElements(Form.getElements(form), getHash);
  },

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    return $(form).getElements().find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || {});

    var params = options.parameters;
    options.parameters = form.serialize(true);

    if (params) {
      if (typeof params == 'string') params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(form.readAttribute('action'), options);
  }
}

Object.extend(Form, Form.Methods);

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
}

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = {};
        pair[element.name] = value;
        return Hash.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
        !['button', 'reset', 'submit'].include(element.type)))
        element.select();
    } catch (e) {}
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.blur();
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
}

Object.extend(Form.Element, Form.Element.Methods);
Object.extend(Element.Methods.ByTag, {
  "FORM":     Object.clone(Form.Methods),
  "INPUT":    Object.clone(Form.Element.Methods),
  "SELECT":   Object.clone(Form.Element.Methods),
  "TEXTAREA": Object.clone(Form.Element.Methods)
});

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
      default:
        return Form.Element.Serializers.textarea(element);
    }
  },

  inputSelector: function(element) {
    return element.checked ? element.value : null;
  },

  textarea: function(element) {
    return element.value;
  },

  select: function(element) {
    return this[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
}

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $(element);
    this.callback  = callback;

    this.lastValue = this.getValue();
    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    var value = this.getValue();
    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
      ? this.lastValue != value : String(this.lastValue) != String(value));
    if (changed) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback.bind(this));
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return $(event.target || event.srcElement);
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
      (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    if (element){
	    if (element.removeEventListener) {
    		element.removeEventListener(name, observer, useCapture);
	    } else if (element.detachEvent) {
	      try {
	        element.detachEvent('on' + name, observer);
	      } catch (e) {}
	    }
	}
  }
});

/* prevent memory leaks in IE */
if (Prototype.Browser.IE)
  Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if(element.tagName=='BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent == document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!window.opera || element.tagName=='BODY') {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },

  absolutize: function(element) {
    element = $(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
  },

  relativize: function(element) {
    element = $(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (Prototype.Browser.WebKit) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}

Element.addMethods();


// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Buttons(Buttons.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

function goto_page(page, xid, target, fo) {
	var usefo
	if(fo)
		usefo = fo
	else
		usefo = 'basic display'
	setCookie('tab', '0', null, null, null, null, page + '_' + xid);
	if (target == 'parent')
		parent.location.href='display.asp?key=' + page + '&fo=' + usefo + '&rm=page&xID=' + xid
	else
		window.location.href='display.asp?key=' + page + '&fo=' + usefo + '&rm=page&xID=' + xid
	
}
function JS_on_switch_clear() {
	var cmds = document.getElementById('divUICommandBar')
	var form = cmds.getElementsByTagName('FORM')[0];
	//alert(form.innerHTML);
	var anchors = form.getElementsByTagName('A');
	for (var j=0; j < anchors.length; j++)
		if (anchors[j].getAttribute('nonstandard') == 'true') anchors[j].style.display = 'none';
	var anchors = form.getElementsByTagName('TABLE');
	for (var j=0; j < anchors.length; j++)
		if (anchors[j].getAttribute('nonstandard') == 'true') anchors[j].style.display = 'none';

}
function addButton_st(id) {
	var button = document.getElementById(id);
	if (!button) return;
	var cmds = document.getElementById('divUICommandBar')
	var form = cmds.getElementsByTagName('FORM')[0];
	//alert(form.innerHTML);
	var anchors = form.getElementsByTagName('A');
	var tables = form.getElementsByTagName('TABLE');
	for (var j=0; j < anchors.length; j++) //check for button already there
		if (anchors[j].id == id) {
			anchors[j].style.display = '';
			return;
		}
	for (var j=0; j < tables.length; j++) //check for button already there
		if (tables[j].id == id) {
			tables[j].style.display = '';
			return;
		}
	
	form.appendChild(button);
	button.style.display = '';
	button.setAttribute('nonstandard', 'true');
	//alert(form.innerHTML);
}
function hideButton_st(id) {
	var button = document.getElementById(id)
	if (!button) return;
	button.style.display = 'none';
}


// --END--	 -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file SelectDiv(SelectDiv.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

	
var menuOn = 0;
var menuClose = 0;
//var elapsed = new Date();
//document.onclick = new Function ("alert('tester')");
document.onclick = closeMenuV2;

function ShowMenuV2(imgcaller){
	//alert('smenuv2');
	var SelectDiv = document.getElementById(imgcaller.getAttribute('SelectDivID'));
	var inputfld = document.getElementById(imgcaller.getAttribute('InputID'));
	SelectDiv.setAttribute('targetid', imgcaller.getAttribute('InputID'));
	var divposleft = inputfld.parentNode.offsetLeft + inputfld.offsetLeft;
	if (SelectDiv.style.visibility == 'visible') {
		SelectDiv.style.visibility = 'hidden';
		return;
		}
	

	SelectDiv.style.visibility = 'hidden';
	//SelectDiv.style.top=(inputfld.offsetTop+inputfld.parentNode.offsetTop+20)+'px';
	//SelectDiv.style.left=divposleft+'px';


    var eP= inputfld;
    var dF= SelectDiv;
    var eL=0;var eT=0;
    for(var p=eP; p&&p.tagName!='BODY'; p=p.offsetParent){
      eL+=p.offsetLeft;
      eT+=p.offsetTop;
    }
    var eH=eP.offsetHeight;
    var dH=dF.style.pixelHeight;
    var sT=document.body.scrollTop;
    dF.style.left=eL+2;
    if(eT-dH >= sT && eT+eH+dH > document.body.clientHeight+sT)
      dF.style.top=eT-dH;
    else
      dF.style.top=eT+eH;

    dF.style.height=100;

	SelectDiv.style.visibility = 'visible';
	//SelectDiv.focus();
	menuOn = SelectDiv.id;
	menuClose = 0;
	var theEvent=window.event || arguments.callee.caller.arguments[0];
	theEvent.cancelBubble = true;
	return false;
}


function closeMenuV2(menuname)
{	//alert('cmenuv2  ' + menuClose + '  ' + menuOn);
if (menuClose = 1 )  {
	//alert('cmenuv2  ' + menuClose + '  ' + menuOn);
	if (menuOn != 0) {
		//alert('hide');
		document.getElementById(menuOn).style.visibility = 'hidden';
		menuOn = 0;
		menuClose = 0;
		return false;
		}
	}
}


function setValV2(ASELID, sBoundText, sDisplayText)
{	//alert('svalv2');
	var targetid = document.getElementById(ASELID).getAttribute('targetid');
	document.getElementById(targetid).value = sDisplayText
	document.getElementById(targetid+'B').value = sBoundText
	//closeMenuV2(ASELID);
	//menuOn = 0;
	try {document.getElementById(targetid+'B').onchange(); }
  catch (e) {  }


}

function setValOnInput(InputElement)
{	
	var B_id = InputElement.getAttribute('ID')+'B';
	document.getElementById(B_id).value = InputElement.value
	try {document.getElementById(B_id).onchange(); }
  catch (e) {  }

}


function test(vvv)
{ //alert('test');
	menuClose= 1;
}


	

// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file insert(insert.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

function insertAdjacentElement(obj,where,parsedNode){
		switch (where){
		case 'beforeBegin':
			obj.parentNode.insertBefore(parsedNode,obj)
			break;
		case 'afterBegin':
			obj.insertBefore(parsedNode,obj.firstChild);
			break;
		case 'beforeEnd':
			obj.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if (obj.nextSibling) 
			obj.parentNode.insertBefore(parsedNode,obj.nextSibling);
			else obj.parentNode.appendChild(parsedNode);
			break;
		}
}

function FindParentNode(obj, nodeToFind){
	
	 var node = obj.parentNode;
    while (node && node.nodeName.toUpper != "BODY")
    {
				if (node.nodeName == nodeToFind)
        {
            return node;
        }
        node = node.parentNode;
    }
    return null;
}

function ReapplyStyles(obj){

	var tbody;
	var trclass;
	

	tbody = obj.parentNode;
	for (var i=0;i<tbody.childNodes.length;i++){
			trclass = tbody.childNodes(i).className;
			if (trclass == "even" || trclass == "odd"){
					if (i % 2 == 1){
						tbody.childNodes(i).className = "odd";
					}
					else {
						tbody.childNodes(i).className = "even";
					}
			}
			else
				break;
	}	

}

function InsertRow(obj, nodeToFind, whereToInsert){

	var entry = FindParentNode(obj, nodeToFind);
	var newRow;
	var pkg;
	var hiddenpkg='';
	var nonhidden = 0;
	var inputid;
	var imgid;
	var tmp;
	var tmp2;
	var rand=Math.floor(Math.random()*100001)
	var bFirstInput;
  var newpkg='';

	bFirstInput = true;

//alert(entry.innerHTML);
	insertAdjacentElement(entry, whereToInsert, newRow = entry.cloneNode(true));

	//var spans = newRow.getElementsByTagName('SPAN');
	var inputs = newRow.getElementsByTagName('INPUT');
	var imgs = newRow.getElementsByTagName('IMG');
	
 for (var i =0; i < imgs.length; i++){
		try {
			// this is needed for select divs
			if (imgs[i].getAttribute('InputID').indexOf('INPUT') > -1){
					imgid = imgs[i].getAttribute('InputID');
					imgs[i].setAttribute("InputID",imgid+'_'+rand)
			}
		}
		catch (error) {
		}
	}

	for (var j=0; j < inputs.length; j++){ 
		var new_id = inputs[j].getAttribute('RecID') + rand;

			// this condition is needed for select divs
			if (inputs[j].getAttribute('ID').indexOf('INPUT') > -1){
					inputid = inputs[j].getAttribute('ID');
					if (inputid.indexOf('B') > -1){
						tmp = inputid.replace("B", '_' + rand + 'B');
						inputs[j].id = 'n_e_w' + tmp;
						inputs[j].setAttribute('RecID', 'n_e_w' + new_id);
					}
					else{
						inputs[j].id = 'n_e_w' + inputid+'_'+rand
					}
			} else {
				
				inputs[j].id = 'n_e_w' + new_id;
				inputs[j].setAttribute('RecID', 'n_e_w' + new_id);
			}

			// end of select div condition

			if (inputs[j].getAttribute('type') == "hidden"){
					try{
						// this is needed for popups
						if (inputs[j].getAttribute('popup') == "yes"){
								inputid = inputs[j].getAttribute('ID');
								inputs[j].setAttribute('Changed',0);
								inputs[j].id = 'n_e_w' + inputs[j].getAttribute('ID') + rand
								inputs[j].name = inputs[j].name + rand
								inputs[j].parentNode.childNodes(2).innerHTML = 'None ';
								inputs[j].parentNode.childNodes(2).id = inputs[j].parentNode.childNodes(2).getAttribute('ID') + rand
								inputs[j].parentNode.childNodes(2).setAttribute('onclick', "");
								tmp = inputid + rand
								inputs[j].parentNode.childNodes(3).setAttribute('pid',tmp);
						}
						else{
								inputs[j].setAttribute("Changed",1);
						}
					}
					catch (error) {}
				
			}
			else{
				inputs[j].value = '';
			}	

			if (inputs[j].getAttribute('pkg')){
				if (inputs[j].getAttribute('pkg').indexOf('Job') > 0) inputs[j].value = '';
					newpkg = inputs[j].getAttribute('pkg');
					inputs[j].setAttribute('new', 'yes');
					FlagChangeV2(inputs[j]);
			}


	
	 
	}
	
	for (var x=0; x < inputs.length; x++){ 
			if (inputs[x].getAttribute('first') == "yes"){
					inputs[x].setAttribute("Changed",1);
					inputs[x].setAttribute('new', 'yes');
					inputs[x].setAttribute('pkg',newpkg);
					
			}
	}
	
	ReapplyStyles(newRow);
}


// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file custom(custom.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

function CalcTime(obj){
	
	var hours = document.getElementsByName('calchr');
	var elID = obj.getAttribute('ID');
	var hoursID;
	var pnode = FindParentNode(obj,'TR');
	var total = 0;
	var prevNode;
	var prevNodeInput;
	var prevNodeInputID;
	var prevNodeInputNode;
	var RecID = obj.getAttribute('RecID');
	var Resource = 0;
	var ResourceID = 'Resource_' + RecID;
	var SumID = '';
	total = eval(obj.value);
	if (pnode.previousSibling){

		prevNode = pnode.previousSibling.getElementsByTagName('td');
		prevNodeInput = pnode.previousSibling.getElementsByTagName('input');
		for (var k =0;k<prevNodeInput.length;k++){
			if (prevNodeInput[k].getAttribute('name').substr(0,6) == "calchr"){
					prevNodeInputNode = prevNodeInput[k];
					RecID = prevNodeInput[k].getAttribute('RecID');
					ResourceID = 'Resource_' + RecID;
					alert('Yes');
			}
			if (prevNodeInput[k].getAttribute('name') == ResourceID) {
				Resource = prevNodeInput[k].getAttribute('value');
				alert('Resource = ' + Resource);
			}
			alert(prevNodeInput[k].getAttribute('name'));
		}
		prevNodeInputID = prevNodeInputNode.getAttribute('ID');
		
		SumID = 'sumhr_' + Resource;
		for (var i=0;i<prevNode.length;i++){
				if (prevNode[i].getAttribute('tdname') == "sumhr"  && prevNodeInputID == elID){
					for (var j=0;j<hours.length;j++){
							hoursID = hours[j].getAttribute('ID');
							if (hoursID == elID){
										total += eval(hours[j].value);
							}
					}
					total = RoundOff(total - eval(obj.value),2);
				}
		}
		for (var i=0;i<prevNode.length;i++){
			if (prevNode[i].getAttribute('name') == 'calchr_' + Resource){
				total += eval(prevNode[i].value);
				alert('Hours : ' + total);
			}
			if (prevNode[i].getAttribute('tdname') == SumID) {
				prevNode[i].innerHTML = total;
			}
		}
	}	

}

function ClearPrevTime(node,elID){
	var prevNode;
	var prevNodeInput;
	var prevNodeInputNode;

	if (node.previousSibling){
			prevNode = node.previousSibling.getElementsByTagName('td');
			prevNodeInput = node.previousSibling.getElementsByTagName('input');
			for (var k =0;k<prevNodeInput.length;k++){
				if (prevNodeInput[k].getAttribute('name').substr(0,6) == "calchr"){
					prevNodeInputNode = prevNodeInput[k];
				}
			}
			prevNodeInputID = prevNodeInputNode.getAttribute('ID');
			for (var i=0;i<prevNode.length;i++){
				if (prevNode[i].getAttribute('tdname').substr(0,5) == "sumhr" && prevNodeInputID == elID){
					prevNode[i].innerHTML = "&nbsp;";
					//prevNode[i].style.visibility = 'hidden';
				}
			}
	}
}

function SetTime(node,total, elID){
	//alert(node.innerHTML);
	ClearPrevTime(node, elID);
	var sumflds = node.getElementsByTagName('td');
	for (var i=0;i<sumflds.length;i++){
			if (sumflds[i].getAttribute('tdname').substr(0,5) == "sumhr"){
					sumflds[i].innerHTML = total;
			}
	}

}


function RoundOff(value, precision) {
	value = "" + value;
	precision = parseInt(precision);
	var whole = "" + Math.round(value * Math.pow(10, precision));
	var decPoint = whole.length - precision;
	if(decPoint != 0) {
		result = whole.substring(0, decPoint);
		result += ".";
		result += whole.substring(decPoint, whole.length);
	}
	else {
		result = whole;
	}
	return result;
}


function CalcTimeV2(obj){
	var total = 0; //eval(obj.value);
	var MyName = obj.name;
	var Resource = MyName.substr(7,MyName.length-7)
	var totflds = document.getElementsByTagName('td');
	var sums = 'sumhr_' + Resource;
	var nextX = 0;
	var sumflds = document.getElementsByTagName('INPUT');
	for (var i=0;i<sumflds.length;i++){
			if (sumflds[i].getAttribute('name') == MyName){
					total += eval(sumflds[i].value);
			}
	}
	
	for (var i=0;i<totflds.length;i++){
			if (totflds[i].getAttribute('tdname') == sums ){
					if (nextX > 0 ) {
						totflds[nextX].innerHTML = '&nbsp;'
					}
					totflds[i].innerHTML = total;
					nextX = i;
			}
	}
}




// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Calendarevents(Calendarevents.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


var calendar = null; // remember the calendar object so that we reuse it and
											// avoid creation other calendars.

// This function gets called when the end-user clicks on some date.
function selected(cal, date) 
{
	cal.sel.value = date; // just update the date in the input field.
	if (cal.selDay)
		cal.selDay.value = date.substr(0,date.indexOf(' '));
	date = date.substr(date.indexOf(' ')+1,date.length);
	if (cal.selMonth)
		cal.selMonth.selectedIndex = date.substr(0,date.indexOf(' '))-1;
	date = date.substr(date.indexOf(' ')+1,date.length);
	cal.selYear.value = date;

	//alert(cal.selYear.getAttribute("id"));
	//var oc = ''+cal.selYear.onchange;
	try {
		cal.selYear.onchange();
	} catch (error) {	}

	//if (cal.sel.id == "startdate" || cal.sel.id == "enddate")
		// if we add this call we close the calendar on single-click.
		// just to exemplify both cases, we are using this only for the 1st
		// and the 3rd field, while 2nd and 4th will still require double-click.
		cal.callCloseHandler();

}

// And this gets called when the end-user clicks on the _selected_ date,
// or clicks on the "Close" button.  It just hides the calendar without
// destroying it.
function closeHandler(cal) 
{
	cal.hide();                        // hide the calendar

	// don't check mousedown on document anymore (used to be able to hide the
	// calendar when someone clicks outside it, see the showCalendar function).
	Calendar.removeEvent(document, "mousedown", checkCalendar);
}

// This gets called when the user presses a mouse button anywhere in the
// document, if the calendar is shown.  If the click was outside the open
// calendar this function closes it.
function checkCalendar(ev) 
{
  var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
  for (; el != null; el = el.parentNode)
    // FIXME: allow end-user to click some link without closing the
    // calendar.  Good to see real-time stylesheet change :)
    if (el == calendar.element || el.tagName == "A") break;
  if (el == null) {
    // calls closeHandler which should hide the calendar.
    calendar.callCloseHandler();
    Calendar.stopEvent(ev);
  }
}

// This function shows the calendar under the element having the given id.
// It takes care of catching "mousedown" signals on document and hiding the
// calendar if the click was outside.
function showCalendar(id, dayId, monthId, yearId, format) 
{
  //alert(id);
  //alert(dayId);
  if (document.getElementById(id) == null) {
	  el = id;
	//var aElements = document.getElementsByName('Val'+id);
	//alert(aElements.length);
  }
  else {
	  //alert(document.getElementById(id));
	  var el = document.getElementById(id);
  }
    
  
  if (calendar != null) 
  {
    // we already have some calendar created
    calendar.hide();                 // so we hide it first.
  } 
  else 
  {
    // first-time call, create the calendar.
    var cal = new Calendar(false, null, selected, closeHandler);
    calendar = cal;                  // remember it in the global var
    cal.setRange(1995, 2030);        // min/max year allowed.
    cal.create();
  }
  calendar.setDateFormat(format);    // set the specified date format
  if (el.value == '') {
			var dt = new Date();
			var m = dt.getMonth();
			var d = dt.getDate();
			var y = dt.getFullYear();
			var fulldate = m+'/'+d+'/'+y;
			calendar.parseDate(fulldate);
			calendar.setDate(dt);
			
  }
	else{
		  calendar.parseDate(el.value);      // try to parse the text in field
	}

  calendar.sel = el;                 // inform it what input field we use
  try {
	if (document.getElementById(dayId))
		calendar.selDay = document.getElementById(dayId);
	if (document.getElementById(monthId))
		calendar.selMonth = document.getElementById(monthId);
	if (document.getElementById(yearId))
		calendar.selYear = document.getElementById(yearId);
	else
		calendar.selYear = el;
  } catch (error) {	}

  calendar.showAtElement(el);        // show the calendar below it
  Calendar.addEvent(document, "mousedown", checkCalendar);

  return false;
}

var MINUTE = 60 * 1000;
var HOUR = 60 * MINUTE;
var DAY = 24 * HOUR;
var WEEK = 7 * DAY;


function isDisabled(date) 
{
	return false;
}


// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Calendar(Calendar.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

/** The Calendar object constructor. */
Calendar = function (mondayFirst, dateStr, onSelected, onClose) {
	// member variables
	this.activeDiv = null;
	this.currentDateEl = null;
	this.checkDisabled = null;
	this.timeout = null;
	this.onSelected = onSelected || null;
	this.onClose = onClose || null;
	this.dragging = false;
	this.minYear = 1920;
	this.maxYear = 2020;
	this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
	this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
	this.isPopup = true;
	this.mondayFirst = mondayFirst;
	this.dateStr = dateStr;
	// HTML elements
	this.table = null;
	this.element = null;
	this.tbody = null;
	this.daynames = null;
	// Combo boxes
	this.monthsCombo = null;
	this.yearsCombo = null;
	this.hilitedMonth = null;
	this.activeMonth = null;
	this.hilitedYear = null;
	this.activeYear = null;

	// one-time initializations
	if (!Calendar._DN3) {
		// table of short day names
		var ar = new Array();
		for (var i = 8; i > 0;) {
			ar[--i] = Calendar._DN[i].substr(0, 3);
		}
		Calendar._DN3 = ar;
		// table of short month names
		ar = new Array();
		for (var i = 12; i > 0;) {
			ar[--i] = Calendar._MN[i].substr(0, 3);
		}
		Calendar._MN3 = ar;
	}
};

// ** constants

/// "static", needed for event handlers.
Calendar._C = null;

/// detect a special case of "web browser"
Calendar.is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
		   (navigator.userAgent.toLowerCase().indexOf("opera") == -1) );

// short day names array (initialized at first constructor call)
Calendar._DN3 = null;

// short month names array (initialized at first constructor call)
Calendar._MN3 = null;

// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
//        library, at some point.

Calendar.getAbsolutePos = function(el) {
	var r = { x: el.offsetLeft, y: el.offsetTop };
	if (el.offsetParent) {
		var tmp = Calendar.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

Calendar.isRelated = function (el, evt) {
	var related = evt.relatedTarget;
	if (!related) {
		var type = evt.type;
		if (type == "mouseover") {
			related = evt.fromElement;
		} else if (type == "mouseout") {
			related = evt.toElement;
		}
	}
	while (related) {
		if (related == el) {
			return true;
		}
		related = related.parentNode;
	}
	return false;
};

Calendar.removeClass = function(el, className) {
	if (!(el && el.className)) {
		return;
	}
	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0;) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};

Calendar.addClass = function(el, className) {
	el.className += " " + className;
};

Calendar.getElement = function(ev) {
	if (Calendar.is_ie) {
		return window.event.srcElement;
	} else {
		return ev.currentTarget;
	}
};

Calendar.getTargetElement = function(ev) {
	if (Calendar.is_ie) {
		return window.event.srcElement;
	} else {
		return ev.target;
	}
};

Calendar.stopEvent = function(ev) {
	if (Calendar.is_ie) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
};

Calendar.addEvent = function(el, evname, func) {
	if (Calendar.is_ie) {
		el.attachEvent("on" + evname, func);
	} else {
		el.addEventListener(evname, func, true);
	}
};

Calendar.removeEvent = function(el, evname, func) {
	if (Calendar.is_ie) {
		el.detachEvent("on" + evname, func);
	} else {
		el.removeEventListener(evname, func, true);
	}
};

Calendar.createElement = function(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};

// END: UTILITY FUNCTIONS

// BEGIN: CALENDAR STATIC FUNCTIONS

/** Internal -- adds a set of events to make some element behave like a button. */
Calendar._add_evs = function(el) {
	with (Calendar) {
		addEvent(el, "mouseover", dayMouseOver);
		addEvent(el, "mousedown", dayMouseDown);
		addEvent(el, "mouseout", dayMouseOut);
		if (is_ie) {
			addEvent(el, "dblclick", dayMouseDblClick);
			el.setAttribute("unselectable", true);
		}
	}
};

Calendar.findMonth = function(el) {
	if (typeof el.month != "undefined") {
		return el;
	} else if (typeof el.parentNode.month != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.findYear = function(el) {
	if (typeof el.year != "undefined") {
		return el;
	} else if (typeof el.parentNode.year != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.showMonthsCombo = function () {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var mc = cal.monthsCombo;
	if (cal.hilitedMonth) {
		Calendar.removeClass(cal.hilitedMonth, "hilite");
	}
	if (cal.activeMonth) {
		Calendar.removeClass(cal.activeMonth, "active");
	}
	var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
	Calendar.addClass(mon, "active");
	cal.activeMonth = mon;
	mc.style.left = cd.offsetLeft;
	mc.style.top = cd.offsetTop + cd.offsetHeight;
	mc.style.display = "block";
};

Calendar.showYearsCombo = function (fwd) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var yc = cal.yearsCombo;
	if (cal.hilitedYear) {
		Calendar.removeClass(cal.hilitedYear, "hilite");
	}
	if (cal.activeYear) {
		Calendar.removeClass(cal.activeYear, "active");
	}
	cal.activeYear = null;
	var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
	var yr = yc.firstChild;
	var show = false;
	for (var i = 12; i > 0; --i) {
		if (Y >= cal.minYear && Y <= cal.maxYear) {
			yr.firstChild.data = Y;
			yr.year = Y;
			yr.style.display = "block";
			show = true;
		} else {
			yr.style.display = "none";
		}
		yr = yr.nextSibling;
		Y += fwd ? 2 : -2;
	}
	if (show) {
		yc.style.left = cd.offsetLeft;
		yc.style.top = cd.offsetTop + cd.offsetHeight;
		yc.style.display = "block";
	}
};

// ------- event handlers ---------

Calendar.tableMouseUp = function(ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	if (cal.timeout) {
		clearTimeout(cal.timeout);
	}
	var el = cal.activeDiv;
	if (!el) {
		return false;
	}
	var target = Calendar.getTargetElement(ev);
	Calendar.removeClass(el, "active");
	if (target == el || target.parentNode == el) {
		Calendar.cellClick(el);
	}
	var mon = Calendar.findMonth(target);
	var date = null;
	if (mon) {
		date = new Date(cal.date);
		if (mon.month != date.getMonth()) {
			date.setMonth(mon.month);
			cal.setDate(date);
		}
	} else {
		var year = Calendar.findYear(target);
		if (year) {
			date = new Date(cal.date);
			if (year.year != date.getFullYear()) {
				date.setFullYear(year.year);
				cal.setDate(date);
			}
		}
	}
	with (Calendar) {
		removeEvent(document, "mouseup", tableMouseUp);
		removeEvent(document, "mouseover", tableMouseOver);
		removeEvent(document, "mousemove", tableMouseOver);
		cal._hideCombos();
		stopEvent(ev);
		_C = null;
	}
};

Calendar.tableMouseOver = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return;
	}
	var el = cal.activeDiv;
	var target = Calendar.getTargetElement(ev);
	if (target == el || target.parentNode == el) {
		Calendar.addClass(el, "hilite active");
	} else {
		Calendar.removeClass(el, "active");
		Calendar.removeClass(el, "hilite");
	}
	var mon = Calendar.findMonth(target);
	if (mon) {
		if (mon.month != cal.date.getMonth()) {
			if (cal.hilitedMonth) {
				Calendar.removeClass(cal.hilitedMonth, "hilite");
			}
			Calendar.addClass(mon, "hilite");
			cal.hilitedMonth = mon;
		} else if (cal.hilitedMonth) {
			Calendar.removeClass(cal.hilitedMonth, "hilite");
		}
	} else {
		var year = Calendar.findYear(target);
		if (year) {
			if (year.year != cal.date.getFullYear()) {
				if (cal.hilitedYear) {
					Calendar.removeClass(cal.hilitedYear, "hilite");
				}
				Calendar.addClass(year, "hilite");
				cal.hilitedYear = year;
			} else if (cal.hilitedYear) {
				Calendar.removeClass(cal.hilitedYear, "hilite");
			}
		}
	}
	Calendar.stopEvent(ev);
};

Calendar.tableMouseDown = function (ev) {
	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
		Calendar.stopEvent(ev);
	}
};

Calendar.calDragIt = function (ev) {
	var cal = Calendar._C;
	if (!(cal && cal.dragging)) {
		return false;
	}
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posX = ev.pageX;
		posY = ev.pageY;
	}
	cal.hideShowCovered();
	var st = cal.element.style;
	st.left = (posX - cal.xOffs) + "px";
	st.top = (posY - cal.yOffs) + "px";
	Calendar.stopEvent(ev);
};

Calendar.calDragEnd = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	cal.dragging = false;
	with (Calendar) {
		removeEvent(document, "mousemove", calDragIt);
		removeEvent(document, "mouseover", stopEvent);
		removeEvent(document, "mouseup", calDragEnd);
		tableMouseUp(ev);
	}
	cal.hideShowCovered();
};

Calendar.dayMouseDown = function(ev) 
{
	var el = Calendar.getElement(ev);
	if (el.disabled) 
	{
		return false;
	}
	
	var cal = el.calendar;
	cal.activeDiv = el;
	Calendar._C = cal;
	if (el.navtype != 300 && el.navtype != 320) 
	{
	with (Calendar) 
		{
			addClass(el, "hilite active");
			addEvent(document, "mouseover", tableMouseOver);
			addEvent(document, "mousemove", tableMouseOver);
			addEvent(document, "mouseup", tableMouseUp);
		}
	} 
	else if (cal.isPopup) 
	{
		cal._dragStart(ev);
	}
	Calendar.stopEvent(ev);
	
	if (el.navtype == -1 || el.navtype == 1) 
	{
		cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
	} else if (el.navtype == -2 || el.navtype == 2) 
	{
		cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
	} else 
	{
		cal.timeout = null;
	}
	//alert('print');
};

Calendar.dayMouseDblClick = function(ev) {
	Calendar.cellClick(Calendar.getElement(ev));
	if (Calendar.is_ie) {
		document.selection.empty();
	}
};

Calendar.dayMouseOver = function(ev) {
	var el = Calendar.getElement(ev);
	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
		return false;
	}
	if (el.ttip) {
		if (el.ttip.substr(0, 1) == "_") {
			var date = null;
			with (el.calendar.date) {
				date = new Date(el.year, el.month, el.caldate);
			}
			el.ttip = date.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
		}
		el.calendar.tooltips.firstChild.data = el.ttip;
	}
	if (el.navtype != 300) {
		Calendar.addClass(el, "hilite");
	}
	Calendar.stopEvent(ev);
};

Calendar.dayMouseOut = function(ev) {
	with (Calendar) {
		var el = getElement(ev);
		if (isRelated(el, ev) || _C || el.disabled) {
			return false;
		}
		removeClass(el, "hilite");
		el.calendar.tooltips.firstChild.data = _TT["SEL_DATE"];
		stopEvent(ev);
	}
};

/**
 *  A generic "click" handler :) handles all types of buttons defined in this
 *  calendar.
 */
Calendar.cellClick = function(el) {
	var cal = el.calendar;
	var closing = false;
	var newdate = false;
	var date = null;
	if (typeof el.navtype == "undefined") 
	{
		Calendar.removeClass(cal.currentDateEl, "selected");
		Calendar.addClass(el, "selected");
		closing = (cal.currentDateEl == el);
		if (!closing) 
		{
			cal.currentDateEl = el;
		}
		cal.date = new Date(el.year, el.month, el.caldate);
		date = cal.date;
		newdate = true;
		//alert('print');
		cal.callCloseHandler();	//added to auto close
	} 
	else 
	{
		if (el.navtype == 200) 
		{
			Calendar.removeClass(el, "hilite");
			cal.callCloseHandler();
			return;
		}
		date = (el.navtype == 0) ? new Date() : new Date(cal.date);
		var year = date.getFullYear();
		var mon = date.getMonth();
		var setMonth = function (mon) 
		{
			var currmonth = date.getMonth();
			var tempdate = new Date(date.getYear(),mon, 1);
				
			var day = date.getDate();
			var max = tempdate.getMonthDays();			
			if (day > max) 
			{
				date.setDate(max);
			}
			date.setMonth(mon);
		};
		switch (el.navtype) 
		{
		    case -2:
			if (year > cal.minYear) 
			{
				date.setFullYear(year - 1);
			}
			break;
		    case -1:
			if (mon > 0) 
			{
				setMonth(mon - 1);
			} 
			else if (year-- > cal.minYear) 
			{
				date.setFullYear(year);
				setMonth(11);
			}
			break;
		    case 1:
			if (mon < 11) 
			{
				setMonth(mon + 1);
			} 
			else if (year < cal.maxYear) 
			{
				date.setFullYear(year + 1);
				setMonth(0);
			}
			break;
		    case 2:
			if (year < cal.maxYear) 
			{
				date.setFullYear(year + 1);
			}
			break;
		    case 100:
			cal.setMondayFirst(!cal.mondayFirst);
			return;
			case 0:
			cal.setDate(date);
			return;
			break;
			
		}
		
		if (!date.equalsTo(cal.date)) 
		{
			cal.setDate(date);
			newdate = el.navtype == 0;
		}
	}
	if (newdate) 
	{
		cal.callHandler();
	}
	if (closing) 
	{
		Calendar.removeClass(el, "hilite");
		cal.callCloseHandler();
	}
};

// END: CALENDAR STATIC FUNCTIONS

// BEGIN: CALENDAR OBJECT FUNCTIONS

/**
 *  This function creates the calendar inside the given parent.  If _par is
 *  null than it creates a popup calendar inside the BODY element.  If _par is
 *  an element, be it BODY, then it creates a non-popup calendar (still
 *  hidden).  Some properties need to be set before calling this function.
 */
Calendar.prototype.create = function (_par) {
	var parent = null;
	if (! _par) {
		// default parent is the document body, in which case we create
		// a popup calendar.
		parent = document.getElementsByTagName("body")[0];
		this.isPopup = true;
	} else {
		parent = _par;
		this.isPopup = true;
	}
	
	this.date = this.dateStr ? new Date(this.dateStr) : new Date();

	var table = Calendar.createElement("table");
	this.table = table;
	table.cellSpacing = 0;
	table.cellPadding = 0;
	table.calendar = this;
	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);

	var div = Calendar.createElement("div");
	this.element = div;
	div.className = "calendar";
	if (this.isPopup) {
		div.style.position = "absolute";
		div.style.display = "none";
		div.style.zIndex = 10000;
	}
	div.appendChild(table);

	var thead = Calendar.createElement("thead", table);
	var cell = null;
	var row = null;

	var cal = this;
	var hh = function (text, cs, navtype) {
		cell = Calendar.createElement("td", row);
		cell.colSpan = cs;
		cell.className = "cal_button";
		Calendar._add_evs(cell);
		cell.calendar = cal;
		cell.navtype = navtype;
		if (text.substr(0, 1) != "&") {
			cell.appendChild(document.createTextNode(text));
		}
		else {
			// FIXME: dirty hack for entities
			cell.innerHTML = text;
		}
		return cell;
	};

	row = Calendar.createElement("tr", thead);
	row.className = "headrow";

	hh("-", 1, 100).ttip = Calendar._TT["TOGGLE"];
	this.title = hh("", this.isPopup ? 5 : 6, 320);
	this.title.className = "title";
	if (this.isPopup) {
		this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
		this.title.style.cursor = "move";
		hh("X", 1, 200).ttip = Calendar._TT["CLOSE"];
	}

	row = Calendar.createElement("tr", thead);
	row.className = "headrow";

	hh("&#x00ab;", 1, -2).ttip = Calendar._TT["PREV_YEAR"];
	hh("&#x2039;", 1, -1).ttip = Calendar._TT["PREV_MONTH"];
	hh(Calendar._TT["TODAY"], 3, 0).ttip = Calendar._TT["GO_TODAY"];
	hh("&#x203a;", 1, 1).ttip = Calendar._TT["NEXT_MONTH"];
	hh("&#x00bb;", 1, 2).ttip = Calendar._TT["NEXT_YEAR"];

	// day names
	row = Calendar.createElement("tr", thead);
	row.className = "daynames";
	this.daynames = row;
	for (var i = 7; i > 0; --i) {
		cell = Calendar.createElement("td", row);
		cell.appendChild(document.createTextNode(""));
		if (!i) {
			cell.navtype = 100;
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}
	this._displayWeekdays();

	var tbody = Calendar.createElement("tbody", table);
	this.tbody = tbody;

	for (i = 6; i > 0; --i) {
		row = Calendar.createElement("tr", tbody);
		for (var j = 7; j > 0; --j) {
			cell = Calendar.createElement("td", row);
			cell.appendChild(document.createTextNode(""));
			cell.calendar = this;
			cell.month = 1;
			cell.day = 1;
			cell.year = 1;
			Calendar._add_evs(cell);
		}
	}

	var tfoot = Calendar.createElement("tfoot", table);

	row = Calendar.createElement("tr", tfoot);
	row.className = "footrow";

	cell = hh(Calendar._TT["SEL_DATE"], 7, 300);
	cell.className = "ttip";
	if (this.isPopup) {
		cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
		cell.style.cursor = "move";
	}
	this.tooltips = cell;

	div = Calendar.createElement("div", this.element);
	this.monthsCombo = div;
	div.className = "combo";
	for (i = 0; i < Calendar._MN.length; ++i) {
		var mn = Calendar.createElement("div");
		mn.className = "label";
		mn.month = i;
		mn.appendChild(document.createTextNode(Calendar._MN3[i]));
		div.appendChild(mn);
	}

	div = Calendar.createElement("div", this.element);
	this.yearsCombo = div;
	div.className = "combo";
	for (i = 12; i > 0; --i) {
		var yr = Calendar.createElement("div");
		yr.className = "label";
		yr.appendChild(document.createTextNode(""));
		div.appendChild(yr);
	}

	this._init(this.mondayFirst, this.date);
	parent.appendChild(this.element);
};

/**
 *  (RE)Initializes the calendar to the given date and style (if mondayFirst is
 *  true it makes Monday the first day of week, otherwise the weeks start on
 *  Sunday.
 */
Calendar.prototype._init = function (mondayFirst, date) 
{
	
	
	
	var today = new Date();
	var selectedDate = new Date(date);
	var year = date.getFullYear();
	

	if (year < this.minYear) 
	{
		year = this.minYear;
		date.setFullYear(year);
	} 
	else if (year > this.maxYear)
	{
		year = this.maxYear;
		date.setFullYear(year);
	}
	
	this.mondayFirst = mondayFirst;
	
	this.date = new Date(date);
	var month = date.getMonth();
	var mday = date.getDate();
	

	var no_days = date.getMonthDays();

	var MON = mondayFirst ? 0 : 1;
	var SAT = mondayFirst ? 5 : 6;
	var SUN = mondayFirst ? 6 : 0;

	// get the day of the week
	// for this day
	// 0 == sunday
	
	date.setDate(1);
	var wday = date.getDay();
	
	// shift the date to sunday
	var newDay = 1-wday;
	
	if (mondayFirst) newDay = (wday==0)?-6:2-wday;
		
	date.setDate(newDay);
	
	var iday = date.getDate();
	wday = 0;
	
	// 
	var row = this.tbody.firstChild;
	var MN = Calendar._MN3[month];
	var todayDate = today.getDate();
	
	for (var i = 0; i < 6; ++i) 
	{
		var cell = row.firstChild;
		row.className = "daysrow";
		for (var j = 0; j < 7; ++j) 
		{
			cell.firstChild.data = iday;
			
			if (month == date.getMonth())
				cell.className = "day";
			else
				cell.className = "other";
				
			cell.disabled = false;
			if (typeof this.checkDisabled == "function") 
			{
				date.setDate(iday);
				if (this.checkDisabled(date)) 
				{
					cell.className += " disabled";
					cell.disabled = true;
				}
			}
			if (!cell.disabled) 
			{
				cell.caldate = iday;
				cell.year = date.getFullYear();
				cell.month = date.getMonth();
				cell.ttip = "_";
				
				if (date.getDate() == this.date.getDate() 
								&& date.getMonth() == this.date.getMonth()
								&& date.getFullYear() == this.date.getFullYear()) 
				{
					cell.className += " selected";
					this.currentDateEl = cell;
				}
				
				if (((today.getFullYear() == date.getFullYear()) 
									&& (today.getMonth() == date.getMonth()))
									 && (today.getDate() == date.getDate())) 
				{
					cell.className += " today";
					cell.ttip += Calendar._TT["PART_TODAY"];
				}
				if (wday == SAT || wday == SUN) 
				{
					cell.className += " weekend";
				}
			}
			
			iday=iday+1;
			date.setDate(iday);
			// might have gone to next month
			iday=date.getDate();
			((++wday) ^ 7) || (wday = 0);
			cell = cell.nextSibling;
		}
		row = row.nextSibling;
	}
	this.title.firstChild.data = Calendar._MN[month] + ", " + year;
	// PROFILE
	// this.tooltips.firstChild.data = "Generated in " + ((new Date()) - today) + " ms";
};

/**
 *  Calls _init function above for going to a certain date (but only if the
 *  date is different than the currently selected one).
 */
Calendar.prototype.setDate = function (date) {
	if (!date.equalsTo(this.date)) {
		this._init(this.mondayFirst, date);
	}
};

/** Modifies the "mondayFirst" parameter (EU/US style). */
Calendar.prototype.setMondayFirst = function (mondayFirst) {
	this._init(mondayFirst, this.date);
	this._displayWeekdays();
};

/**
 *  Allows customization of what dates are enabled.  The "unaryFunction"
 *  parameter must be a function object that receives the date (as a JS Date
 *  object) and returns a boolean value.  If the returned value is true then
 *  the passed date will be marked as disabled.
 */
Calendar.prototype.setDisabledHandler = function (unaryFunction) {
	this.checkDisabled = unaryFunction;
};

/** Customization of allowed year range for the calendar. */
Calendar.prototype.setRange = function (a, z) {
	this.minYear = a;
	this.maxYear = z;
};

/** Calls the first user handler (selectedHandler). */
Calendar.prototype.callHandler = function () {
	if (this.onSelected) {
		this.onSelected(this, this.date.print(this.dateFormat));
	}
};

/** Calls the second user handler (closeHandler). */
Calendar.prototype.callCloseHandler = function () {
	if (this.onClose) {
		this.onClose(this);
	}
	this.hideShowCovered();
};

/** Removes the calendar object from the DOM tree and destroys it. */
Calendar.prototype.destroy = function () {
	var el = this.element.parentNode;
	el.removeChild(this.element);
	Calendar._C = null;
	delete el;
};

/**
 *  Moves the calendar element to a different section in the DOM tree (changes
 *  its parent).
 */
Calendar.prototype.reparent = function (new_parent) {
	var el = this.element;
	el.parentNode.removeChild(el);
	new_parent.appendChild(el);
};

/** Shows the calendar. */
Calendar.prototype.show = function () {
	this.element.style.display = "block";
	this.hideShowCovered();
};

/**
 *  Hides the calendar.  Also removes any "hilite" from the class of any TD
 *  element.
 */
Calendar.prototype.hide = function () {
	var trs = this.table.getElementsByTagName("td");
	for (var i = trs.length; i > 0; ) {
		Calendar.removeClass(trs[--i], "hilite");
	}
	this.element.style.display = "none";
};

/**
 *  Shows the calendar at a given absolute position (beware that, depending on
 *  the calendar element style -- position property -- this might be relative
 *  to the parent's containing rectangle).
 */
Calendar.prototype.showAt = function (x, y) {
	var s = this.element.style;
	s.left = x + "px";
	s.top = y + "px";
	this.show();
};

/** Shows the calendar near a given element. */
Calendar.prototype.showAtElement = function (el) {
	var p = Calendar.getAbsolutePos(el);
	this.showAt(p.x, p.y+ el.offsetHeight) ; //+ el.offsetHeight);
};

/** Customizes the date format. */
Calendar.prototype.setDateFormat = function (str) {
	this.dateFormat = str;
};

/** Customizes the tooltip date format. */
Calendar.prototype.setTtDateFormat = function (str) {
	this.ttDateFormat = str;
};

/**
 *  Tries to identify the date represented in a string.  If successful it also
 *  calls this.setDate which moves the calendar to the given date.
 */
Calendar.prototype.parseDate = function (str, fmt) {
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);
	if (!fmt) {
		fmt = this.dateFormat;
	}
	var b = fmt.split(/\W+/);
	var i = 0, j = 0;
	for (i = 0; i < a.length; ++i) {
		if (b[i] == "D" || b[i] == "DD") {
			continue;
		}
		if (b[i] == "d" || b[i] == "dd") {
			d = a[i];
		}
		if (b[i] == "m" || b[i] == "mm") {
			m = a[i]-1;
		}
		if (b[i] == "y") {
			y = a[i];
		}
		if (b[i] == "yy") {
			y = parseInt(a[i]) + 1900;
		}
		if (b[i] == "M" || b[i] == "MM") {
			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) {
		this.setDate(new Date(y, m, d));
		return;
	}
	y = 0; m = -1; d = 0;
	for (i = 0; i < a.length; ++i) {
		if (a[i].search(/[a-zA-Z]+/) != -1) {
			var t = -1;
			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]) <= 12 && m == -1) {
			m = a[i]-1;
		} else if (parseInt(a[i]) > 31 && y == 0) {
			y = a[i];
		} else if (d == 0) {
			d = a[i];
		}
	}
	if (y == 0) {
		var today = new Date();
		y = today.getFullYear();
	}
	if (m != -1 && d != 0) {
		this.setDate(new Date(y, m, d));
	}
};

Calendar.prototype.hideShowCovered = function () {
	//var tags = new Array("applet", "iframe", "select");	//Elements to hide during popup
	var tags = new Array("applet", "select");	//Elements to hide during popup
	var el = this.element;

	var p = Calendar.getAbsolutePos(el);
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;

	for (var k = tags.length; k > 0; ) {
		var ar = document.getElementsByTagName(tags[--k]);
		var cc = null;

		for (var i = ar.length; i > 0;) {
			cc = ar[--i];

			p = Calendar.getAbsolutePos(cc);
			var CX1 = p.x;
			var CX2 = cc.offsetWidth + CX1;
			var CY1 = p.y;
			var CY2 = cc.offsetHeight + CY1;

			if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
				cc.style.visibility = "visible";
			} else {
				cc.style.visibility = "hidden";
			}
		}
	}
};

/** Internal function; it displays the bar with the names of the weekday. */
Calendar.prototype._displayWeekdays = function () {
	var MON = this.mondayFirst ? 0 : 1;
	var SUN = this.mondayFirst ? 6 : 0;
	var SAT = this.mondayFirst ? 5 : 6;
	var cell = this.daynames.firstChild;
	for (var i = 0; i < 7; ++i) {
		cell.className = "day name";
		if (!i) {
			cell.ttip = this.mondayFirst ? Calendar._TT["SUN_FIRST"] : Calendar._TT["MON_FIRST"];
			cell.navtype = 100;
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
		if (i == SUN || i == SAT) {
			Calendar.addClass(cell, "weekend");
		}
		cell.firstChild.data = Calendar._DN3[i + 1 - MON];
		cell = cell.nextSibling;
	}
};

/** Internal function.  Hides all combo boxes that might be displayed. */
Calendar.prototype._hideCombos = function () {
	this.monthsCombo.style.display = "none";
	this.yearsCombo.style.display = "none";
};

/** Internal function.  Starts dragging the element. */
Calendar.prototype._dragStart = function (ev) {
	if (this.dragging) {
		return;
	}
	this.dragging = true;
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posY = ev.clientY + window.scrollY;
		posX = ev.clientX + window.scrollX;
	}
	var st = this.element.style;
	this.xOffs = posX - parseInt(st.left);
	this.yOffs = posY - parseInt(st.top);
	with (Calendar) {
		addEvent(document, "mousemove", calDragIt);
		addEvent(document, "mouseover", stopEvent);
		addEvent(document, "mouseup", calDragEnd);
	}
};

// BEGIN: DATE OBJECT PATCHES

/** Adds the number of days array to the Date object. */
Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

/** Returns the number of days in the current month */
Date.prototype.getMonthDays = function() {
	var year = this.getFullYear();
	var month = this.getMonth();
	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
		return 29;
	} else {
		return Date._MD[month];
	}
};

/** Checks dates equality (ignores time) */
Date.prototype.equalsTo = function(date) {
	return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()));
};

/** Prints the date in a string according to the given format. */
Date.prototype.print = function (frm) {
	var str = new String(frm);
	var m = this.getMonth();
	var d = this.getDate();
	var y = this.getFullYear();
	var w = this.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["yy"] = new String(y).substr(2, 2);
	with (Calendar) {
		s["D"] = _DN3[w];
		s["DD"] = _DN[w];
		s["M"] = _MN3[m];
		s["MM"] = _MN[m];
	}
	var re = /(.*)(\W|^)(d|dd|m|mm|y|yy|MM|M|DD|D)(\W|$)(.*)/;
	while (re.exec(str) != null) {
		str = RegExp.$1 + RegExp.$2 + s[RegExp.$3] + RegExp.$4 + RegExp.$5;
	}
	return str;
};

// END: DATE OBJECT PATCHES




// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Calendar-en(Calendar-en.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

Calendar._DN = new Array
("Sunday",
 "Monday",
 "Tuesday",
 "Wednesday",
 "Thursday",
 "Friday",
 "Saturday",
 "Sunday");
Calendar._MN = new Array
("January",
 "February",
 "March",
 "April",
 "May",
 "June",
 "July",
 "August",
 "September",
 "October",
 "November",
 "December");

Calendar._TT = {};
Calendar._TT["TOGGLE"] = "Toggle first day of week";
Calendar._TT["PREV_YEAR"] = "Prev. year, hold for menu";
Calendar._TT["PREV_MONTH"] = "Prev. month, hold for menu";
Calendar._TT["GO_TODAY"] = "Go Today";
Calendar._TT["NEXT_MONTH"] = "Next month, hold for menu";
Calendar._TT["NEXT_YEAR"] = "Next year, hold for menu";
Calendar._TT["SEL_DATE"] = "Select date";
Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
Calendar._TT["PART_TODAY"] = " (today)";
Calendar._TT["MON_FIRST"] = "Display Monday first";
Calendar._TT["SUN_FIRST"] = "Display Sunday first";
Calendar._TT["CLOSE"] = "Close";
Calendar._TT["TODAY"] = "Today";

// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd";
Calendar._TT["TT_DATE_FORMAT"] = "D, M d";



// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file sortabletable(sortabletable.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
 
/*----------------------------------------------------------------------------\
|                            Sortable Table 1.02                              |
\----------------------------------------------------------------------------*/


function SortableTable(oTable, oSortTypes) {
	this.element = oTable;
	this.tHead = oTable.tHead;
	this.tBody = oTable.tBodies[0];
	this.document = oTable.ownerDocument || oTable.document;
	
	this.sortColumn = null;
	this.descending = null;
	
	var oThis = this;
	this._headerOnclick = function (e) {
		oThis.headerOnclick(e);
	};
	
	
	// only IE needs this
	var win = this.document.defaultView || this.document.parentWindow;
	this._onunload = function () {
		oThis.destroy();
	};
	if (win && typeof win.attachEvent != "undefined") {
		win.attachEvent("onunload", this._onunload);
	}
	
	this.initHeader(oSortTypes || []);
}

SortableTable.gecko = navigator.product == "Gecko";
SortableTable.msie = /msie/i.test(navigator.userAgent);
// Mozilla is faster when doing the DOM manipulations on
// an orphaned element. MSIE is not
SortableTable.removeBeforeSort = SortableTable.gecko;

SortableTable.prototype.onsort = function () {};

// adds arrow containers and events
// also binds sort type to the header cells so that reordering columns does
// not break the sort types
SortableTable.prototype.initHeader = function (oSortTypes) {
	
	if (this && this.tHead && this.tHead.rows[0] && this.tHead.rows[0].cells)
	{
	var cells = this.tHead.rows[0].cells;
	var l = cells.length;
	var img, c;
	for (var i = 0; i < l; i++) {
		c = cells[i];
		//img = this.document.createElement("IMG");
		//img.src = "images/blank.png";
		//c.appendChild(img);
		if (oSortTypes[i] != null) {
			c._sortType = oSortTypes[i];
		}
		if (typeof c.addEventListener != "undefined")
			c.addEventListener("click", this._headerOnclick, false);
		else if (typeof c.attachEvent != "undefined")		
			c.attachEvent("onclick", this._headerOnclick);
		}
		//this.updateHeaderArrows();
	}
};

// remove arrows and events
SortableTable.prototype.uninitHeader = function () 
{
	if (this && this.tHead && this.tHead.rows[0] && this.tHead.rows[0].cells)
	{
	
	var cells = this.tHead.rows[0].cells;
	var l = cells.length;
	var c;
   try {
	for (var i = 0; i < l; i++) {
		c = cells[i];
		c.removeChild(c.lastChild);
		if (typeof c.removeEventListener != "undefined")
			c.removeEventListener("click", this._headerOnclick, false);
		else if (typeof c.detachEvent != "undefined")
			c.detachEvent("onclick", this._headerOnclick);
	}
   } catch (error) { }
		}

};

SortableTable.prototype.updateHeaderArrows = function () {
	if (this && this.tHead && this.tHead.rows[0] && this.tHead.rows[0].cells)
	{
	var cells = this.tHead.rows[0].cells;
	var l = cells.length;
	var img;
	for (var i = 0; i < l; i++) {
		img = cells[i].lastChild;
		if (i == this.sortColumn)
			img.className = "sort-arrow " + (this.descending ? "descending" : "ascending");
		else
			img.className = "sort-arrow";			
		}
	}
};

SortableTable.prototype.headerOnclick = function (e) {
	// find TD element
	var el = e.target || e.srcElement; 
	if (el.tagName == "A")
		return;
	while (el.tagName != "TD")
		el = el.parentNode;
	
	this.sort(el.cellIndex);	
};

SortableTable.prototype.getSortType = function (nColumn) {
	var cell = this.tHead.rows[0].cells[nColumn];
	var val = cell._sortType;
	if (val != "")
		return val;
	return "String";
};

SortableTable.prototype.applyFilter = function (filterInput) {
	//alert('applyfilter');
	nColumn = filterInput.id;
	sSortType = this.getSortType(nColumn);
	//alert('sSortType='+sSortType+' nColumn='+nColumn);
	var a = this.getCache(sSortType, nColumn);
	var tBody = this.tBody;

	var v_regexp = new RegExp("^" + filterInput.value,"gi")

	// insert in the new order
	var l = a.length;
	for (var i = 0; i < l; i++) {
		if ( !v_regexp.test(a[i].value) ) {
			a[i].element.style.display = 'none';
			a[i].element.style.visibility = 'hidden';
			
		} else {
			a[i].element.style.visibility = 'visible';
			a[i].element.style.display = '';
			v_regexp.test(a[i].value)
		}
	}
	
	this.destroyCache(a);
}

// only nColumn is required
// if bDescending is left out the old value is taken into account
// if sSortType is left out the sort type is found from the sortTypes array

SortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {
	if (sSortType == null)
		sSortType = this.getSortType(nColumn);

	// exit if None	
	if (sSortType == "None")
		return;
	
	if (bDescending == null) {
		if (this.sortColumn != nColumn)
			this.descending = true;
		else
			this.descending = !this.descending;
	}	
	
	this.sortColumn = nColumn;
	
	if (typeof this.onbeforesort == "function")
		this.onbeforesort();
	
	//alert('sSortType='+sSortType+' nColumn='+nColumn);
	var f = this.getSortFunction(sSortType, nColumn);
	var a = this.getCache(sSortType, nColumn);
	var tBody = this.tBody;
	//alert('a.sort');
	a.sort(f);
	
	if (this.descending)
		a.reverse();
	
	if (SortableTable.removeBeforeSort) {
		// remove from doc
		var nextSibling = tBody.nextSibling;
		//alert(nextSibling.name);
		var p = tBody.parentNode;
		p.removeChild(tBody);
	}
	
	// insert in the new order
	var l = a.length;
	for (var i = 0; i < l; i++)
		tBody.appendChild(a[i].element);
	
	if (SortableTable.removeBeforeSort) {	
		// insert into doc
		p.insertBefore(tBody, nextSibling);
	}
	
	//this.updateHeaderArrows();
	
	this.destroyCache(a);
	
	if (typeof this.onsort == "function")
		this.onsort();
};

SortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {
	var oThis = this;
	this._asyncsort = function () {
		oThis.sort(nColumn, bDescending, sSortType);
	};
	window.setTimeout(this._asyncsort, 1);	
};

SortableTable.prototype.getCache = function (sType, nColumn) {
	//alert('getValueFromString: '+sType', '+nColumn);
	var rows = this.tBody.rows;
	var l = rows.length;
	var a = new Array(l);
	var r;
	for (var i = 0; i < l; i++) {
		r = rows[i];
		a[i] = {
			value: this.getRowValue(r, sType, nColumn),
			element: r
		};
	};
	return a;
};

SortableTable.prototype.destroyCache = function (oArray) {
	var l = oArray.length;
	for (var i = 0; i < l; i++) {
		oArray[i].value = null;
		oArray[i].element = null;
		oArray[i] = null;
	}
}

SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {
	var s;
	var c = oRow.cells[nColumn];
	//alert(c.children(0).innerHTML);
	var sortval;
	if ( typeof c == "undefined") return '@NONE@';
	if (typeof c.innerText != "undefined")
		{
		//alert(c.innerHTML);
		if ((c.innerHTML.substr(0,4)=='<!--') || (c.innerText==' ' && c.innerHTML.indexOf('ChangeEntry') > -1)) {
			//alert(c.innerHTML);
			sortval = c.innerHTML.substr(4)
			sortval = sortval.substr(0,sortval.indexOf('-->'));
			//alert(sortval);
			//s = c.innerHTML;
			s = sortval;
			//sType = 'CaseInsensitiveString';	//MWC 1/6/04 - Commented out to fix Editable Col (Date) sorting
		    }
		else {
			s = c.innerText;
			}
		}
	else
		{
		s = SortableTable.getInnerText(c);
	
		//alert (this.getValueFromString(s, sType));
		}
	//alert(s+' type='+sType+' len='+s.length);
	return this.getValueFromString(s, sType);
};

SortableTable.getInnerText = function (oNode) {
	var s = "";	
	var cs = oNode.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				s += getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				s += cs[i].nodeValue;
				break;
		}
	}
	return s;
}

SortableTable.prototype.getValueFromString = function (sText, sType) {
	//alert('getValueFromString: '+sText+', '+sType);
	switch (sType) {
		case "Number":
			return Number(sText);
		case "CaseInsensitiveString":
			return sText.toUpperCase();
		case "Date":
			if (sText.indexOf("/")>-1) {
			var parts = sText.split("/");
			var d = new Date(0);
			d.setFullYear(parts[2]);
			d.setDate(parts[1]);
			d.setMonth(parts[0] - 1);			
			return d.valueOf();		
			}
			else {
			var parts = sText.split("-");
			var d = new Date(0);
			d.setFullYear(parts[0]);
			d.setDate(parts[2]);
			d.setMonth(parts[1] - 1);			
			return d.valueOf();		
			}
	}
	return sText;
};

SortableTable.prototype.getSortFunction = function (sType, nColumn) {
	return function compare(n1, n2) {
		if (n1.value < n2.value /* || (n1.value == '@NONE@' && n2.value != '@NONE@')*/)
			return -1;
		if (n2.value < n1.value /*|| n2.value == '@NONE@'*/)
			return 1;
		return 0;
	};
};

SortableTable.prototype.destroy = function () {
	this.uninitHeader();
	var win = this.document.parentWindow;
	if (win && typeof win.detachEvent != "undefined") {	// only IE needs this
		win.detachEvent("onunload", this._onunload);
	}	
	this._onunload = null;
	this.element = null;
	this.tHead = null;
	this.tBody = null;
	this.document = null;
	this._headerOnclick = null;
	this.sortTypes = null;
	this._asyncsort = null;
	this.onsort = null;

};

// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file CascadeMenu(CascadeMenu.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


   var hideTimer = 0;
 
	function InitMenu(id) {
		var bar = document.getElementById(id);
		bar.parentNode.style.position = 'relative';
		bar.parentNode.style.paddingTop = '1px';
		bar.parentNode.style.zIndex = '10';
		if (!bar) return;
		bar = bar.getElementsByTagName('div');
		
		for (var i=0; i < bar.length; i++) {
			var menu = document.getElementById(bar[i].getAttribute('menu'));
			menu.style.visibility = "hidden";
			bar[i].onmouseover = new Function("ShowMenu('" + bar[i].id + "'); handPointer(this);");
			bar[i].onmouseout = new Function("hideTimer = setTimeout(\"HideMenu('"+ id + "')\", 400);");
			var Items = menu.getElementsByTagName('div');
			if (Items.length==0) bar[i].style.display = "none";
			for (var j=0; j < Items.length; j++) init_menu_item(id, Items[j]);
				
		}
	}
	function get_menu_by_name(menuBarName, name) {
		var bar = document.getElementById(menuBarName);
		bar = bar.getElementsByTagName('div');
		for (var i=0; i < bar.length; i++) {
				if (bar[i].innerHTML == name) return bar[i];
		}
		return null;
	}
	
	function remove_all_menu_items(menuBarName, menu_name) {
		var bar = get_menu_by_name(menuBarName, menu_name);
		if (!bar) return;
		var menu = document.getElementById(bar.getAttribute('menu'));
		var Items = menu.getElementsByTagName('DIV');
		for (var j=Items.length-1; j >= 0; j--) {
			Items[j].parentNode.removeChild(Items[j]);
		}
	}
	function init_menu_item(id, menuItem) {
		if (menuItem.getAttribute('menu')) { 
			//menuItem.getElementsByTagName('SPAN')[0].innerHTML += "<span id=" + menuItem.id + "_Arrow class='Arrow'>4</span>";
			menuItem.getElementsByTagName('SPAN')[0].innerHTML += "<img src='images/arrow.gif' id='" + menuItem.id + "_Arrow' class='Arrow'/>";
			//var tmp = eval(menuItem.id+"_Arrow");
			// tmp.style.pixelLeft = menu.getBoundingClientRect().Right //- tmp.offsetWidth - 15;
			FindSubMenu(menuItem.getAttribute('menu'), id);		
		}
		
		if (menuItem.getAttribute('cmd')) {
			menuItem.onclick = new Function("Do('" + menuItem.id + "'); HideMenu('" + id + "');");
			//menuItem.onclick = function(e) {Do(menuItem.id); HideMenu(id);};
		} 
		menuItem.onmouseover = new Function("highlightMenu('" + menuItem.id + "'); handPointer(this);");
		menuItem.onmouseout = new Function("hideTimer = window.setTimeout(\"HideMenu('" + id + "')\", 400);");
	}
	function FindSubMenu(subMenu, menuBarID) {
		//var menu=eval(subMenu)
		var menu = document.getElementById(subMenu);
		//var Items = menu.children
		var Items = menu.getElementsByTagName('DIV');
		for (var j=0; j < Items.length; j++) {
			menu.style.visibility = 'hidden';
			var menuItem = document.getElementById(Items[j].id)
			
			if (menuItem.getAttribute('menu')) {
				//menuItem.getElementsByTagName('SPAN')[0].innerHTML += "<span id=" + menuItem.id + "_Arrow class='Arrow'>4</span>";
				menuItem.getElementsByTagName('SPAN')[0].innerHTML += "<img src='images/arrow.gif' id='" + menuItem.id + "_Arrow' class='Arrow'/>";
					
				// var tmp = eval(menuItem.id+"_Arrow")
				//tmp.style.pixelLeft = 35 //menuItem.getBoundingClientRect().right - tmp.offsetWidth - 15
				FindSubMenu(menuItem.getAttribute('menu'), menuBarID);
			}
			if (menuItem.getAttribute('cmd') != null) {
				menuItem.onclick = new Function("Do('" + menuItem.id + "')");
			} 
			menuItem.onmouseover = new Function("highlightMenu('" + Items[j].id + "'); handPointer(this);");
			menuItem.onmouseout = new Function("hideTimer = setTimeout(\"HideMenu('" + menuBarID + "')\", 400);");
		}  
	} 
	function ShowMenu(id) {
		var bar = document.getElementById(id);
		HideMenu(bar.parentNode.id);
		var menu = document.getElementById(bar.getAttribute('menu'));
		//bar.className="barOver"
		bar.className = bar.className.replace(/barOver/g, 'Bar');
		bar.className = bar.className.replace(/Bar/g, 'barOver');
	
	
		//menu.style.pixelTop =  getCoords(bar).y + bar.offsetHeight + document.body.scrollTop;
		//menu.style.top =  getCoords(bar).y + document.body.scrollTop;
		menu.style.top =  bar.offsetHeight + 7;
		// menu.style.top = 0;
	
		//alert(bar.offsetHeight + ':' + bar.parentNode.offsetHeight +':' + document.body.scrollTop);
		menu.style.left = getCoords(bar).x;
		//window.status = getCoords(menu).y + ':' + bar.offsetHeight;
	
		//alert(menu.style.top);
		//menu.style.left = bar.offsetLeft + document.body.scrollLeft;
		//window.status = window.status + '->' + id +':' + getCoords(bar).x + ':' + getCoords(bar).y
		//window.status = bar.offsetLeft  +':' + document.body.scrollLeft;
	
		var Elements = menu.getElementsByTagName('DIV');
		var mw = menu.offsetWidth - 3;
		for (var i=0; i < Elements.length; i++) {
			Elements[i].style.width = mw;
		}
		menu.style.visibility = "visible";
	
		hideShowCovered(menu);
	}	   
   
	function highlightMenu(id) {
		
		//if (id == 'menuitemmenu5_2') {throw('e'); /*menuitemmenu_5_2_x = true*/};
		window.status = 'highlighting ' + id;
		var obj = document.getElementById(id);
		var PElement = document.getElementById(obj.parentNode.id);
		var Elements = PElement.getElementsByTagName('DIV');
		for (var i=0; i < Elements.length; i++) {
			var TE = document.getElementById(Elements[i].id);
			//TE.className = "menuItem"
			TE.className = TE.className.replace(/menuItem/g, 'ItemMouseOver');
			TE.className = TE.className.replace(/ItemMouseOver/g, 'menuItem');
		}
	
		//window.defaultStatus = obj.title;
		ShowSubMenu(obj);
		//obj.className="ItemMouseOver"
		obj.className = obj.className.replace(/ItemMouseOver/g, 'menuItem');
		if(obj.getAttribute('cmd') && obj.getAttribute('cmd').length > 0) {
			obj.className = obj.className.replace(/menuItem/g, 'ItemMouseOver');
		}
		if(obj.getAttribute('menu') && obj.getAttribute('menu').length > 0) {
			obj.className = obj.className.replace(/menuItem/g, 'ItemMouseOver');
		}
		handPointer(obj);
	}
   
	function Do(obj) {
		var obj = document.getElementById(obj);
		var cmd = obj.getAttribute('cmd');	
		//window.navigate(cmd)
		eval(cmd);
	}
   
	function HideMenu(id) {
		var obj = document.getElementById(id);
		var children = obj.getElementsByTagName('DIV');     
		var menuHid = false;
		for (var j=0; j < children.length; j++) {
			if (children[j].className.substr(0,7) == 'barOver') {
				var bar = document.getElementById(children[j].id);
				//bar.className="Bar"
				bar.className = bar.className.replace(/barOver/g, 'Bar');
			} else if (children[j].className.substr(0,13) == 'ItemMouseOver') {
				var item = document.getElementById(children[j].id);
				//item.className="menuItem"
				item.className = item.className.replace(/menuItem/g, 'ItemMouseOver');
				item.className = item.className.replace(/ItemMouseOver/g, 'menuItem');
			}
	
			if (children[j].getAttribute('menu')) {
				var childMenu = document.getElementById(children[j].getAttribute('menu'));
				if (childMenu.hasChildNodes())
					HideMenu(childMenu.id);
				childMenu.style.visibility = 'hidden';
				menuHid = true;
			}
		}
		if (menuHid) hideShowCovered(obj);
		window.clearTimeout(hideTimer);
	}
	function ShowSubMenu(obj) {
		PMenu = obj.parentNode;
		HideMenu(PMenu.id);
		if(obj.getAttribute('menu') != null) {
			var menu = document.getElementById(obj.getAttribute('menu'));
			menu.style.top =  obj.offsetHeight +  5 + obj.offsetTop;
			// menu.style.top = 0;
			
			//alert(bar.offsetHeight + ':' + bar.parentNode.offsetHeight +':' + document.body.scrollTop);
			menu.style.left = getCoords(obj).x + obj.offsetWidth;
			//menu.style.pixelTop =  obj.getBoundingClientRect().top + Bdy.scrollTop
			//menu.style.pixelLeft = obj.getBoundingClientRect().right + Bdy.scrollLeft
			//if(menu.getBoundingClientRect().right > window.screen.availWidth )
			//  menu.style.pixelLeft = obj.getBoundingClientRect().left - menu.offsetWidth
			menu.style.visibility = 'visible';
			
			hideShowCoveredSubMenu(menu);
		}
	} 

	function hideShowCovered(el) {
		// This next if statement was add to speed up Menus in IE7.  This function is no longer needed in IE7.  Microsoft fixed the bug that DIVs could not float over Selects.
		if (document.documentElement && typeof document.documentElement.style.maxHeight!="undefined")
			return true;
		//var tags = new Array("applet", "iframe", "select");	//Elements to hide during popup
		var tags = new Array("applet", "select");	//Elements to hide during popup
		//var el = this.element;
		var p = getCoords(el);
		var EX1 = p.x;
		var EX2 = el.offsetWidth + EX1;
		var EY1 = p.y;
		var EY2 = el.offsetHeight + EY1;
		
		var inarow = 0;
		
		//MWC - To make the drop-down menus more snappy on pages with many <select> elements, 
		//I changed the element search order from (bottom to top) to (top to bottom) and 
		//added a count (in a row) of elements that are not covered.  When the count exceeds
		//a number, assume we're below the menu and don't need to test positions any further.
		
		//for (var k = tags.length; k > 0; ) {
		for (var k =0; k < tags.length; k++) {
			//var ar = document.getElementsByTagName(tags[--k]);
			var ar = document.getElementsByTagName(tags[k]);
			var cc = null;
			var bskip = false;
			
			//for (var i = ar.length; i > 0;) {
			for (var i=0; i < ar.length; i++) {
				//cc = ar[--i];
				cc = ar[i];
				bskip = false;
				
				//is element within a hidden div? if so, ignore it.
				var par = cc.parentNode;
				if (par) {
					if (tags[k] == 'select' && par.getAttribute('style') != '') {
						if(cc.parentNode.style.visibility=='hidden') {
							bskip = true;
						}
					}
				}
		
				if (!bskip) {			
					p = getAbsolutePos(cc);
					var CX1 = p.x;
					var CX2 = cc.offsetWidth + CX1;
					var CY1 = p.y;
					var CY2 = cc.offsetHeight + CY1;
					
					if (CX1 > EX2 || CX2 < EX1 || CY1 > EY2 || CY2 < EY1) {
						cc.style.visibility = 'visible'; //not covered
						if (++inarow > 11) break;
					} else {
						cc.style.visibility = 'hidden';	//covered - hide element
						inarow=0;
					}
				}
			}
		}
	}

	function hideShowCoveredSubMenu(el) {
		if (document.documentElement && typeof document.documentElement.style.maxHeight!="undefined")
			return true;
		//Just like hideShowCovered, except does not unhide any elements.
		//var tags = new Array("applet", "iframe", "select");	//Elements to hide during popup
		var tags = new Array("applet", "select");	//Elements to hide during popup
		//var el = this.element;
		var p = getCoords(el);
		var EX1 = p.x;
		var EX2 = el.offsetWidth + EX1;
		var EY1 = p.y;
		var EY2 = el.offsetHeight + EY1;
		
		var inarow = 0;
		
		//MWC - To make the drop-down menus more snappy on pages with many <select> elements, 
		//I changed the element search order from (bottom to top) to (top to bottom) and 
		//added a count (in a row) of elements that are not covered.  When the count exceeds
		//a number, assume we're below the menu and don't need to test positions any further.
		
		//for (var k = tags.length; k > 0; ) {
		for (var k =0; k < tags.length; k++) {
			//var ar = document.getElementsByTagName(tags[--k]);
			var ar = document.getElementsByTagName(tags[k]);
			var cc = null;
			var bskip = false;
			
			//for (var i = ar.length; i > 0;) {
			for (var i=0; i < ar.length; i++) {
				//cc = ar[--i];
				cc = ar[i];
				bskip = false;
				
				//is element within a hidden div? if so, ignore it.
				var par = cc.parentNode;
				if (par) {
					if (tags[k] == 'select' && par.getAttribute('style') != '') {
						if(cc.parentNode.style.visibility=='hidden') {
							bskip = true;
						}
					}
				}
		
				if (!bskip) {			
					p = getAbsolutePos(cc);
					var CX1 = p.x;
					var CX2 = cc.offsetWidth + CX1;
					var CY1 = p.y;
					var CY2 = cc.offsetHeight + CY1;
					
					if (CX1 > EX2 || CX2 < EX1 || CY1 > EY2 || CY2 < EY1) {
						if (++inarow > 11) break;
					} else {
						cc.style.visibility = 'hidden';	//covered - hide element
						inarow=0;
					}
				}
			}
		}
	}

function getAbsolutePos(el) {
	var r = { x: el.offsetLeft, y: el.offsetTop };
	if (el.offsetParent) {
		var tmp = getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};
	function getCoords (element) {
		window.status = '';
     var coords = { x: 0, y: 0, width: element.offsetWidth, height: element.offsetHeight };
     while (element) {
		// window.status = window.status + element.id + ':'+ element.nodeName + '=' + element.offsetTop + ' | ';
	if(element.tagName=='TD')
		coords.x = 0
	else	
       		coords.x += element.offsetLeft;
       coords.y += element.offsetTop;
       element = element.offsetParent;
     }

     return coords;
   }



 // --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Window(Window.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


// Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.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.
//
// VERSION 1.3

var Window = Class.create();

Window.keepMultiModalWindow = false;
Window.hasEffectLib = (typeof Effect != 'undefined');
Window.resizeEffectDuration = 0.4;

Window.prototype = {
  // Constructor
  // Available parameters : className, blurClassName, title, minWidth, minHeight, maxWidth, maxHeight, width, height, top, left, bottom, right, resizable, zIndex, opacity, recenterAuto, wiredDrag
  //                        hideEffect, showEffect, showEffectOptions, hideEffectOptions, effectOptions, url, draggable, closable, minimizable, maximizable, parent, onload
  //                        add all callbacks (if you do not use an observer)
  //                        onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
  
  initialize: function() {
    var id;
    var optionIndex = 0;
    // For backward compatibility like win= new Window("id", {...}) instead of win = new Window({id: "id", ...})
    if (arguments.length > 0) {
      if (typeof arguments[0] == "string" ) {
        id = arguments[0];
        optionIndex = 1;
      }
      else
        id = arguments[0] ? arguments[0].id : null;
    }
    
    // Generate unique ID if not specified
    if (!id)
      id = "window_" + new Date().getTime();
      
    if ($(id))
      alert("Window " + id + " is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor");

    this.options = Object.extend({
      className:         "dialog",
      blurClassName:     null,
      minWidth:          100, 
      minHeight:         20,
      resizable:         true,
      closable:          true,
      minimizable:       true,
      maximizable:       true,
      draggable:         true,
      userData:          null,
      showEffect:        (Window.hasEffectLib ? Effect.Appear : Element.show),
      hideEffect:        (Window.hasEffectLib ? Effect.Fade : Element.hide),
      showEffectOptions: {},
      hideEffectOptions: {},
      effectOptions:     null,
      parent:            document.body,
      title:             "&nbsp;",
      url:               null,
      onload:            Prototype.emptyFunction,
      width:             200,
      height:            300,
      opacity:           1,
      recenterAuto:      true,
      wiredDrag:         false,
      closeCallback:     null,
      destroyOnClose:    false,
      gridX:             1, 
      gridY:             1      
    }, arguments[optionIndex] || {});
    if (this.options.blurClassName)
      this.options.focusClassName = this.options.className;
      
    if (typeof this.options.top == "undefined" &&  typeof this.options.bottom ==  "undefined") 
      this.options.top = this._round(Math.random()*500, this.options.gridY);
    if (typeof this.options.left == "undefined" &&  typeof this.options.right ==  "undefined") 
      this.options.left = this._round(Math.random()*500, this.options.gridX);

    if (this.options.effectOptions) {
      Object.extend(this.options.hideEffectOptions, this.options.effectOptions);
      Object.extend(this.options.showEffectOptions, this.options.effectOptions);
      if (this.options.showEffect == Element.Appear)
        this.options.showEffectOptions.to = this.options.opacity;
    }
    if (Window.hasEffectLib) {
      if (this.options.showEffect == Effect.Appear)
        this.options.showEffectOptions.to = this.options.opacity;
    
      if (this.options.hideEffect == Effect.Fade)
        this.options.hideEffectOptions.from = this.options.opacity;
    }
    if (this.options.hideEffect == Element.hide)
      this.options.hideEffect = function(){ Element.hide(this.element); if (this.options.destroyOnClose) this.destroy(); }.bind(this)
    
    if (this.options.parent != document.body)  
      this.options.parent = $(this.options.parent);
      
    this.element = this._createWindow(id);       
    this.element.win = this;
    
    // Bind event listener
    this.eventMouseDown = this._initDrag.bindAsEventListener(this);
    this.eventMouseUp   = this._endDrag.bindAsEventListener(this);
    this.eventMouseMove = this._updateDrag.bindAsEventListener(this);
    this.eventOnLoad    = this._getWindowBorderSize.bindAsEventListener(this);
    this.eventMouseDownContent = this.toFront.bindAsEventListener(this);
    this.eventResize = this._recenter.bindAsEventListener(this);
 
    this.topbar = $(this.element.id + "_top");
    this.bottombar = $(this.element.id + "_bottom");
    this.content = $(this.element.id + "_content");
    
    Event.observe(this.topbar, "mousedown", this.eventMouseDown);
    Event.observe(this.bottombar, "mousedown", this.eventMouseDown);
    Event.observe(this.content, "mousedown", this.eventMouseDownContent);
    Event.observe(window, "load", this.eventOnLoad);
    Event.observe(window, "resize", this.eventResize);
    Event.observe(window, "scroll", this.eventResize);
    Event.observe(this.options.parent, "scroll", this.eventResize);
    
    if (this.options.draggable)  {
      var that = this;
      [this.topbar, this.topbar.up().previous(), this.topbar.up().next()].each(function(element) {
        element.observe("mousedown", that.eventMouseDown);
        element.addClassName("top_draggable");
      });
      [this.bottombar.up(), this.bottombar.up().previous(), this.bottombar.up().next()].each(function(element) {
        element.observe("mousedown", that.eventMouseDown);
        element.addClassName("bottom_draggable");
      });
      
    }    
    
    if (this.options.resizable) {
      this.sizer = $(this.element.id + "_sizer");
      Event.observe(this.sizer, "mousedown", this.eventMouseDown);
    }  
    
    this.useLeft = null;
    this.useTop = null;
    if (typeof this.options.left != "undefined") {
      this.element.setStyle({left: parseFloat(this.options.left) + 'px'});
      this.useLeft = true;
    }
    else {
      this.element.setStyle({right: parseFloat(this.options.right) + 'px'});
      this.useLeft = false;
    }
    
    if (typeof this.options.top != "undefined") {
      this.element.setStyle({top: parseFloat(this.options.top) + 'px'});
      this.useTop = true;
    }
    else {
      this.element.setStyle({bottom: parseFloat(this.options.bottom) + 'px'});      
      this.useTop = false;
    }
      
    this.storedLocation = null;
    
    this.setOpacity(this.options.opacity);
    if (this.options.zIndex)
      this.setZIndex(this.options.zIndex)

    if (this.options.destroyOnClose)
      this.setDestroyOnClose(true);

    this._getWindowBorderSize();
    this.width = this.options.width;
    this.height = this.options.height;
    this.visible = false;
    
    this.constraint = false;
    this.constraintPad = {top: 0, left:0, bottom:0, right:0};
    
    if (this.width && this.height)
      this.setSize(this.options.width, this.options.height);
    this.setTitle(this.options.title)
    Windows.register(this);      
  },
  
  // Destructor
  destroy: function() {
    this._notify("onDestroy");
    Event.stopObserving(this.topbar, "mousedown", this.eventMouseDown);
    Event.stopObserving(this.bottombar, "mousedown", this.eventMouseDown);
    Event.stopObserving(this.content, "mousedown", this.eventMouseDownContent);
    
    Event.stopObserving(window, "load", this.eventOnLoad);
    Event.stopObserving(window, "resize", this.eventResize);
    Event.stopObserving(window, "scroll", this.eventResize);
    
    Event.stopObserving(this.content, "load", this.options.onload);

    if (this._oldParent) {
      var content = this.getContent();
      var originalContent = null;
      for(var i = 0; i < content.childNodes.length; i++) {
        originalContent = content.childNodes[i];
        if (originalContent.nodeType == 1) 
          break;
        originalContent = null;
      }
      if (originalContent)
        this._oldParent.appendChild(originalContent);
      this._oldParent = null;
    }

    if (this.sizer)
        Event.stopObserving(this.sizer, "mousedown", this.eventMouseDown);

    if (this.options.url) 
      this.content.src = null

     if(this.iefix) 
      Element.remove(this.iefix);

    Element.remove(this.element);
    Windows.unregister(this);      
  },
    
  // Sets close callback, if it sets, it should return true to be able to close the window.
  setCloseCallback: function(callback) {
    this.options.closeCallback = callback;
  },
  
  // Gets window content
  getContent: function () {
    return this.content;
  },
  
  // Sets the content with an element id
  setContent: function(id, autoresize, autoposition) {
    var element = $(id);
    if (null == element) throw "Unable to find element '" + id + "' in DOM";
    this._oldParent = element.parentNode;

    var d = null;
    var p = null;

    if (autoresize) 
      d = Element.getDimensions(element);
    if (autoposition) 
      p = Position.cumulativeOffset(element);

    var content = this.getContent();
    // Clear HTML (and even iframe)
    this.setHTMLContent("");
    content = this.getContent();
    
    content.appendChild(element);
    element.show();
    if (autoresize) 
      this.setSize(d.width, d.height);
    if (autoposition) 
      this.setLocation(p[1] - this.heightN, p[0] - this.widthW);    
  },
  
  setHTMLContent: function(html) {
    // It was an url (iframe), recreate a div content instead of iframe content
    if (this.options.url) {
      this.content.src = null;
      this.options.url = null;
      
  	  var content ="<div id=\"" + this.getId() + "_content\" class=\"" + this.options.className + "_content\"> </div>";
      $(this.getId() +"_table_content").innerHTML = content;
      
      this.content = $(this.element.id + "_content");
    }
      
    this.getContent().innerHTML = html;
  },
  
  setAjaxContent: function(url, options, showCentered, showModal) {
    this.showFunction = showCentered ? "showCenter" : "show";
    this.showModal = showModal || false;
  
    options = options || {};

    // Clear HTML (and even iframe)
    this.setHTMLContent("");
 
    this.onComplete = options.onComplete;
    if (! this._onCompleteHandler)
      this._onCompleteHandler = this._setAjaxContent.bind(this);
    options.onComplete = this._onCompleteHandler;

    new Ajax.Request(url, options);    
    options.onComplete = this.onComplete;
  },
  
  _setAjaxContent: function(originalRequest) {
    Element.update(this.getContent(), originalRequest.responseText);
    if (this.onComplete)
      this.onComplete(originalRequest);
    this.onComplete = null;
    this[this.showFunction](this.showModal)
  },
  
  setURL: function(url) {
    // Not an url content, change div to iframe
    if (this.options.url) 
      this.content.src = null;
    this.options.url = url;
    var content= "<iframe frameborder='0' name='" + this.getId() + "_content'  id='" + this.getId() + "_content' src='" + url + "' width='" + this.width + "' height='" + this.height + "'> </iframe>";
    $(this.getId() +"_table_content").innerHTML = content;
    
    this.content = $(this.element.id + "_content");
  },

  getURL: function() {
  	return this.options.url ? this.options.url : null;
  },

  refresh: function() {
    if (this.options.url)
	    $(this.element.getAttribute('id') + '_content').src = this.options.url;
  },
  
  // Stores position/size in a cookie, by default named with window id
  setCookie: function(name, expires, path, domain, secure) {
    name = name || this.element.id;
    this.cookie = [name, expires, path, domain, secure];
    
    // Get cookie
    var value = WindowUtilities.getCookie(name)
    // If exists
    if (value) {
      var values = value.split(',');
      var x = values[0].split(':');
      var y = values[1].split(':');

      var w = parseFloat(values[2]), h = parseFloat(values[3]);
      var mini = values[4];
      var maxi = values[5];

      this.setSize(w, h);
      if (mini == "true")
        this.doMinimize = true; // Minimize will be done at onload window event
      else if (maxi == "true")
        this.doMaximize = true; // Maximize will be done at onload window event

      this.useLeft = x[0] == "l";
      this.useTop = y[0] == "t";

      this.element.setStyle(this.useLeft ? {left: x[1]} : {right: x[1]});
      this.element.setStyle(this.useTop ? {top: y[1]} : {bottom: y[1]});
    }
  },
  
  // Gets window ID
  getId: function() {
    return this.element.id;
  },
  
  // Detroys itself when closing 
  setDestroyOnClose: function() {
    this.options.destroyOnClose = true;
  },
  
  setConstraint: function(bool, padding) {
    this.constraint = bool;
    this.constraintPad = Object.extend(this.constraintPad, padding || {});
    // Reset location to apply constraint
    if (this.useTop && this.useLeft)
      this.setLocation(parseFloat(this.element.style.top), parseFloat(this.element.style.left));
  },
  
  // initDrag event

  _initDrag: function(event) {
    // No resize on minimized window
    if (Event.element(event) == this.sizer && this.isMinimized())
      return;

    // No move on maximzed window
    if (Event.element(event) != this.sizer && this.isMaximized())
      return;
      
    if (Prototype.Browser.IE && this.heightN == 0)
      this._getWindowBorderSize();
    
    // Get pointer X,Y
    this.pointer = [this._round(Event.pointerX(event), this.options.gridX), this._round(Event.pointerY(event), this.options.gridY)];
    if (this.options.wiredDrag) 
      this.currentDrag = this._createWiredElement();
    else
      this.currentDrag = this.element;
      
    // Resize
    if (Event.element(event) == this.sizer) {
      this.doResize = true;
      this.widthOrg = this.width;
      this.heightOrg = this.height;
      this.bottomOrg = parseFloat(this.element.getStyle('bottom'));
      this.rightOrg = parseFloat(this.element.getStyle('right'));
      this._notify("onStartResize");
    }
    else {
      this.doResize = false;

      // Check if click on close button, 
      var closeButton = $(this.getId() + '_close');
      if (closeButton && Position.within(closeButton, this.pointer[0], this.pointer[1])) {
        this.currentDrag = null;
        return;
      }

      this.toFront();

      if (! this.options.draggable) 
        return;
      this._notify("onStartMove");
    }    
    // Register global event to capture mouseUp and mouseMove
    Event.observe(document, "mouseup", this.eventMouseUp, false);
    Event.observe(document, "mousemove", this.eventMouseMove, false);
    
    // Add an invisible div to keep catching mouse event over iframes
    WindowUtilities.disableScreen('__invisible__', '__invisible__', this.overlayOpacity);

    // Stop selection while dragging
    document.body.ondrag = function () { return false; };
    document.body.onselectstart = function () { return false; };
    
    this.currentDrag.show();
    Event.stop(event);
  },
  
  _round: function(val, round) {
    return round == 1 ? val  : val = Math.floor(val / round) * round;
  },

  // updateDrag event
  _updateDrag: function(event) {
    var pointer =  [this._round(Event.pointerX(event), this.options.gridX), this._round(Event.pointerY(event), this.options.gridY)];  
    var dx = pointer[0] - this.pointer[0];
    var dy = pointer[1] - this.pointer[1];
    
    // Resize case, update width/height
    if (this.doResize) {
      var w = this.widthOrg + dx;
      var h = this.heightOrg + dy;
      
      dx = this.width - this.widthOrg
      dy = this.height - this.heightOrg
      
      // Check if it's a right position, update it to keep upper-left corner at the same position
      if (this.useLeft) 
        w = this._updateWidthConstraint(w)
      else 
        this.currentDrag.setStyle({right: (this.rightOrg -dx) + 'px'});
      // Check if it's a bottom position, update it to keep upper-left corner at the same position
      if (this.useTop) 
        h = this._updateHeightConstraint(h)
      else
        this.currentDrag.setStyle({bottom: (this.bottomOrg -dy) + 'px'});
        
      this.setSize(w , h);
      this._notify("onResize");
    }
    // Move case, update top/left
    else {
      this.pointer = pointer;
      
      if (this.useLeft) {
        var left =  parseFloat(this.currentDrag.getStyle('left')) + dx;
        var newLeft = this._updateLeftConstraint(left);
        // Keep mouse pointer correct
        this.pointer[0] += newLeft-left;
        this.currentDrag.setStyle({left: newLeft + 'px'});
      }
      else 
        this.currentDrag.setStyle({right: parseFloat(this.currentDrag.getStyle('right')) - dx + 'px'});
      
      if (this.useTop) {
        var top =  parseFloat(this.currentDrag.getStyle('top')) + dy;
        var newTop = this._updateTopConstraint(top);
        // Keep mouse pointer correct
        this.pointer[1] += newTop - top;
        this.currentDrag.setStyle({top: newTop + 'px'});
      }
      else 
        this.currentDrag.setStyle({bottom: parseFloat(this.currentDrag.getStyle('bottom')) - dy + 'px'});

      this._notify("onMove");
    }
    if (this.iefix) 
      this._fixIEOverlapping(); 
      
    this._removeStoreLocation();
    Event.stop(event);
  },

   // endDrag callback
   _endDrag: function(event) {
    // Remove temporary div over iframes
     WindowUtilities.enableScreen('__invisible__');
    
    if (this.doResize)
      this._notify("onEndResize");
    else
      this._notify("onEndMove");
    
    // Release event observing
    Event.stopObserving(document, "mouseup", this.eventMouseUp,false);
    Event.stopObserving(document, "mousemove", this.eventMouseMove, false);

    Event.stop(event);
    
    this._hideWiredElement();

    // Store new location/size if need be
    this._saveCookie()
      
    // Restore selection
    document.body.ondrag = null;
    document.body.onselectstart = null;
  },

  _updateLeftConstraint: function(left) {
    if (this.constraint && this.useLeft && this.useTop) {
      var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;

      if (left < this.constraintPad.left)
        left = this.constraintPad.left;
      if (left + this.width + this.widthE + this.widthW > width - this.constraintPad.right) 
        left = width - this.constraintPad.right - this.width - this.widthE - this.widthW;
    }
    return left;
  },
  
  _updateTopConstraint: function(top) {
    if (this.constraint && this.useLeft && this.useTop) {        
      var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
      
      var h = this.height + this.heightN + this.heightS;

      if (top < this.constraintPad.top)
        top = this.constraintPad.top;
      if (top + h > height - this.constraintPad.bottom) 
        top = height - this.constraintPad.bottom - h;
    }
    return top;
  },
  
  _updateWidthConstraint: function(w) {
    if (this.constraint && this.useLeft && this.useTop) {
      var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
      var left =  parseFloat(this.element.getStyle("left"));

      if (left + w + this.widthE + this.widthW > width - this.constraintPad.right) 
        w = width - this.constraintPad.right - left - this.widthE - this.widthW;
    }
    return w;
  },
  
  _updateHeightConstraint: function(h) {
    if (this.constraint && this.useLeft && this.useTop) {
      var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
      var top =  parseFloat(this.element.getStyle("top"));

      if (top + h + this.heightN + this.heightS > height - this.constraintPad.bottom) 
        h = height - this.constraintPad.bottom - top - this.heightN - this.heightS;
    }
    return h;
  },
  
  
  // Creates HTML window code
  _createWindow: function(id) {
    var className = this.options.className;
    var win = document.createElement("div");
    win.setAttribute('id', id);
    win.className = "dialog";

    var content;
    if (this.options.url)
      content= "<iframe frameborder=\"0\" name=\"" + id + "_content\"  id=\"" + id + "_content\" src=\"" + this.options.url + "\"> </iframe>";
    else
      content ="<div id=\"" + id + "_content\" class=\"" +className + "_content\"> </div>";

    var closeDiv = this.options.closable ? "<div class='"+ className +"_close' id='"+ id +"_close' onclick='Windows.close(\""+ id +"\", event)'> </div>" : "";
    var minDiv = this.options.minimizable ? "<div class='"+ className + "_minimize' id='"+ id +"_minimize' onclick='Windows.minimize(\""+ id +"\", event)'> </div>" : "";
    var maxDiv = this.options.maximizable ? "<div class='"+ className + "_maximize' id='"+ id +"_maximize' onclick='Windows.maximize(\""+ id +"\", event)'> </div>" : "";
    var seAttributes = this.options.resizable ? "class='" + className + "_sizer' id='" + id + "_sizer'" : "class='"  + className + "_se'";
    var blank = "../themes/default/blank.gif";
    
    win.innerHTML = closeDiv + minDiv + maxDiv + "\
      <table id='"+ id +"_row1' class=\"top table_window\">\
        <tr>\
          <td class='"+ className +"_nw'></td>\
          <td class='"+ className +"_n'><div id='"+ id +"_top' class='"+ className +"_title title_window'>"+ this.options.title +"</div></td>\
          <td class='"+ className +"_ne'></td>\
        </tr>\
      </table>\
      <table id='"+ id +"_row2' class=\"mid table_window\">\
        <tr>\
          <td class='"+ className +"_w'></td>\
            <td id='"+ id +"_table_content' class='"+ className +"_content' valign='top'>" + content + "</td>\
          <td class='"+ className +"_e'></td>\
        </tr>\
      </table>\
        <table id='"+ id +"_row3' class=\"bot table_window\">\
        <tr>\
          <td class='"+ className +"_sw'></td>\
            <td class='"+ className +"_s'><div id='"+ id +"_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td>\
            <td " + seAttributes + "></td>\
        </tr>\
      </table>\
    ";
    Element.hide(win);
    this.options.parent.insertBefore(win, this.options.parent.firstChild);
    Event.observe($(id + "_content"), "load", this.options.onload);
    return win;
  },
  
  
  changeClassName: function(newClassName) {    
    var className = this.options.className;
    var id = this.getId();
    $A(["_close", "_minimize", "_maximize", "_sizer", "_content"]).each(function(value) { this._toggleClassName($(id + value), className + value, newClassName + value) }.bind(this));
    this._toggleClassName($(id + "_top"), className + "_title", newClassName + "_title");
    $$("#" + id + " td").each(function(td) {td.className = td.className.sub(className,newClassName); });
    this.options.className = newClassName;
  },
  
  _toggleClassName: function(element, oldClassName, newClassName) { 
    if (element) {
      element.removeClassName(oldClassName);
      element.addClassName(newClassName);
    }
  },
  
  // Sets window location
  setLocation: function(top, left) {
    top = this._updateTopConstraint(top);
    left = this._updateLeftConstraint(left);

    var e = this.currentDrag || this.element;
    e.setStyle({top: top + 'px'});
    e.setStyle({left: left + 'px'});

    this.useLeft = true;
    this.useTop = true;
  },
    
  getLocation: function() {
    var location = {};
    if (this.useTop)
      location = Object.extend(location, {top: this.element.getStyle("top")});
    else
      location = Object.extend(location, {bottom: this.element.getStyle("bottom")});
    if (this.useLeft)
      location = Object.extend(location, {left: this.element.getStyle("left")});
    else
      location = Object.extend(location, {right: this.element.getStyle("right")});
    
    return location;
  },
  
  // Gets window size
  getSize: function() {
    return {width: this.width, height: this.height};
  },
    
  // Sets window size
  setSize: function(width, height, useEffect) {    
    width = parseFloat(width);
    height = parseFloat(height);
    
    // Check min and max size
    if (!this.minimized && width < this.options.minWidth)
      width = this.options.minWidth;

    if (!this.minimized && height < this.options.minHeight)
      height = this.options.minHeight;
      
    if (this.options. maxHeight && height > this.options. maxHeight)
      height = this.options. maxHeight;

    if (this.options. maxWidth && width > this.options. maxWidth)
      width = this.options. maxWidth;

    
    if (this.useTop && this.useLeft && Window.hasEffectLib && Effect.ResizeWindow && useEffect) {
      new Effect.ResizeWindow(this, null, null, width, height, {duration: Window.resizeEffectDuration});
    } else {
      this.width = width;
      this.height = height;
      var e = this.currentDrag ? this.currentDrag : this.element;

      e.setStyle({width: width + this.widthW + this.widthE + "px"})
      e.setStyle({height: height  + this.heightN + this.heightS + "px"})

      // Update content size
      if (!this.currentDrag || this.currentDrag == this.element) {
        var content = $(this.element.id + '_content');
        content.setStyle({height: height  + 'px'});
        content.setStyle({width: width  + 'px'});
      }
    }
  },
  
  updateHeight: function() {
    this.setSize(this.width, this.content.scrollHeight, true);
  },
  
  updateWidth: function() {
    this.setSize(this.content.scrollWidth, this.height, true);
  },
  
  // Brings window to front
  toFront: function() {
    if (this.element.style.zIndex < Windows.maxZIndex)  
      this.setZIndex(Windows.maxZIndex + 1);
    if (this.iefix) 
      this._fixIEOverlapping(); 
  },
   
  getBounds: function(insideOnly) {
    if (! this.width || !this.height || !this.visible)  
      this.computeBounds();
    var w = this.width;
    var h = this.height;

    if (!insideOnly) {
      w += this.widthW + this.widthE;
      h += this.heightN + this.heightS;
    }
    var bounds = Object.extend(this.getLocation(), {width: w + "px", height: h + "px"});
    return bounds;
  },
      
  computeBounds: function() {
     if (! this.width || !this.height) {
      var size = WindowUtilities._computeSize(this.content.innerHTML, this.content.id, this.width, this.height, 0, this.options.className)
      if (this.height)
        this.width = size + 5
      else
        this.height = size + 5
    }

    this.setSize(this.width, this.height);
    if (this.centered)
      this._center(this.centerTop, this.centerLeft);    
  },
  
  // Displays window modal state or not
  show: function(modal) {
    this.visible = true;
    if (modal) {
      // Hack for Safari !!
      if (typeof this.overlayOpacity == "undefined") {
        var that = this;
        setTimeout(function() {that.show(modal)}, 10);
        return;
      }
      Windows.addModalWindow(this);
      
      this.modal = true;      
      this.setZIndex(Windows.maxZIndex + 1);
      Windows.unsetOverflow(this);
    }
    else    
      if (!this.element.style.zIndex) 
        this.setZIndex(Windows.maxZIndex + 1);        
      
    // To restore overflow if need be
    if (this.oldStyle)
      this.getContent().setStyle({overflow: this.oldStyle});
      
    this.computeBounds();
    
    this._notify("onBeforeShow");   
    if (this.options.showEffect != Element.show && this.options.showEffectOptions)
      this.options.showEffect(this.element, this.options.showEffectOptions);  
    else
      this.options.showEffect(this.element);  
      
    this._checkIEOverlapping();
    WindowUtilities.focusedWindow = this
    this._notify("onShow");   
  },
  
  // Displays window modal state or not at the center of the page
  showCenter: function(modal, top, left) {
    this.centered = true;
    this.centerTop = top;
    this.centerLeft = left;

    this.show(modal);
  },
  
  isVisible: function() {
    return this.visible;
  },
  
  _center: function(top, left) {    
    var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);    
    var pageSize = WindowUtilities.getPageSize(this.options.parent);    
    if (typeof top == "undefined")
      top = (pageSize.windowHeight - (this.height + this.heightN + this.heightS))/2;
    top += windowScroll.top
    
    if (typeof left == "undefined")
      left = (pageSize.windowWidth - (this.width + this.widthW + this.widthE))/2;
    left += windowScroll.left      
    this.setLocation(top, left);
    this.toFront();
  },
  
  _recenter: function(event) {     
    if (this.centered) {
      var pageSize = WindowUtilities.getPageSize(this.options.parent);
      var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);    

      // Check for this stupid IE that sends dumb events
      if (this.pageSize && this.pageSize.windowWidth == pageSize.windowWidth && this.pageSize.windowHeight == pageSize.windowHeight && 
          this.windowScroll.left == windowScroll.left && this.windowScroll.top == windowScroll.top) 
        return;
      this.pageSize = pageSize;
      this.windowScroll = windowScroll;
      // set height of Overlay to take up whole page and show
      if ($('overlay_modal')) 
        $('overlay_modal').setStyle({height: (pageSize.pageHeight + 'px')});
      
      if (this.options.recenterAuto)
        this._center(this.centerTop, this.centerLeft);    
    }
  },
  
  // Hides window
  hide: function() {
    this.visible = false;
    if (this.modal) {
      Windows.removeModalWindow(this);
      Windows.resetOverflow();
    }
    // To avoid bug on scrolling bar
    this.oldStyle = this.getContent().getStyle('overflow') || "auto"
    this.getContent().setStyle({overflow: "hidden"});

    this.options.hideEffect(this.element, this.options.hideEffectOptions);  

     if(this.iefix) 
      this.iefix.hide();

    if (!this.doNotNotifyHide)
      this._notify("onHide");
  },

  close: function() {
    // Asks closeCallback if exists
    if (this.visible) {
      if (this.options.closeCallback && ! this.options.closeCallback(this)) 
        return;

      if (this.options.destroyOnClose) {
        var destroyFunc = this.destroy.bind(this);
        if (this.options.hideEffectOptions.afterFinish) {
          var func = this.options.hideEffectOptions.afterFinish;
          this.options.hideEffectOptions.afterFinish = function() {func();destroyFunc() }
        }
        else 
          this.options.hideEffectOptions.afterFinish = function() {destroyFunc() }
      }
      Windows.updateFocusedWindow();
      
      this.doNotNotifyHide = true;
      this.hide();
      this.doNotNotifyHide = false;
      this._notify("onClose");
    }
  },
  
  minimize: function() {
    if (this.resizing)
      return;
    
    var r2 = $(this.getId() + "_row2");
    
    if (!this.minimized) {
      this.minimized = true;

      var dh = r2.getDimensions().height;
      this.r2Height = dh;
      var h  = this.element.getHeight() - dh;

      if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
        new Effect.ResizeWindow(this, null, null, null, this.height -dh, {duration: Window.resizeEffectDuration});
      } else  {
        this.height -= dh;
        this.element.setStyle({height: h + "px"});
        r2.hide();
      }

      if (! this.useTop) {
        var bottom = parseFloat(this.element.getStyle('bottom'));
        this.element.setStyle({bottom: (bottom + dh) + 'px'});
      }
    } 
    else {      
      this.minimized = false;
      
      var dh = this.r2Height;
      this.r2Height = null;
      if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
        new Effect.ResizeWindow(this, null, null, null, this.height + dh, {duration: Window.resizeEffectDuration});
      }
      else {
        var h  = this.element.getHeight() + dh;
        this.height += dh;
        this.element.setStyle({height: h + "px"})
        r2.show();
      }
      if (! this.useTop) {
        var bottom = parseFloat(this.element.getStyle('bottom'));
        this.element.setStyle({bottom: (bottom - dh) + 'px'});
      }
      this.toFront();
    }
    this._notify("onMinimize");
    
    // Store new location/size if need be
    this._saveCookie()
  },
  
  maximize: function() {
    if (this.isMinimized() || this.resizing)
      return;
  
    if (Prototype.Browser.IE && this.heightN == 0)
      this._getWindowBorderSize();
      
    if (this.storedLocation != null) {
      this._restoreLocation();
      if(this.iefix) 
        this.iefix.hide();
    }
    else {
      this._storeLocation();
      Windows.unsetOverflow(this);
      
      var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);
      var pageSize = WindowUtilities.getPageSize(this.options.parent);    
      var left = windowScroll.left;
      var top = windowScroll.top;
      
      if (this.options.parent != document.body) {
        windowScroll =  {top:0, left:0, bottom:0, right:0};
        var dim = this.options.parent.getDimensions();
        pageSize.windowWidth = dim.width;
        pageSize.windowHeight = dim.height;
        top = 0; 
        left = 0;
      }
      
      if (this.constraint) {
        pageSize.windowWidth -= Math.max(0, this.constraintPad.left) + Math.max(0, this.constraintPad.right);
        pageSize.windowHeight -= Math.max(0, this.constraintPad.top) + Math.max(0, this.constraintPad.bottom);
        left +=  Math.max(0, this.constraintPad.left);
        top +=  Math.max(0, this.constraintPad.top);
      }
      
      var width = pageSize.windowWidth - this.widthW - this.widthE;
      var height= pageSize.windowHeight - this.heightN - this.heightS;

      if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
        new Effect.ResizeWindow(this, top, left, width, height, {duration: Window.resizeEffectDuration});
      }
      else {
        this.setSize(width, height);
        this.element.setStyle(this.useLeft ? {left: left} : {right: left});
        this.element.setStyle(this.useTop ? {top: top} : {bottom: top});
      }
        
      this.toFront();
      if (this.iefix) 
        this._fixIEOverlapping(); 
    }
    this._notify("onMaximize");

    // Store new location/size if need be
    this._saveCookie()
  },
  
  isMinimized: function() {
    return this.minimized;
  },
  
  isMaximized: function() {
    return (this.storedLocation != null);
  },
  
  setOpacity: function(opacity) {
    if (Element.setOpacity)
      Element.setOpacity(this.element, opacity);
  },
  
  setZIndex: function(zindex) {
    this.element.setStyle({zIndex: zindex});
    Windows.updateZindex(zindex, this);
  },

  setTitle: function(newTitle) {
    if (!newTitle || newTitle == "") 
      newTitle = "&nbsp;";
      
    Element.update(this.element.id + '_top', newTitle);
  },
   
  getTitle: function() {
    return $(this.element.id + '_top').innerHTML;
  },
  
  setStatusBar: function(element) {
    var statusBar = $(this.getId() + "_bottom");

    if (typeof(element) == "object") {
      if (this.bottombar.firstChild)
        this.bottombar.replaceChild(element, this.bottombar.firstChild);
      else
        this.bottombar.appendChild(element);
    }
    else
      this.bottombar.innerHTML = element;
  },

  _checkIEOverlapping: function() {
    if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (navigator.userAgent.indexOf('Opera')<0) && (this.element.getStyle('position')=='absolute')) {
        new Insertion.After(this.element.id, '<iframe id="' + this.element.id + '_iefix" '+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
        this.iefix = $(this.element.id+'_iefix');
    }
    if(this.iefix) 
      setTimeout(this._fixIEOverlapping.bind(this), 50);
  },

  _fixIEOverlapping: function() {
      Position.clone(this.element, this.iefix);
      this.iefix.style.zIndex = this.element.style.zIndex - 1;
      this.iefix.show();
  },
  
  _getWindowBorderSize: function(event) {
    // Hack to get real window border size!!
    var div = this._createHiddenDiv(this.options.className + "_n")
    this.heightN = Element.getDimensions(div).height;    
    div.parentNode.removeChild(div)

    var div = this._createHiddenDiv(this.options.className + "_s")
    this.heightS = Element.getDimensions(div).height;    
    div.parentNode.removeChild(div)

    var div = this._createHiddenDiv(this.options.className + "_e")
    this.widthE = Element.getDimensions(div).width;    
    div.parentNode.removeChild(div)

    var div = this._createHiddenDiv(this.options.className + "_w")
    this.widthW = Element.getDimensions(div).width;
    div.parentNode.removeChild(div);
    
    var div = document.createElement("div");
    div.className = "overlay_" + this.options.className ;
    document.body.appendChild(div);
    //alert("no timeout:\nopacity: " + div.getStyle("opacity") + "\nwidth: " + document.defaultView.getComputedStyle(div, null).width);
    var that = this;
    
    // Workaround for Safari!!
    setTimeout(function() {that.overlayOpacity = ($(div).getStyle("opacity")); div.parentNode.removeChild(div);}, 10);
    
    // Workaround for IE!!
    if (Prototype.Browser.IE) {
      this.heightS = $(this.getId() +"_row3").getDimensions().height;
      this.heightN = $(this.getId() +"_row1").getDimensions().height;
    }

    // Safari size fix
    if (Prototype.Browser.WebKit && Prototype.Browser.WebKitVersion < 420)
      this.setSize(this.width, this.height);
    if (this.doMaximize)
      this.maximize();
    if (this.doMinimize)
      this.minimize();
  },
 
  _createHiddenDiv: function(className) {
    var objBody = document.body;
    var win = document.createElement("div");
    win.setAttribute('id', this.element.id+ "_tmp");
    win.className = className;
    win.style.display = 'none';
    win.innerHTML = '';
    objBody.insertBefore(win, objBody.firstChild);
    return win;
  },
  
  _storeLocation: function() {
    if (this.storedLocation == null) {
      this.storedLocation = {useTop: this.useTop, useLeft: this.useLeft, 
                             top: this.element.getStyle('top'), bottom: this.element.getStyle('bottom'),
                             left: this.element.getStyle('left'), right: this.element.getStyle('right'),
                             width: this.width, height: this.height };
    }
  },
  
  _restoreLocation: function() {
    if (this.storedLocation != null) {
      this.useLeft = this.storedLocation.useLeft;
      this.useTop = this.storedLocation.useTop;
      
      if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow)
        new Effect.ResizeWindow(this, this.storedLocation.top, this.storedLocation.left, this.storedLocation.width, this.storedLocation.height, {duration: Window.resizeEffectDuration});
      else {
        this.element.setStyle(this.useLeft ? {left: this.storedLocation.left} : {right: this.storedLocation.right});
        this.element.setStyle(this.useTop ? {top: this.storedLocation.top} : {bottom: this.storedLocation.bottom});
        this.setSize(this.storedLocation.width, this.storedLocation.height);
      }
      
      Windows.resetOverflow();
      this._removeStoreLocation();
    }
  },
  
  _removeStoreLocation: function() {
    this.storedLocation = null;
  },
  
  _saveCookie: function() {
    if (this.cookie) {
      var value = "";
      if (this.useLeft)
        value += "l:" +  (this.storedLocation ? this.storedLocation.left : this.element.getStyle('left'))
      else
        value += "r:" + (this.storedLocation ? this.storedLocation.right : this.element.getStyle('right'))
      if (this.useTop)
        value += ",t:" + (this.storedLocation ? this.storedLocation.top : this.element.getStyle('top'))
      else
        value += ",b:" + (this.storedLocation ? this.storedLocation.bottom :this.element.getStyle('bottom'))
        
      value += "," + (this.storedLocation ? this.storedLocation.width : this.width);
      value += "," + (this.storedLocation ? this.storedLocation.height : this.height);
      value += "," + this.isMinimized();
      value += "," + this.isMaximized();
      WindowUtilities.setCookie(value, this.cookie)
    }
  },
  
  _createWiredElement: function() {
    if (! this.wiredElement) {
      if (Prototype.Browser.IE)
        this._getWindowBorderSize();
      var div = document.createElement("div");
      div.className = "wired_frame " + this.options.className + "_wired_frame";
      
      div.style.position = 'absolute';
      this.options.parent.insertBefore(div, this.options.parent.firstChild);
      this.wiredElement = $(div);
    }
    if (this.useLeft) 
      this.wiredElement.setStyle({left: this.element.getStyle('left')});
    else 
      this.wiredElement.setStyle({right: this.element.getStyle('right')});
      
    if (this.useTop) 
      this.wiredElement.setStyle({top: this.element.getStyle('top')});
    else 
      this.wiredElement.setStyle({bottom: this.element.getStyle('bottom')});

    var dim = this.element.getDimensions();
    this.wiredElement.setStyle({width: dim.width + "px", height: dim.height +"px"});

    this.wiredElement.setStyle({zIndex: Windows.maxZIndex+30});
    return this.wiredElement;
  },
  
  _hideWiredElement: function() {
    if (! this.wiredElement || ! this.currentDrag)
      return;
    if (this.currentDrag == this.element) 
      this.currentDrag = null;
    else {
      if (this.useLeft) 
        this.element.setStyle({left: this.currentDrag.getStyle('left')});
      else 
        this.element.setStyle({right: this.currentDrag.getStyle('right')});

      if (this.useTop) 
        this.element.setStyle({top: this.currentDrag.getStyle('top')});
      else 
        this.element.setStyle({bottom: this.currentDrag.getStyle('bottom')});

      this.currentDrag.hide();
      this.currentDrag = null;
      if (this.doResize)
        this.setSize(this.width, this.height);
    } 
  },
  
  _notify: function(eventName) {
    if (this.options[eventName])
      this.options[eventName](this);
    else
      Windows.notify(eventName, this);
  }
};

// Windows containers, register all page windows
var Windows = {
  windows: [],
  modalWindows: [],
  observers: [],
  focusedWindow: null,
  maxZIndex: 0,
  overlayShowEffectOptions: {duration: 0.5},
  overlayHideEffectOptions: {duration: 0.5},

  addObserver: function(observer) {
    this.removeObserver(observer);
    this.observers.push(observer);
  },
  
  removeObserver: function(observer) {  
    this.observers = this.observers.reject( function(o) { return o==observer });
  },
  
  // onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
  notify: function(eventName, win) {  
    this.observers.each( function(o) {if(o[eventName]) o[eventName](eventName, win);});
  },

  // Gets window from its id
  getWindow: function(id) {
    return this.windows.detect(function(d) { return d.getId() ==id });
  },

  // Gets the last focused window
  getFocusedWindow: function() {
    return this.focusedWindow;
  },

  updateFocusedWindow: function() {
    this.focusedWindow = this.windows.length >=2 ? this.windows[this.windows.length-2] : null;    
  },
  
  // Registers a new window (called by Windows constructor)
  register: function(win) {
    this.windows.push(win);
  },
    
  // Add a modal window in the stack
  addModalWindow: function(win) {
    // Disable screen if first modal window
    if (this.modalWindows.length == 0) {
      WindowUtilities.disableScreen(win.options.className, 'overlay_modal', win.overlayOpacity, win.getId(), win.options.parent);
    }
    else {
      // Move overlay over all windows
      if (Window.keepMultiModalWindow) {
        $('overlay_modal').style.zIndex = Windows.maxZIndex + 1;
        Windows.maxZIndex += 1;
        WindowUtilities._hideSelect(this.modalWindows.last().getId());
      }
      // Hide current modal window
      else
        this.modalWindows.last().element.hide();
      // Fucking IE select issue
      WindowUtilities._showSelect(win.getId());
    }      
    this.modalWindows.push(win);    
  },
  
  removeModalWindow: function(win) {
    this.modalWindows.pop();
    
    // No more modal windows
    if (this.modalWindows.length == 0)
      WindowUtilities.enableScreen();     
    else {
      if (Window.keepMultiModalWindow) {
        this.modalWindows.last().toFront();
        WindowUtilities._showSelect(this.modalWindows.last().getId());        
      }
      else
        this.modalWindows.last().element.show();
    }
  },
  
  // Registers a new window (called by Windows constructor)
  register: function(win) {
    this.windows.push(win);
  },
  
  // Unregisters a window (called by Windows destructor)
  unregister: function(win) {
    this.windows = this.windows.reject(function(d) { return d==win });
  }, 
  
  // Closes all windows
  closeAll: function() {  
    this.windows.each( function(w) {Windows.close(w.getId())} );
  },
  
  closeAllModalWindows: function() {
    WindowUtilities.enableScreen();     
    this.modalWindows.each( function(win) {if (win) win.close()});    
  },

  // Minimizes a window with its id
  minimize: function(id, event) {
    var win = this.getWindow(id)
    if (win && win.visible)
      win.minimize();
    Event.stop(event);
  },
  
  // Maximizes a window with its id
  maximize: function(id, event) {
    var win = this.getWindow(id)
    if (win && win.visible)
      win.maximize();
    Event.stop(event);
  },

  // Closes a window with its id
  close: function(id, event) {
    var win = this.getWindow(id);
    if (win) 
      win.close();
    if (event)
      Event.stop(event);
  },
  
  blur: function(id) {
    var win = this.getWindow(id);  
    if (!win)
      return;
    if (win.options.blurClassName)
      win.changeClassName(win.options.blurClassName);
    if (this.focusedWindow == win)  
      this.focusedWindow = null;
    win._notify("onBlur");  
  },
  
  focus: function(id) {
    var win = this.getWindow(id);  
    if (!win)
      return;       
    if (this.focusedWindow)
      this.blur(this.focusedWindow.getId())

    if (win.options.focusClassName)
      win.changeClassName(win.options.focusClassName);  
    this.focusedWindow = win;
    win._notify("onFocus");
  },
  
  unsetOverflow: function(except) {    
    this.windows.each(function(d) { d.oldOverflow = d.getContent().getStyle("overflow") || "auto" ; d.getContent().setStyle({overflow: "hidden"}) });
    if (except && except.oldOverflow)
      except.getContent().setStyle({overflow: except.oldOverflow});
  },

  resetOverflow: function() {
    this.windows.each(function(d) { if (d.oldOverflow) d.getContent().setStyle({overflow: d.oldOverflow}) });
  },

  updateZindex: function(zindex, win) { 
    if (zindex > this.maxZIndex) {   
      this.maxZIndex = zindex;    
      if (this.focusedWindow) 
        this.blur(this.focusedWindow.getId())
    }
    this.focusedWindow = win;
    if (this.focusedWindow) 
      this.focus(this.focusedWindow.getId())
  }
};

var Dialog = {
  dialogId: null,
  onCompleteFunc: null,
  callFunc: null, 
  parameters: null, 
    
  confirm: function(content, parameters) {
    // Get Ajax return before
    if (content && typeof content != "string") {
      Dialog._runAjaxRequest(content, parameters, Dialog.confirm);
      return 
    }
    content = content || "";
    
    parameters = parameters || {};
    var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
    var cancelLabel = parameters.cancelLabel ? parameters.cancelLabel : "Cancel";

    // Backward compatibility
    parameters = Object.extend(parameters, parameters.windowParameters || {});
    parameters.windowParameters = parameters.windowParameters || {};

    parameters.className = parameters.className || "alert";

    var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'" 
    var cancelButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " cancel_button'" 
    var content = "\
      <div class='" + parameters.className + "_message'>" + content  + "</div>\
        <div class='" + parameters.className + "_buttons'>\
          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
          <input type='button' value='" + cancelLabel + "' onclick='Dialog.cancelCallback()' " + cancelButtonClass + "/>\
        </div>\
    ";
    return this._openDialog(content, parameters)
  },
  
  alert: function(content, parameters) {
    // Get Ajax return before
    if (content && typeof content != "string") {
      Dialog._runAjaxRequest(content, parameters, Dialog.alert);
      return 
    }
    content = content || "";
    
    parameters = parameters || {};
    var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";

    // Backward compatibility    
    parameters = Object.extend(parameters, parameters.windowParameters || {});
    parameters.windowParameters = parameters.windowParameters || {};
    
    parameters.className = parameters.className || "alert";
    
    var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'" 
    var content = "\
      <div class='" + parameters.className + "_message'>" + content  + "</div>\
        <div class='" + parameters.className + "_buttons'>\
          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
        </div>";                  
    return this._openDialog(content, parameters)
  },
  
  info: function(content, parameters) {   
    // Get Ajax return before
    if (content && typeof content != "string") {
      Dialog._runAjaxRequest(content, parameters, Dialog.info);
      return 
    }
    content = content || "";
     
    // Backward compatibility
    parameters = parameters || {};
    parameters = Object.extend(parameters, parameters.windowParameters || {});
    parameters.windowParameters = parameters.windowParameters || {};
    
    parameters.className = parameters.className || "alert";
    
    var content = "<div id='modal_dialog_message' class='" + parameters.className + "_message'>" + content  + "</div>";
    if (parameters.showProgress)
      content += "<div id='modal_dialog_progress' class='" + parameters.className + "_progress'>  </div>";

    parameters.ok = null;
    parameters.cancel = null;
    
    return this._openDialog(content, parameters)
  },
  
  setInfoMessage: function(message) {
    $('modal_dialog_message').update(message);
  },
  
  closeInfo: function() {
    Windows.close(this.dialogId);
  },
  
  _openDialog: function(content, parameters) {
    var className = parameters.className;
    
    if (! parameters.height && ! parameters.width) {
      parameters.width = WindowUtilities.getPageSize(parameters.options.parent || document.body).pageWidth / 2;
    }
    if (parameters.id)
      this.dialogId = parameters.id;
    else { 
      var t = new Date();
      this.dialogId = 'modal_dialog_' + t.getTime();
      parameters.id = this.dialogId;
    }

    // compute height or width if need be
    if (! parameters.height || ! parameters.width) {
      var size = WindowUtilities._computeSize(content, this.dialogId, parameters.width, parameters.height, 5, className)
      if (parameters.height)
        parameters.width = size + 5
      else
        parameters.height = size + 5
    }
    parameters.effectOptions = parameters.effectOptions ;
    parameters.resizable   = parameters.resizable || false;
    parameters.minimizable = parameters.minimizable || false;
    parameters.maximizable = parameters.maximizable ||  false;
    parameters.draggable   = parameters.draggable || false;
    parameters.closable    = parameters.closable || false;
    
    var win = new Window(parameters);
    win.getContent().innerHTML = content;
    
    win.showCenter(true, parameters.top, parameters.left);  
    win.setDestroyOnClose();
    
    win.cancelCallback = parameters.onCancel || parameters.cancel; 
    win.okCallback = parameters.onOk || parameters.ok;
    
    return win;    
  },
  
  _getAjaxContent: function(originalRequest)  {
      Dialog.callFunc(originalRequest.responseText, Dialog.parameters)
  },
  
  _runAjaxRequest: function(message, parameters, callFunc) {
    if (message.options == null)
      message.options = {}  
    Dialog.onCompleteFunc = message.options.onComplete;
    Dialog.parameters = parameters;
    Dialog.callFunc = callFunc;
    
    message.options.onComplete = Dialog._getAjaxContent;
    new Ajax.Request(message.url, message.options);
  },
  
  okCallback: function() {
    var win = Windows.focusedWindow;
    if (!win.okCallback || win.okCallback(win)) {
      // Remove onclick on button
      $$("#" + win.getId()+" input").each(function(element) {element.onclick=null;})
      win.close();
    }
  },

  cancelCallback: function() {
    var win = Windows.focusedWindow;
    // Remove onclick on button
    $$("#" + win.getId()+" input").each(function(element) {element.onclick=null})
    win.close();
    if (win.cancelCallback)
      win.cancelCallback(win);
  }
}
/*
  Based on Lightbox JS: Fullsize Image Overlays 
  by Lokesh Dhakar - http://www.huddletogether.com

  For more information on this script, visit:
  http://huddletogether.com/projects/lightbox/

  Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
  (basically, do anything you want, just leave my name and link)
*/

if (Prototype.Browser.WebKit) {
  var array = navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));
  Prototype.Browser.WebKitVersion = parseFloat(array[1]);
}

var WindowUtilities = {  
  // From dragdrop.js
  getWindowScroll: function(parent) {
    var T, L, W, H;
    parent = parent || document.body;              
    if (parent != document.body) {
      T = parent.scrollTop;
      L = parent.scrollLeft;
      W = parent.scrollWidth;
      H = parent.scrollHeight;
    } 
    else {
      var w = window;
      with (w.document) {
        if (w.document.documentElement && documentElement.scrollTop) {
          T = documentElement.scrollTop;
          L = documentElement.scrollLeft;
        } else if (w.document.body) {
          T = body.scrollTop;
          L = body.scrollLeft;
        }
        if (w.innerWidth) {
          W = w.innerWidth;
          H = w.innerHeight;
        } else if (w.document.documentElement && documentElement.clientWidth) {
          W = documentElement.clientWidth;
          H = documentElement.clientHeight;
        } else {
          W = body.offsetWidth;
          H = body.offsetHeight
        }
      }
    }
    return { top: T, left: L, width: W, height: H };
  }, 
  //
  // getPageSize()
  // Returns array with page width, height and window width, height
  // Core code from - quirksmode.org
  // Edit for Firefox by pHaez
  //
  getPageSize: function(parent){
    parent = parent || document.body;              
    var windowWidth, windowHeight;
    var pageHeight, pageWidth;
    if (parent != document.body) {
      windowWidth = parent.getWidth();
      windowHeight = parent.getHeight();                                
      pageWidth = parent.scrollWidth;
      pageHeight = parent.scrollHeight;                                
    } 
    else {
      var xScroll, yScroll;

      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 (self.innerHeight) {  // all except Explorer
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
      } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.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;
      }
    }             
    return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: windowWidth, windowHeight: windowHeight};
  },

  disableScreen: function(className, overlayId, overlayOpacity, contentId, parent) {
    WindowUtilities.initLightbox(overlayId, className, function() {this._disableScreen(className, overlayId, overlayOpacity, contentId)}.bind(this), parent || document.body);
  },

  _disableScreen: function(className, overlayId, overlayOpacity, contentId) {
    // prep objects
    var objOverlay = $(overlayId);

    var pageSize = WindowUtilities.getPageSize(objOverlay.parentNode);

    // Hide select boxes as they will 'peek' through the image in IE, store old value
    if (contentId && Prototype.Browser.IE) {
      WindowUtilities._hideSelect();
      WindowUtilities._showSelect(contentId);
    }  
  
    // set height of Overlay to take up whole page and show
    objOverlay.style.height = (pageSize.pageHeight + 'px');
    objOverlay.style.display = 'none'; 
    if (overlayId == "overlay_modal" && Window.hasEffectLib && Windows.overlayShowEffectOptions) {
      objOverlay.overlayOpacity = overlayOpacity;
      new Effect.Appear(objOverlay, Object.extend({from: 0, to: overlayOpacity}, Windows.overlayShowEffectOptions));
    }
    else
      objOverlay.style.display = "block";
  },
  
  enableScreen: function(id) {
    id = id || 'overlay_modal';
    var objOverlay =  $(id);
    if (objOverlay) {
      // hide lightbox and overlay
      if (id == "overlay_modal" && Window.hasEffectLib && Windows.overlayHideEffectOptions)
        new Effect.Fade(objOverlay, Object.extend({from: objOverlay.overlayOpacity, to:0}, Windows.overlayHideEffectOptions));
      else {
        objOverlay.style.display = 'none';
        objOverlay.parentNode.removeChild(objOverlay);
      }
      
      // make select boxes visible using old value
      if (id != "__invisible__") 
        WindowUtilities._showSelect();
    }
  },

  _hideSelect: function(id) {
    if (Prototype.Browser.IE) {
      id = id ==  null ? "" : "#" + id + " ";
      $$(id + 'select').each(function(element) {
        if (! WindowUtilities.isDefined(element.oldVisibility)) {
          element.oldVisibility = element.style.visibility ? element.style.visibility : "visible";
          element.style.visibility = "hidden";
        }
      });
    }
  },
  
  _showSelect: function(id) {
    if (Prototype.Browser.IE) {
      id = id ==  null ? "" : "#" + id + " ";
      $$(id + 'select').each(function(element) {
        if (WindowUtilities.isDefined(element.oldVisibility)) {
          // Why?? Ask IE
          try {
            element.style.visibility = element.oldVisibility;
          } catch(e) {
            element.style.visibility = "visible";
          }
          element.oldVisibility = null;
        }
        else {
          if (element.style.visibility)
            element.style.visibility = "visible";
        }
      });
    }
  },

  isDefined: function(object) {
    return typeof(object) != "undefined" && object != null;
  },
  
  // initLightbox()
  // Function runs on window load, going through link tags looking for rel="lightbox".
  // These links receive onclick events that enable the lightbox display for their targets.
  // The function also inserts html markup at the top of the page which will be used as a
  // container for the overlay pattern and the inline image.
  initLightbox: function(id, className, doneHandler, parent) {
    // Already done, just update zIndex
    if ($(id)) {
      Element.setStyle(id, {zIndex: Windows.maxZIndex + 1});
      Windows.maxZIndex++;
      doneHandler();
    }
    // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
    else {
      var objOverlay = document.createElement("div");
      objOverlay.setAttribute('id', id);
      objOverlay.className = "overlay_" + className
      objOverlay.style.display = 'none';
      objOverlay.style.position = 'absolute';
      objOverlay.style.top = '0';
      objOverlay.style.left = '0';
      objOverlay.style.zIndex = Windows.maxZIndex + 1;
      Windows.maxZIndex++;
      objOverlay.style.width = '100%';
      parent.insertBefore(objOverlay, parent.firstChild);
      if (Prototype.Browser.WebKit && id == "overlay_modal") {
        setTimeout(function() {doneHandler()}, 10);
      }
      else
        doneHandler();
    }    
  },
  
  setCookie: function(value, parameters) {
    document.cookie= parameters[0] + "=" + escape(value) +
      ((parameters[1]) ? "; expires=" + parameters[1].toGMTString() : "") +
      ((parameters[2]) ? "; path=" + parameters[2] : "") +
      ((parameters[3]) ? "; domain=" + parameters[3] : "") +
      ((parameters[4]) ? "; secure" : "");
  },

  getCookie: function(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
      begin = dc.indexOf(prefix);
      if (begin != 0) return null;
    } else {
      begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
      end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
  },
    
  _computeSize: function(content, id, width, height, margin, className) {
    var objBody = document.body;
    var tmpObj = document.createElement("div");
    tmpObj.setAttribute('id', id);
    tmpObj.className = className + "_content";

    if (height)
      tmpObj.style.height = height + "px"
    else
      tmpObj.style.width = width + "px"
  
    tmpObj.style.position = 'absolute';
    tmpObj.style.top = '0';
    tmpObj.style.left = '0';
    tmpObj.style.display = 'none';

    tmpObj.innerHTML = content;
    objBody.insertBefore(tmpObj, objBody.firstChild);

    var size;
    if (height)
      size = $(tmpObj).getDimensions().width + margin;
    else
      size = $(tmpObj).getDimensions().height + margin;
    objBody.removeChild(tmpObj);
    return size;
  }  
}


// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Readform(Readform.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


				var pkg_deleted_rows = new Object();
				function pkg_delete_row(tbl, id, undelete) {
					pkg_delete_rows[tbl + '_' + id] = undelete ? false :true;
				}
				
				function readform(varframe) {
				//alert('Readform');
					var hiddens=0;
					var items=0;
					var totalitems=0;
					var bFirstInput=true;
					var straction='';
					var frm = document.frmUpdate;

					//alert('Reading frmSelections...');
					//alert(varframe);
					if(varframe){
						Elements = varframe.frmSelections.getElementsByTagName("input");
					}else{
						Elements = document.frmSelections.getElementsByTagName("input");
					}
					totalitems = Elements.length;
					//alert(totalitems+' INPUT elements found in frmSelections');
					
					//document.frmUpdate.pkg.value='';
					document.frmUpdate.pkg2.value='';

					//alert(totalitems+' INPUT elements found in frmSelections\n'+hiddens+' of which are hidden INPUT elements');
					
					//find input elements
					var v_str = 'v';
					for (var i=0; i<Elements.length; i++) {
						//alert('type='+Elements[i].getAttribute("type")+' Label='+Elements[i].getAttribute("Label")+' value='+Elements[i].value);
						if(Elements[i].getAttribute("pkg")) {
							v_str = Elements[i].getAttribute('v_str') ? Elements[i].getAttribute('v_str') : 'v';  
							//alert(v_str);
							el = Elements[i];
							pkg = el.getAttribute("pkg");
							//if (Elements[i].getAttribute("Changed")==1) alert('pkg: ' + Elements[i].parentNode.innerHTML);
							if (el.getAttribute("first") == "yes" && el.getAttribute("new") == "yes" && el.getAttribute("Changed")==1) {
								straction = "@@a=i";
								//bFirstInput = false;
							} else if (el.getAttribute("del") ) {
								straction = '@@a=d';
								
							} else {
								straction = "@@a=i2";
							}
							//alert('ID='+Elements[i].getAttribute("ID")+'\nLabel='+Elements[i].getAttribute("Label")+'='+Elements[i].value);
							if(el.getAttribute("Changed")==1 && el.getAttribute("type") != "hidden") {
								if (el.getAttribute("ID").indexOf ("INPUT") > -1 && el.getAttribute("ID").indexOf ("ID") > -1){
									var str = el.getAttribute("ID").match(/\d{1,}/);
									if (el.getAttribute("new") == "yes"){
										document.frmUpdate.pkg2.value += '|@@i='+str+pkg+v_str+'='+Elements[i].value+'!#!#@@'+straction+'@@|'
									}else{
										document.frmUpdate.pkg2.value += '|@@i='+str+Elements[i].getAttribute("pkg")+v_str+'='+Elements[i].value+'!#!#'+'@@|'
									}										
									document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
								}
								else{
									recid = el.getAttribute("RecID");
									if (recid==null) recid = el.getAttribute("ID");

									if (el.getAttribute("new") == "yes"){
										document.frmUpdate.pkg2.value += '|@@i='+recid+pkg+v_str+'='+Elements[i].value+'!#!#@@'+straction+'@@|'
									} else{
									document.frmUpdate.pkg2.value += '|@@i='+recid+pkg+v_str+'='+Elements[i].value+'!#!#'+'@@|'
									}
									document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
								}
							}
							else { 
								if (el.getAttribute("type") == "hidden" && el.getAttribute("Changed")==1){
									//alert('hidden ID='+el.getAttribute("ID")+',pkg='+pkg+',value='+el.value);
									recid = el.getAttribute("RecID");
									if (recid==null)
										recid = el.getAttribute("ID");
									if (el.getAttribute("new") == "yes"){							
										document.frmUpdate.pkg2.value += '|@@i='+recid+straction+'@@'+pkg;
									} else{
										//document.frmUpdate.pkg2.value += '|@@i='+recid+'@@'+Elements[i].getAttribute("pkg");
										//document.frmUpdate.pkg2.value += '|@@i='+recid+Elements[i].getAttribute("pkg")+v_str+'='+Elements[i].value+'!#!#'+'@@|'
										if (pkg.indexOf("@v=") > -1 && Elements[i].value) {
											pos = pkg.indexOf("@v=");
											document.frmUpdate.pkg2.value += '|@@i='+recid+pkg.substring(0,pos)+'@v='+el.getAttribute("value")+'!#!#'+'@@|';
											}
										else
											document.frmUpdate.pkg2.value += '|@@i='+recid+pkg+'v='+el.getAttribute("value")+'!#!#'+'@@|';

									}
									try{
										if (el.getAttribute("popup") == "yes"){
											document.frmUpdate.pkg2.value += '@@'+v_str+'='+Elements[i].value+'!#!#'+'@@|'
										}
									}
									catch (error){}
									document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;	

									//alert('pkg2='+document.frmUpdate.pkg2.value);
								}
							}
						}
					}

					//find textarea elements
					//alert('checking textareas...');
					Elements = document.frmSelections.getElementsByTagName("textarea");
					for (var i=0; i<Elements.length; i++) {
						if(Elements[i].getAttribute("pkg")) {
							v_str = Elements[i].getAttribute('v_str') ? Elements[i].getAttribute('v_str') : 'v';  
							
							if(Elements[i].getAttribute("Changed")==1) {
								recid = Elements[i].getAttribute("RecID");
								if (recid==null) recid = Elements[i].getAttribute("ID");
								document.frmUpdate.pkg2.value += '|@@i='+recid+Elements[i].getAttribute("pkg")+v_str+'='+Elements[i].value+'!#!#'+'@@|'
								document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
							}
						}
					}


					//find drop-down elements
					//alert('checking selects...');
					Elements = document.frmSelections.getElementsByTagName("select");
					for (var i=0; i<Elements.length; i++) {
						//alert(Elements[i].children.length);
						//alert(Elements[i].id);
						if(Elements[i].getAttribute("pkg") && Elements[i].getAttribute("Changed")) {
							 v_str = Elements[i].getAttribute('v_str') ? Elements[i].getAttribute('v_str') : 'v';  
							
							//alert('Select with pkg:'+Elements[i].getAttribute("pkg"));
							items = items + 1;
							pkg = Elements[i].getAttribute("pkg");
							opts = Elements[i].options;
							//alert(opts.length+' item(s) in select');
							for (var i3=0; i3<opts.length; i3++) {
								//alert(opts[i3].innerText);
								if (opts[i3].selected) {
									//alert(opts[i3].innerText+' selected');
									if (opts[i3].value) {
										//alert('value='+opts[i3].value+'  innerText='+opts[i3].innerText);
										//document.frmUpdate.pkg.value += '|'+Elements[i].getAttribute("ID")+'='+opts[i3].value+'|'
										if (Elements[i].getAttribute("Changed")==1) {
											//alert('Changed');
											//MWC: newID was not getting set
											recid = Elements[i].getAttribute("RecID");
											if (recid==null) recid = Elements[i].getAttribute("ID");
											newID = recid; //Elements[i].getAttribute("ID")
											document.frmUpdate.pkg2.value += '|@@i='+newID+Elements[i].getAttribute("pkg")+v_str+'='+opts[i3].value+'!#!#'+'@@|'
											//document.frmUpdate.pkg2.value += '|@@i='+Elements[i].getAttribute("ID")+Elements[i].getAttribute("pkg")+'v='+opts[i3].value+'@@|'
											}
										}
									else {
										//document.frmUpdate.pkg.value += '|'+Elements[i].getAttribute("ID")+'='+opts[i3].innerText+'|'
										if(Elements[i].getAttribute("Changed")==1) {
											recid = Elements[i].getAttribute("RecID");
											if (recid==null) recid = Elements[i].getAttribute("ID");
											//alert(newID);
											document.frmUpdate.pkg2.value += '|@@i='+recid+Elements[i].getAttribute("pkg")+v_str+'='+opts[i3].innerText+'!#!#'+'@@|'
											}
										}
									//document.frmUpdate.size.value = document.frmUpdate.pkg.value.length;
									document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
								}
							}
						}
					}
					//alert('Pkg built reading '+items+' of '+totalitems+' items');
					//alert('Pkg='+document.frmUpdate.pkg2.value);
					
					try {
						frm.CurrURL.value = document.frmSelections.CurrURL.value;
						frm.Page.value = document.frmSelections.Page.value;
						frm.PageID.value = document.frmSelections.PageID.value;
						frm.LastUpdated.value = document.frmSelections.LastUpdated.value;
						frm.EndAction.value = document.frmSelections.EndAction.value;
						frm.FormatOption.value = document.frmSelections.FormatOption.value;
						frm.Saved.value = document.frmSelections.Saved.value;
						//added to catch pre-made packages pushed into 'pkg' and add them onto pkg2
						frm.pkg2.value = frm.pkg2.value + document.frmUpdate.pkg.value;
						//frm.pkg.value = '';
						frm.size2.value = frm.pkg2.value.length;
						document.frmSelections.pkg2.value = frm.pkg2.value;
						//alert(frm.pkg2.value);
					} catch (e) {}
				}

					function showdiv(div) {
						//alert(document.getElementById(div).innerHTML);
						//alert(document.getElementById(div).style.display); 
						//alert(document.getElementById(div).style.visibility); 
						document.getElementById(div).style.display="normal"; 
						document.getElementById(div).style.visibility="visible"; 
						document.getElementById(div).style.zIndex=500; 
						}
						
					function hidediv(div) {
						document.getElementById(div).style.visibility="hidden"; 
						}



				function readformbyrow() {
					var hiddens=0;
					var items=0;
					var totalitems=0;
					var bFirstInput=true;
					var straction='';
				
					//alert('readformbyrow');

					Elements = document.frmSelections.getElementsByTagName("table");
					//alert(Elements.length+ ' tables');
					for (var i=0; i<Elements.length; i++) {
						if(Elements[i].getAttribute("tableid")) {
							//alert(Elements[i].getAttribute("tableid"));
							tbl = Elements[i];
						}
					}

					//document.frmUpdate.pkg.value='';
					document.frmUpdate.pkg2.value='';

					//alert(tbl.rows.length-1+' rows');	//don't count header row
					for (var i=1; i<tbl.rows.length; i++) {
						tr = tbl.rows[i];
						if(tr.getAttribute("Changed")==1) {
							//alert('row '+i+' changed.');
							//alert(totalitems+' INPUT elements found in frmSelections\n'+hiddens+' of which are hidden INPUT elements');

							document.frmUpdate.pkg2.value += '|row='+i
							
							//find input elements
							Elements = tr.getElementsByTagName("INPUT");
							//alert(Elements.length+' INPUT elements in this row.')
							for (var i2=0; i2<Elements.length; i2++) {
								if(Elements[i2].getAttribute("pkg")) {
									fld = Elements[i2];
									pkg = fld.getAttribute("pkg");
									if (pkg.substr(0,2) =='@@') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(0,2) =='f=') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(pkg.length-2,2) =='@@') pkg = pkg.substr(0,pkg.length-2);
									pkg=pkg.replace('@@v=','=')
									//if (fld.getAttribute("Changed")==1) alert('pkg: ' + fld.parentNode.innerHTML);
									if (fld.getAttribute("first") == "yes" && fld.getAttribute("new") == "yes" && fld.getAttribute("Changed")==1) {
										straction = "@@a=i";
										//bFirstInput = false;
									} else {
										straction = "@@a=new";
									}
									//alert('pkg='+pkg+'\nID='+fld.getAttribute("ID")+'\nLabel='+fld.getAttribute("Label")+'\nvalue='+fld.value);
									if(fld.getAttribute("Changed")==1 && fld.getAttribute("type") != "hidden") {
										if (fld.getAttribute("ID").indexOf("INPUT") > -1 && fld.getAttribute("ID").indexOf("ID") > -1){
											var str = fld.getAttribute("ID").match(/\d{1,}/)
											if (Elements[i].getAttribute("new") == "yes"){
												document.frmUpdate.pkg2.value += '|'+pkg+'='+fld.value+'!#!#@@'+straction+'@@|'
											}else{
												document.frmUpdate.pkg2.value += '|'+pkg+'='+fld.value+'!#!#'+'@@|'
											}										
											document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
										}
										else{
											if (fld.getAttribute("new") == "yes"){
												document.frmUpdate.pkg2.value += '|'+pkg+'v='+fld.value+'!#!#@@'+straction+'@@|'
											} else{
											document.frmUpdate.pkg2.value += '|'+pkg+'='+fld.value+'!#!#'+'@@|'
											}
											document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
										}
									}
									else { 
										if (fld.getAttribute("type") == "hidden" && fld.getAttribute("Changed")==1){
											if (fld.getAttribute("new") == "yes"){							
												document.frmUpdate.pkg2.value += '|'+pkg;
											} else{
												document.frmUpdate.pkg2.value += '|'+pkg+'='+fld.value;
											}
											try{
												if (fld.getAttribute("popup") == "yes"){
													document.frmUpdate.pkg2.value += '='+fld.value+'!#!#'+'@@|'
												}
											}
											catch (error){}
											document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;	
										}
									}
								}
							}
		
							//find textarea elements
							Elements = tr.getElementsByTagName("textarea");
							for (var i2=0; i2<Elements.length; i2++) {
								if(Elements[i2].getAttribute("pkg")) {
									fld = Elements[i2];
									pkg = fld.getAttribute("pkg");
									if (pkg.substr(0,2) =='@@') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(0,2) =='f=') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(pkg.length-2,2) =='@@') pkg = pkg.substr(0,pkg.length-2);
									pkg=pkg.replace('@@v=','=')
									if (pkg.substr(0,2) =='@@') pkg = pkg.substr(2,pkg.length);
									if(fld.getAttribute("Changed")==1) {
										document.frmUpdate.pkg2.value += '|'+pkg+'='+fld.value+'!#!#'+'@@|'
										document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
									}
								}
							}
		
		
							//find drop-down elements
							Elements = tr.getElementsByTagName("select");
							for (var i2=0; i2<Elements.length; i2++) {
								//alert(Elements[i2].children.length);
								if(Elements[i2].getAttribute("pkg") && Elements[i2].getAttribute("Changed")) {
									fld = Elements[i2];
									pkg = fld.getAttribute("pkg");
									if (pkg.substr(0,2) =='@@') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(0,2) =='f=') pkg = pkg.substr(2,pkg.length);
									if (pkg.substr(pkg.length-2,2) =='@@') pkg = pkg.substr(0,pkg.length-2);
									pkg=pkg.replace('@@v=','=')

									if (pkg.substr(0,2) =='@@') pkg = pkg.substr(2,pkg.length);
									//alert('Select with pkg:'+fld.getAttribute("pkg"));
									items = items + 1;
									opts = fld.options;
									//alert(opts.length+' item(s) in select');
									for (var i3=0; i3<opts.length; i3++) {
										//alert(opts[i3].innerText);
										if(opts[i3].selected) {
											//alert(opts[i3].innerText+' selected');
											if(opts[i3].value) {
												//alert('value='+opts[i3].value+'  innerText='+opts[i3].innerText);
												if(Elements[i2].getAttribute("Changed")==1) {
													//alert('Changed');
													//MWC: newID was not getting set
													newID = Elements[i2].getAttribute("ID")
													document.frmUpdate.pkg2.value += '|'+pkg+'='+opts[i3].value+'!#!#'+'@@|'
													//document.frmUpdate.pkg2.value += '|'+pkg+'='+opts[i3].value+'@@|'
													}
												}
											else {
												//document.frmUpdate.pkg.value += '|'+pkg+'='+opts[i3].innerText+'|'
												if(Elements[i2].getAttribute("Changed")==1) {
													document.frmUpdate.pkg2.value += '|'+pkg+'='+opts[i3].innerText+'!#!#'+'@@|'
													}
												}
											//document.frmUpdate.size.value = document.frmUpdate.pkg.value.length;
											document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
										}
									}
								}
							}
							document.frmUpdate.pkg2.value += 'endrow|'


						}
					}
					//alert(document.frmUpdate.pkg2.value);
	
					//alert('Pkg built reading '+items+' of '+totalitems+' items');

					document.frmUpdate.CurrURL.value = document.frmSelections.CurrURL.value;
					document.frmUpdate.Page.value = document.frmSelections.Page.value;
					document.frmUpdate.PageID.value = document.frmSelections.PageID.value;
					document.frmUpdate.LastUpdated.value = document.frmSelections.LastUpdated.value;
					document.frmUpdate.EndAction.value = document.frmSelections.EndAction.value;
					document.frmUpdate.FormatOption.value = document.frmSelections.FormatOption.value;
					document.frmUpdate.Saved.value = document.frmSelections.Saved.value;
					document.frmSelections.pkg2.value = document.frmUpdate.pkg2.value;
				}
				
				
				function findtable() {
					Elements = document.frmSelections.getElementsByTagName("table");
					//alert(Elements.length+ ' tables');
					for (var i=0; i<Elements.length; i++) {
						if(Elements[i].getAttribute("tableid")) {
							//alert(Elements[i].getAttribute("tableid"));
							tbl = Elements[i];
						}
					}
					//alert(tbl.rows.length-1);	//don't count header row
					for (var i=1; i<tbl.rows.length; i++) {
						if(tbl.rows[i].getAttribute("Changed")==1) {
							//alert('row changed.');
						}
					}
				
					
				}

				function clearChanged() {
					//alert('clearChanged()');
					Elements = document.frmSelections.getElementsByTagName("input");
				
					//find input elements
					for (var i=0; i<Elements.length; i++) {
						if(Elements[i].getAttribute("pkg")) {
							el = Elements[i];
							pkg = el.getAttribute("pkg");
							if (el.getAttribute("Changed")==1) {
								//alert('pkg: ' + el.parentNode.innerHTML);
								el.setAttribute("Changed","0");
							}
						}
					}


					//find textarea elements
					Elements = document.frmSelections.getElementsByTagName("textarea");
					for (var i=0; i<Elements.length; i++) {
						if(Elements[i].getAttribute("pkg")) {
							Elements[i].setAttribute("Changed","0");
						}
						else {
							if (Elements.item(i).getAttribute("htmledit")=='1'){ 
								Elements[i].setAttribute("Changed","0")
							}
						}
					}

					document.frmUpdate.pkg.value='';
				}





// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file Package_update(Package_update.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,


var curr_updates = new Array();
var curr_updates_lookup = new Object();
//var toggled_deletes = new Array();
//var toggled_deletes_lookup = new Object();
var toggled_deletes = new Object();
var tracked_fld_names = new Object();
var fields_needing_pre_save = new Object();
var pre_save_request = new Object();
var field_list

function field_needs_pre_save(tbl, fld, type, opt_params) {
	//fields_needing_pre_save[tbl + '_' + fld] = [type, opt_params];
	fields_needing_pre_save[tbl + '_' + fld] = [type, opt_params];
}
function possible_pre_save(tbl, fld, id, new_value) {
	if (!fields_needing_pre_save[tbl + '_' + fld]) return false;
	pre_save_request[tbl + '_' + fld] = new Array(tbl, fld, id, new_value);
	return true;
}

function build_pre_save_request() {
	var retStr='';
	for (obj_key in pre_save_request) {
		var obj = pre_save_request[obj_key];
		//retStr += '<CHECK type="' + fields_needing_pre_save[obj_key] + '" field="' + obj[1] + '" id="' + obj[2] + '" value="' + obj[3] + '"/>';
		retStr += fields_needing_pre_save[obj_key][0].replace('"', '""') + '("' + obj[0].replace('"', '""') + '", "' + obj[1].replace('"', '""') + '", "' + obj[2].replace('"', '""') + '", "' + obj[3].replace('"', '""') + '"';
		for (var j=0; j < fields_needing_pre_save[obj_key][1].length; j++) {
			retStr += ',"' + fields_needing_pre_save[obj_key][1][j] + '"'
		}
		retStr += ')\';';
	}
	
	return retStr;
	//return 'test';
}
function verify_pre_saves() {
	
	try {
		var str = build_pre_save_request();
		if (!str || str == '') return true;
		exec_pre_save(str);
		return false;
	} catch (e) {
		document.frmUpdate.submit();	
	}
}

function setup_update() {
	parent.doUpdate=doUpdate;
	parent.generate_update_obj = generate_update_obj;
	parent.queue_for_update_direct = queue_for_update_direct;
	parent.queue_for_update = queue_for_update;
	parent.frmUpdate = document.frmUpdate;
	parent.mark_for_deletion = mark_for_deletion;
	parent.mark_for_deletion_direct = mark_for_deletion_direct;
	parent.dump = dump;
	parent.flush_dump = flush_dump;
	parent.outstandingUpdates = outstandingUpdates;
	parent.newStyleUpdate = true;
}
function processSave(str) {
	if (parent.processSave) parent.processSave(str);
	parent.document.frmSelections.Saved.value = 1;
}
function getDeleteObj(table_name) {
	/*var base_array;
	var lookup = toggled_deletes_lookup[table_name];
	if (!lookup && lookup != 0) {
		toggled_deletes.push(base_array = new Object());
		toggled_deletes_lookup[table_name] = toggled_deletes.length - 1;
	} else {
		base_array = toggled_deletes[ lookup ];
	}*/
	var base_array = toggled_deletes[table_name];
	if (!base_array) base_array = toggled_deletes[table_name] = new Object();
	return base_array;
}
function getFldNamesObj(table_name) {
	var base_array = tracked_fld_names[table_name];
	if (!base_array) base_array =  tracked_fld_names[table_name] = new Object();
	return base_array;
}
function getTableUpdates(table_name) {
	var base_array;
	var lookup = curr_updates_lookup[table_name];
	if (!lookup && lookup != 0) {
		// if no updates for this table have occured yet, then setup the array
		curr_updates.push(base_array = new Object());
		curr_updates_lookup[table_name] = curr_updates.length - 1;
		// data will store the changes and id_lookup will allow me to find changes for a given id
		base_array['data'] = new Array();
		base_array['memo'] = new Array();
		base_array['id_lookup'] = new Object();
		base_array['name'] = table_name;
	} else {
		base_array = curr_updates[ lookup ];
	}
	return base_array;
}
var dump_store = new Array();
function flush_dump() {
		document.frmUpdate.thedump.value=dump_store.join('\n');
		dump_store = new Array();
}
function dump(str, store_only) {
	if (!parent.debug_) return;
	try {
		if (store_only)
				  dump_store.push(str);
		else
				  document.frmUpdate.thedump.value=document.frmUpdate.thedump.value + str  + '\n';
	} catch (e) {}
}
var addItemSuffix=1;
function getNextID() {
	return 'n_e_w' + addItemSuffix++;
}
function generate_update_obj(tbl, fld, id, value) {
	var obj = document.createElement('span');
	obj.setAttribute('tbl', tbl);
	obj.setAttribute('fld', fld);
	obj.setAttribute('id', id);
	obj.setAttribute('value', value);
	return obj;
}
function queue_for_update_direct(tbl, fld, id, value) {
	queue_for_update(generate_update_obj(tbl, fld, id, value));
}

function get_tbl_name(obj) {
	return get_attr_name(obj, 'tbl')
}
function get_fld_name(obj) {
	return get_attr_name(obj, 'fld')
}
function get_attr_name(obj, attr) {
	var reg_find_props = new Object();
	reg_find_props['tbl'] = new RegExp("@t=([^@]*)@", "gi");
	reg_find_props['fld'] = new RegExp("@f=([^@]*)@", "gi");
	var prop = obj.getAttribute(attr)
	if (prop) return prop;
	prop = obj.getAttribute('pkg');
	if (!prop) return 'Information';
	var matches = reg_find_props[attr].exec(prop);
	if (matches && matches[1]) return matches[1];
	return 'Information'
}

function get_field_list_array(tbl) {
	var list_ele, list_obj = getFldNamesObj(tbl);
	var list_array = new Array();
	for (list_ele in list_obj) {
		list_array.push(list_ele);
   }
	return list_array;
}
function store_fld_name(tbl, fld) {
	var list = getFldNamesObj(tbl);
	list[fld] = true;
}
function queue_for_update(obj, oldstyle, linked_recs) {
	//if (objs[j].getAttribute('deleted') = 'yes') return;
	// I don't check for checkboxes here because a condition to check for them would
	//slow down every queue. Instead, I set the value of a checkbox prior to calling
	var base_array;
	var tbl = obj.getAttribute('tbl');
	var fld = obj.getAttribute('fld');
	var pkg = obj.getAttribute('pkg');
	var pkg = '|' + (pkg ? pkg : '') + (tbl ? '@@t=' + tbl : '') + (fld ? '@@f=' + fld : '');
	if (!tbl) tbl = get_tbl_name(obj);
	if (!fld) fld = get_fld_name(obj);
	
	store_fld_name(tbl, fld);
	
	//var id = obj.getAttribute('id');
	var id = obj.getAttribute('RecID')
	if (!id||id=='@xID@') id = obj.getAttribute('id');
	var val = obj.getAttribute('value');
	 
	var found_selected = false;
	if (obj.nodeName && obj.nodeName == 'SELECT') {
		val = '';
		for (var j=0; j < obj.options.length; j++) {
			if (obj.options[j].selected == true) {
				if (val.length > 0) val += '**';
				if (!obj.options[j].value) val += obj.options[j].text; 
				else val += obj.options[j].value;
				found_selected = true
			}
		}
		if (!found_selected) val = obj.getAttribute('InitVal');
	}
	if (obj.getAttribute('save_eval')) eval(obj.getAttribute('save_eval'));
	var action = '';
	if (id.substr(0, 5) == 'n_e_w') action = '@@a=i2';
	//var str = '|' + action + (pkg ? pkg : '') + (tbl ? '@@t=' + tbl : '') + (fld ? '@@f=' + fld : '') + '@@i=' + id + '@@v2=' + val + '!#!#' + '@@|';
	if (pkg=='|') pkg='@@t=Information@@';
	var str = '|' + (pkg ? pkg : '') + action + '@@i=' + id + '@@v2=' + val + '!#!#' + '@@|';
	//alert(pkg);

	if (linked_recs)
		for (var j=0; j < linked_recs.length; j++) {
			var str2 = '|@@a=i2@@t=' + get_tbl_name(linked_recs[j]) + '@@f=' + get_fld_name(linked_recs[j]) + '@@i=' + linked_recs[j].getAttribute('id') + '@@v2=' + linked_recs[j].getAttribute('value') + '!#!#' + '@@|';
			alert(str2);
			str = str + str2;
		}
/*	if (memo) {
		var memo_id;
		var str2 = '|@@a=i2@@i=' + memo_id=getNextID() + '@@t=Memo@@f=text@@v2=' + memo + '!#!#' + '@@|';
		var str2 = '|@@a=i2@@i=' + memo_id + '@@t=Memo@@f=linkedto@@v2=' + memopage + '!#!#' + '@@|';
	}*/
	if (!tbl) tbl = 'Information';
	var base_array = getTableUpdates(tbl);
	var pos = base_array['id_lookup'][id + fld];		// look for prev changes to this item
	if (!pos && pos != 0) {
		// if no previous changes to this id, add the change to data, and add that position to the id_lookup
		base_array['data'].push(str);
		//base_array['memo'].push(memo);
		base_array['id_lookup'][id + fld] = base_array['data'].length - 1;
	} else {
		// otherwise, update the outstanding change to this item
		base_array['data'][ pos ] = str;
		//base_array['memo'][ pos ] = memo;
	}
	possible_pre_save(tbl, fld, id, val);
}
function mark_for_deletion_direct(tbl, id, fields, memo) {
	var obj = document.createElement('SPAN');
	obj.setAttribute('tbl', tbl);
	obj.setAttribute('id', id);
	//obj.setAttribute('fields', fields);
	//alert(tbl + ':' + id + ':' + fields);
	mark_for_deletion(obj, fields, memo);
}

function delete_row(tbl, obj, fields, memo) {
	while (obj.nodeName != 'TR' && obj.parentNode) obj = obj.parentNode;
	if (obj.nodeName != 'TR') return;
	mark_for_deletion(obj, fields, memo)
}

function mark_for_deletion(obj, fields, memo) {
	// this function is used when the delete removes the item from the table. No further action for this item
	//  can occur because it's data in the update table is cleared. If you were to undo the delete, it would need to
	//  find all of the inputs to restablish the current data for the id. For situations where
	//  deletes can be toggled (a checkbox to delete a row), use mark_for_delete_toggle
	var inputs, table_name, fld, id;
	if (obj.nodeName == 'TR') {
		inputs = obj.getElementsByTagName('INPUT');
		//tbl = inputs[0].getAttribute('tbl');
		tbl = get_tbl_name(inputs[0]);
		var base_array = getTableUpdates(tbl);
	} else {
		//tbl = obj.getAttribute('tbl');
		tbl = get_tbl_name(inputs[0]);
		var base_array = getTableUpdates(tbl);
		//alert('BA: ' + base_array);
		id = obj.getAttribute('RecID')
		if (!id) id = obj.getAttribute('id');
		//var fields = obj.getAttribute('fields').split(',');
		fields = get_field_list_array(tbl);
		for (var j=0; j < fields.length; j++){
			fld = fields[j];
			//alert('F' + fld);
			var pos = base_array['id_lookup'][id + fld];
			if (pos || pos == 0) {
				//alert('found it: ' + id + fld);
				base_array['data'][ pos ] = null;
				base_array['memo'][ pos ] = null;
				base_array['id_lookup'][id + fld] = null;
			}
		}
		// if this is a new item, it is sufficient to remove the add instructions
		//if (id.substr(0, 5) == 'n_e_w') return;
	}
	//var base_array = getTableUpdates(tbl);
	if (inputs) {
		for (var j=0; j < inputs.length; j++) {
			id = inputs[j].getAttribute('RecID')
			if (!id) id = inputs[j].getAttribute('id');
			//var fld = inputs[j].getAttribute('field');
			var fld = get_fld_name(inputs[j]);
			var pos = base_array['id_lookup'][id + fld];
			if (pos || pos == 0) {
				base_array['data'][ pos ] = null;
				base_array['memo'][ pos ] = null;
				base_array['id_lookup'][id + fld] = null;
			}
			inputs[j].setAttribute('deleted', 'yes');
		}
		id = inputs[0].getAttribute('RecID')
		if (!id) id = inputs[0].getAttribute('id');
	}
	if (id.substr(0, 5) == 'n_e_w') return;
	var str = '|@@a=d@@t=' + tbl + '@@i=' + id + '@@|';
	base_array['data'].push(str);
	base_array['memo'].push(memo);
	base_array['id_lookup'][id + 'del'] = base_array['data'].length - 1;
}

function doUpdate(dont_wait) {
	setMessage('Saving... Please Wait.');
	save();
	//if (dont_wait) save();
	//else setTimeout("save()", 20); // this allows the message change to be seen
	return false;
}
function frmUpdate_onsubmit() {
//	if (document.frmUpdate.PreSave.value)
		alert(document.frmUpdate.PreSave.value );
	return true;
}

function save() {
	start = new Date();
	
	readform2(parent, true);
	
	end = new Date();
	//alert('done:' + (end.getTime()-start.getTime())/1000);
	document.frmUpdate.submit();
	parent.document.frmSelections.iframe_hits.value = eval(parent.document.frmSelections.iframe_hits.value) + 1; 
}

/*function closeIt() {
    event.returnValue = "Any string value here forces a dialog box to appear before closing the window.";
}*/

function setMessage(message) {
		parent.document.getElementById('divMessage').innerHTML = message;
		window.status = message;
}

function outstandingUpdates(){
	var temp = '';
	for (var j=0; j < curr_updates.length; j ++)
		temp += curr_updates[j]['data'].join('');
	return (temp.length > 0);
}
function readform() { return readform2() };
function readform2(frame, clear_data) {
//alert('readform2');
	if (!frame) {frame = document;}
	
	document.frmUpdate.pkg.value='';
	document.frmUpdate.pkg2.value='';
	var alreadyAdded = new Object();
	// if we have defined a priority order for table updates, then go through this list and process those
	// tables in order, marking the ones we process
	if (parent.table_update_priority)
		for (var j=0; j < parent.table_update_priority.length; j++) {
			var base_array = getTableUpdates( parent.table_update_priority[j] );
			append_table_updates(base_array, clear_data);
			alreadyAdded[parent.table_update_priority[j]] = true;
		}
	// now we process any other table updates for any tables not included in priority list
	
	for (var j=0; j < curr_updates.length; j ++) {
		if (!alreadyAdded[curr_updates[j]['name']]) {
			append_table_updates(curr_updates[j], clear_data, curr_updates[j]['name']);
			alreadyAdded[curr_updates[j]['name']] = true;
		}
	}
	var del_tbl;
	for (del_tbl in toggled_deletes) {
		// we could have just deletes, no updates for a table. Check for unhandled delets
		if (!alreadyAdded[del_tbl]) {
			apply_toggled_deletes(del_tbl);
			append_table_updates(getTableUpdates(del_tbl), clear_data, del_tbl, true);
		}
	}
	if (clear_data) {
		curr_updates = new Array();
		curr_updates_lookup = new Object();
	}
	document.frmUpdate.size2.value = document.frmUpdate.pkg2.value.length;
	document.frmUpdate.PreSave.value = build_pre_save_request();
		
	others(frame);
}
function mark_for_delete_toggle(obj, undelete) {
	// this function simply flags a certain table and id as being deleted, but doesn't do the deletion
	//  this allows a delete to be toggled off before the save occurs. The toggled_deletes are checked and applied at time of save
	var tbl = get_tbl_name(obj);
	var base_array = getDeleteObj(tbl);
	id = obj.getAttribute('RecID')
	
	if (!id) id = obj.getAttribute('id');
	base_array[id] = undelete ? null : id;
}
function apply_toggled_deletes(tbl) {
	var del_obj = getDeleteObj(tbl);
	for (row_del in del_obj) {
		if (del_obj[row_del] != null) {
			delete_row(tbl, document.getElementById('tr_' + del_obj[row_del]));
		}
   }
}
function append_table_updates(table_updates, clear_data, tbl_name, no_dels) {
	if (!no_dels) apply_toggled_deletes(tbl_name);
	document.frmUpdate.pkg2.value += table_updates['data'].join('');
		if (clear_data) {
			table_updates['data'] = null;
			table_updates['memo'] = null;
			
			table_updates['id_lookup'] = null
			table_updates = null;
		}
}

function others(frame) {
	document.frmUpdate.CurrURL.value = frame.frmSelections.CurrURL.value;
	document.frmUpdate.Page.value = frame.frmSelections.Page.value;
	document.frmUpdate.PageID.value = frame.frmSelections.PageID.value;
	document.frmUpdate.LastUpdated.value = frame.frmSelections.LastUpdated.value;
	document.frmUpdate.EndAction.value = frame.frmSelections.EndAction.value;
	document.frmUpdate.FormatOption.value = frame.frmSelections.FormatOption.value;
	document.frmUpdate.Saved.value = frame.frmSelections.Saved.value;
	frame.frmSelections.pkg2.value = document.frmUpdate.pkg2.value
}

function getRow(tbl) {
	//document.frmUpdate.pkg2.value = '|@@t=' + tbl + '@@f=' + fld + '@@i=' + id + '@@v=' + input.getAttribute("value") + '!#!#' + '@@|';
	
}

function customByRow(table, pkgstart_str, rowstart_str, field_str, rowend_str, pkgend_str) {
	var rows = table.getElementsByTagName('TBODY')[0].childNodes;
	var final_str = '',str = '', substr, input;
	for (var j=0; j < rows.length; j++) {
		substr = '';
		var inputs = rows[j].getElementsByTagName('INPUT');
		for (var i=0; i < inputs.length; i++) {
			if (inputs[i].getAttribute('Changed') == '1')
					substr += eval(field_str);
		}
		if (substr.length > 0) str += eval(rowstart_str) + substr + eval(rowend_str);
	}
	if (str.length > 0) final_str = eval(pkgstart_str) + str + eval(pkgend_str);
	alert(final_str);
	document.frmUpdate.pkg2.value = final_str;
	others(document);
	return final_str;
	//return str.replace('"', '""');
}



// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
// file SessionRefresh(SessionRefresh.js) {  nuthing  };
// --START---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,

//SessLen
var setSessLen = SessLen * 60 * 1000;
var checksession = setTimeout('SessionRefresh()',setSessLen);
var t;
function SessionRefresh(){
	//temp remove onkeydown feature
	document.onkeydown = ReturnTrue;
	//show overlay
	$('overlay').style.display = '';
	$('thepopup').style.display = '';
	//center up everything
	
	var x,y;
	if (document.body.scrollHeight > document.body.offsetHeight){ 
		x = document.body.scrollWidth;
		y = document.body.scrollHeight;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		x = document.body.offsetWidth;
		y = document.body.offsetHeight;
	}
	document.getElementById('overlay').style.height = y;
	document.getElementById('overlay').style.width = x;
	
	resize2();
	//set focus to password element
	var f = document.getElementById('UserPasswordz').focus();	
}

function ValidateSession()
{
      var posturl = 'sessionrefresh.asp';
	  var passw = $('UserPasswordz').value;
      var pars = 'UserPassword=' + passw + '&ajaxrnd='+ (Math.random() * Date.parse(new Date())); 
      var myAjax = new Ajax.Updater('divMessage', posturl, { method: 'post', parameters: pars, onComplete: 
					function (r)
					{
						if (r.responseText.indexOf('Login Successful!') >= 0){
							//Hide the popup
							$('overlay').style.display = 'none';
							$('thepopup').style.display = 'none';
							//reset the timer to check again later
							checksession = setTimeout('SessionRefresh()',setSessLen);
							//clear out the password that was entered
							$('UserPasswordz').value = '';
							// add keydown event back that we disabled when popup first showed
							document.onkeydown = keyDown;
							// clear the timer that keeps the overlay centered
							t = clearTimeout('resize2()');
						}
						else
						{
							alert('Error: password is incorrect!');
							$('UserPasswordz').value = '';
						}
					} 
			});
}

function resize2()
{
	var offset = document.body.scrollTop;
	w = 640;
	h = 480;
	NS4Plus = (document.layers) ? 1 : 0;
	IE4Plus = (document.all) ? 1 : 0;

	if (NS4Plus) {
	   w = window.innerWidth;
	   h  = window.innerHeight;
	}
	if (IE4Plus) {
	/* The script must be inside the body tags - there is no body in the head of the document */
	   w = document.body.clientWidth;
	   h = document.body.clientHeight;
	}
	  
  var wide = w;
  var high = h;
	
  //var car = document.getElementById('thepopup');
  var maxh = 100;  //600 // your max height here; enter 0 if not used
  var maxw = 230;  //600 // your max width here; enter 0 if not used

	  var content = document.getElementById('thepopup')
	  content.style.position = 'absolute';
	  content.style.height = maxh;
	  high = ((high - maxh) / 2) + offset;
	  content.style.top = high;
	//alert('high2: ' + high);
 	  content.style.width = maxw;
	  wide = (wide - maxw) / 2;
	  content.style.left = wide;
	//alert('wide2: ' + wide);
	//document.getElementById('overlay').style.top = offset;

	
	var xz,yz;
	if (document.body.scrollHeight > document.body.offsetHeight){ 
		xz = document.body.scrollWidth;
		yz = document.body.scrollHeight;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		xz = document.body.offsetWidth;
		yz = document.body.offsetHeight;
	}
	document.getElementById('overlay').style.height = yz;
	document.getElementById('overlay').style.width = xz;	
	
	t = setTimeout('resize2()',60);
}  


function PressEnter(event)
{
	var k = event.keyCode;		// JS2FIREFOX [changed]
	//alert(event.keyCode);
	if (k == 13) 
	{
		var z = document.getElementById('passwordsubmit').onclick();
	}

}	

function PressTab(event)
{
	var k = event.keyCode;		// JS2FIREFOX [changed]
	if (k==9)
	{
		var f = document.getElementById('UserPasswordz').focus();
	}
	if (k == 13)
	{
		var z = document.getElementById('Signout').onclick();
	}
}
function ReturnTrue(e)
{
	return true;
}
// --END---*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,
