﻿/*********************************************************************
*** (C) OK-Systems,2007 (All rights reserved)                      ***
*** Don't make any changes without reporting to oks@ok-systems.com ***
**********************************************************************
*** File: fu_common.js                                             ***
*** Project_: Virtual Office                                       ***
*** Language: JavaScript                                           ***
*** Description: Library of general functions                      ***
*********************************************************************/

var oError=null;

//==================================================
// BROWSER DETECTION FUNCTIONS
//==================================================

var ie4 = (document.all) ? true : false;
var ns4 = (document.layers) ? true : false;

function ie4() { return (document.all) ? true : false; }
function ns4() { return (document.layers) ? true : false; }

//function TBD() { alert('TBD: This feature is still under development'); return void(null); }
function TBD() { alert('*** Esta funcionalidad aún está bajo desarrollo ***'); return void(null); }

//==================================================
// PSEUDO-CONSTANTS
//==================================================

// Folders
var DIR_ROOT		='/VirtOf2/';
var DIR_IMG			=DIR_ROOT+'images/';

//==================================================
// SPECIAL TEXTS
//==================================================

var TXT_SELECTVALUE	='[Selecciona un valor]';
var TXT_NOVALUES		='[Sin valores]';
var MSG_NOVALUE		='<FONT Color=DarkGray><b>[Indefinido]</b></font>';

var CHAR_GREATER='>';
var CHAR_SMALLER='<';

//==================================================
// LANGUAGES
//==================================================

var LANG_ES='es';	// Español
var LANG_CA='ca'; // Catalán
var LANG_VL='vl'; // Valenciano
var LANG_EN='en'; // Inglés
var LANG_DE='de'; // Alemán
var LANG_FR='fr'; // Francés
var LANG_IT='it'; // Italiano
var LANG_PT='pt'; // Portugués
var LANG_NL='nl'; // Holandés
var LANG_RU='ru'; // Ruso
var LANG_PL='pl'; // Polaco
var LANG_RO='ro'; // Rumano
var LANG_JA='ja'; // Japonés
var LANG_CN='zh'; // Chino
var LANG_DEFAULT=LANG_ES;

var LANG_CODES=new Array('es','ca','en','de','fr','it','pt','nl','sv','ru','pl','ro','ja','zh');
var LANG_NAMES=new Array('Español','Catalán','Inglés','Alemán','Francés','Italiano','Portugués','Holandés','Sueco','Ruso','Polaco','Rumano','Japonés','Chino');
//var LANG_LABELS=new Array('Español','Catalá/Valenciá','English','Deutsch','Français','Italiano','Português','Nederlands','Русский','Polski','Română','日本語','中文');
var LANG_LABELS=new Array('Español','Catalá','English','Deutsch','Français','Italiano','Português','Nederlands','Svenska','Русский','Polski','Română','日本語','简体中文');

var OP_NEW			='New';
var OP_READ			='Read';
var OP_EDIT			='Edit';
var OP_COPY			='Copy';
var OP_SAVE			='Save';
var OP_SAVECOPY	='SaveCopy';
var OP_REMOVE		='Remove';
var OP_RENAME		='Rename';
var OP_MOVE		   ='Move';
var OP_SEARCH		='Search';
var OP_PRINT		='Print';
var OP_LOGIN		='Login';
var OP_LOGOUT		='Logout';
var OP_APPROVE		='Approve';
var OP_REJECT		='Reject';
var OP_UPDATE		='Update';
var OP_UPLOAD		='Upload';
var OP_INSPECT		='Inspect';
var OP_COMMENT		='Comment';
var OP_GRANT		='Grant';
var OP_VIEW			='View';
var OP_OPEN			='Open';
var OP_LOAD			='Load';
var OP_PREVIEW		='Preview';

//- Synonims
//var OP_ADD		=OP_NEW;
//var OP_MODIFY	=OP_EDIT;
//var OP_NEW		=OP_ADD;
//var OP_DELETE	=OP_REMOVE;

//---
var GRANT_NONE		='NONE';
var GRANT_READ		='READ';
var GRANT_EDIT		='EDIT';
var GRANT_ADMIN		='ADMIN';
var GRANT_DEFAULT	=GRANT_NONE;

//==================================================
// GENERAL USER INTERFACE FUNCTIONS
//==================================================

//--------------------
//- Modified: ??-???-????, Antonio Olmedo Soler
//- Modified: 19-Oct-2001, Antonio Olmedo Soler
//- Syntax__: Open_Window (cFile,[cTarget='Atd_Window'],[cFeatures]) 
//- Description: 
//--------------------
function Open_Window(cFile) {
	//Debug_Function('Open_Window',null,arguments);
	if (!cFile) return void(null);
	//--- Optional arguments
	var cTarget='Atd_Window';
	var cFeatures = 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=800,height=600,top=0,left=0,dependent=yes';
	if (arguments.length>1) if (arguments[1]) cTarget=arguments[1];
	if (arguments.length>2) if (arguments[2]) cFeatures=arguments[2];
	//--- Optional arguments
	var oWindow=window.open(cFile,cTarget,cFeatures);
	if (oWindow) oWindow.focus();
	return void(null);
}


//--------------------
//- Created_: 29-Aug-2000, Antonio Olmedo Soler
//- Modified: 23-May-2001, Antonio Olmedo Soler
//- Syntax__: Open_Dialog(cFile,[cTarget='Atd_Dialog'],[cFeatures],[vArg])
//- Description: 
//--------------------
function Open_Dialog(cFile) {
	if (cFile=='') return void(null);
	//--- Optional arguments
	var cTarget='Atd_Dialog';
	var cFeatures = 'dialogWidth:640px;dialogHeight:580px;border:thick;center:yes;help:no;status:no;';
	//var cFeatures = 'dialogWidth:620px;dialogHeight:500px;border:thick;center:yes;help:no;status:1;';
	var vArg=null;
	if (arguments.length>1) if (arguments[1]) cTarget=arguments[1];
	if (arguments.length>2) if (arguments[2]) cFeatures=arguments[2];
	if (arguments.length>3) vArg=arguments[3];
	//alert('cTarget: '+cTarget+'\nFeatures: '+cFeatures+'\nvArg: '+vArg);
	//---
	if (ie4) {
		return oWindow=window.showModalDialog(cFile,vArg,cFeatures);
	} else {
		window.Args=vArg;
		return Open_Window(cFile,cTarget)
	}
}

//--------------------
//- Created_: 30-Aug-2000, Antonio Olmedo Soler
//- Modified: 21-Mar-2002, Antonio Olmedo Soler
//- Syntax__: Open_Wizard(cFile,[vArg],[cFeatures],[cTarget])
//- Description: 
//--------------------
function Open_Wizard(cFile) {
	//--- Optional arguments
	var cFeatures = 'dialogWidth:720px;dialogHeight:580px;border:thick;center:yes;help:no;status:no;';
	if (arguments.length>2) if (arguments[2]) cFeatures=arguments[2];
	//---
	cFile=DIR_WIZARD+'wizard.asp?'+String_Replace(cFile,'?','|');
	//return Open_Window(cFile)
	return Open_Dialog(cFile,arguments[3],cFeatures,arguments[1]);
}

//--------------------
//- Created_: 04-Jun-2000, Antonio Olmedo Soler
//- Modified: 07-Nov-2001, Antonio Olmedo Soler
//- Syntax__: Open_MicroWizard(cFile,[cTitle],[cSubtitle],[cIcon],[vArg],[cFeatures],[cTarget])
//- Description: 
//--------------------
function Open_MicroWizard(cFile) {
	//--- Optional arguments
	var cTitle='';
	var cSubtitle='';
	var cIcon='';
	if (arguments.length>1) if (arguments[1]) cTitle=escape(arguments[1]);
	if (arguments.length>2) if (arguments[2]) cSubtitle=escape(arguments[2]);
	if (arguments.length>3) if (arguments[3]) cIcon=escape(arguments[3]);
	//--- If the funtion Date_URLString is available, use it to ensure that the page is always reloaded and not taken from the cache
	try { cFile+=(cFile.indexOf('?')==-1?'?':'&')+Date_URLString(); } catch(oError) {}
	//---
	var cLink=DIR_WIZARD+'microwizard.asp?Title='+cTitle+'&Subtitle='+cSubtitle+'&Icon='+cIcon+'&Page='+escape(cFile);
	return Open_Dialog(cLink,arguments[6],arguments[5],arguments[4]);
}

//--------------------
//- Created_: 21-Jun-2000, Antonio Olmedo Soler
//- Modified: 01-May-2003, Antonio Olmedo Soler
//- Syntax__: Open_Help(cURL,[cSubTitle],[bModal=true])
//- Description: 
//--------------------
function Open_Help(cURL) {
	//--- Optional arguments
	var cSubTitle=	'';
	var bModal=		true;
	if (arguments.length>1) if (arguments[1]) cSubTitle=arguments[1];
	if (arguments.length>2) if (arguments[2]!=null) bModal=arguments[2];
	//---
	if (bModal) {
		Open_MicroWizard(cURL,'ATD Help',cSubTitle,DIR_IMG+'ico32_help.gif',null,null,'Atd_Help');
	} else {
		Open_Window(cURL,'Atd_Help');
	}
	return void(null);
}

//--------------------
//- Modified: 31-Jul-1999, Antonio Olmedo Soler
//- Description: Opens a pop-up menu, which permit to select multipe values from a table.
//-    The selection is stored in two fields: a hidden one for Ids and a visible one for names (delimited lists)
//- Syntax__: db_Menu(cTable,cLabel,[cWhere],[cTitle])
//--------------------
function db_Menu(cTable,cLabel) {
	var cFeatures='toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=no,resizable=yes,width=400,height=420,top=0,left=0,alwaysRaised=yes,dependent=yes';
	var oField1=eval('document.frm.txt'+cLabel+'Id');
	var oField2=eval('document.frm.txt'+cLabel+'Name');
	//alert(cTable+'\n'+cLabel+'\n'+oField1.name+'\n'+oField2);
	//--- Build the link to the menu page, setting contextual parameters
	var cLink='dlg_dbmenu.asp?Table='+cTable;
	if (cLabel) cLink+='&Label='+cLabel+'&Field1=txt'+cLabel+'Id&Field2=txt'+cLabel+'Name';
	if (arguments.length>2) cLink+='&Where='+escape(arguments[2]); 
	if (arguments.length>3) cLink+='&Title='+escape(arguments[3]);
	//--- Open the menu
	var oDlg=window.open(cLink, 'dlg_dbmenu', cFeatures);
	if (oDlg) oDlg.focus();
	//---
	return true;
}

//--------------------
//- Created_: 14-Nov-2000, Antonio Olmedo Soler
//- Modified: 14-Nov-2000, Antonio Olmedo Soler
//- Syntax__: Wait_Begin([cMsg],[oDoc])
//- Description: 
//--------------------
function Wait_Begin() {
	var cMsg='Please wait...';
	var oDoc=document;
	//--- Optional arguments
	if (arguments.length>0) if (arguments[0]) cMsg=arguments[0];
	if (arguments.length>1) if (arguments[1]) oDoc=arguments[1];
	//---
	oDoc.status=cMsg;
	oDoc.body.style.cursor='wait';
	//---
	return void(null);
}

//--------------------
//- Created_: 14-Nov-2000, Antonio Olmedo Soler
//- Modified: 14-Nov-2000, Antonio Olmedo Soler
//- Syntax__: Wait_End([cMsg],[oDoc])
//- Description: 
//--------------------
function Wait_End() {
	var cMsg='Ready.';
	var oDoc=document;
	//--- Optional arguments
	if (arguments.length>0) if (arguments[0]) cMsg=arguments[0];
	if (arguments.length>1) if (arguments[1]) oDoc=arguments[1];
	//---
	oDoc.status=cMsg;
	oDoc.body.style.cursor='default';
	//---
	return void(null);
}


//--------------------
//- Created_: 26-Oct-2000, Antonio Olmedo Soler
//- Modified: 13-Mar-2001, Antonio Olmedo Soler
//- Syntax__: Build_ActiveLabel (cLabel,[cStatus],[cEvents],[cStyle])
//- Returns_: a String 
//- Description: Builds HTML code displaying a label with Auto-documentation features
//--------------------
function Build_ActiveLabel (cLabel) {
	var cStatus='';
	var cEvents='';
	var cStyle='';
	//--- Optional arguments
	if (arguments.length>1) if (arguments[1]) cStatus=arguments[1];
	if (arguments.length>2) if (arguments[2]) cEvents=arguments[2];
	if (arguments.length>3) if (arguments[3]) cStyle=arguments[3];
	//---
	if (cStatus=='' && cEvents==='') return cLabel;
	cStyle='cursor:'+(cEvents?'hand;':'help;')+cStyle;
	//---
	var cOut='<a Style="'+cStyle+'"';
	if (cStatus!='') cOut+=' title="'+cStatus+'"  onmouseover="window.status=\''+cStatus+'\'" onmouseout="window.status=\'\'"'
	if (cEvents!='') cOut+=' '+cEvents;
	cOut+='>'+cLabel+'</a>';
	//---
	return cOut;
}

//==================================================
// DIALOG GENERAL FUNCTIONS
//==================================================

//--------------------
//- Created_: 15-Nov-2000, Antonio Olmedo Soler
//- Modified: 19-Oct-2001, Antonio Olmedo Soler
//- Syntax__: Dialog_KeyPress(nKey,cCode)
//- Description: 
//--------------------
function Dialog_KeyPress(nKey,cCode) {
	try { 
		if (event.keyCode==nKey) { eval(cCode); return true; }
	} catch (oError) { Debug_Function('Dialog_KeyPress',oError,arguments); }
	return false; 
}

//--------------------
//- Modified: 15-Nov-2000
//- Syntax__: Dialog_Close()
//- Description: 
//--------------------
function Dialog_Close() {
	window.close();
	return true;
}


//==================================================
// STRING FUNCTIONS
//==================================================

//--------------------
//- Modified: 03-Apr-2001, Antonio Olmedo Soler
//- Description: Extracts an item from a delimited list. (First=1)
//--------------------
function Token (cString,nItem) {
	var cDelimiter=',';
	var i = 0;
	var nCount = 1;
	var cOut = '';
	var bEnd = false;
	//--- Optional arguments
	if (arguments.length>2) if (arguments[2]) cDelimiter=arguments[2];
	//---
	while ( (i < cString.length) && (!bEnd) ) {
		if ( cString.charAt(i) == cDelimiter) {
			nCount++;
		} else {
			if (nCount == nItem) 
				cOut += cString.charAt(i);
			else
				if (nCount > nItem) bEnd = true;
		}
		i++;
	}
	return cOut;
}

//--------------------
//- Created_: 20-Aug-2000, Antonio Olmedo Soler
//- Modified: 24-Mar-2003, Antonio Olmedo Soler
//- Syntax__: String_Replace(cString,cMatch,cReplace)
//- Returns_: a String
//- Description: Replaces *ALL* the occurrences of the substring cMatch for cReplace.
//    The method replace of the object string does not perform this operation as the 
//    VBScript equivalent function, because only replaces the *FIRST* occurrence.
//--------------------
function String_Replace (cString,cMatch,cReplace) {
	while (cString.match(cMatch)!=null) { cString=cString.replace(cMatch,cReplace); }
	return cString;

	/*
	[25-Mar-2002]
	//--- Optional arguments
	if (arguments.length>2) if (arguments[2]) cDelimiter=arguments[2];
	//·Debug('String_Replace',cString+' / '+cMatch+' / '+cReplace);
	//---
	var nLenString=cString.length;
	var nLenMatch=cMatch.length;
   if ((nLenString==0) || (nLenMatch==0)) return cString;
	//---
   var nPos=cString.indexOf(cMatch);
   if ((!nPos) && (cMatch!=cString.substring(0,nLenMatch))) return cString;
   if (nPos==-1) return cString;
	//---
   var cOut=cString.substring(0,nPos)+cReplace;
   if (nPos+nLenMatch<nLenString) cOut+=String_Replace(cString.substring(nPos+nLenMatch,nLenString),cMatch,cReplace);
   //---
   return cOut;
   
	//=== Using Regular Expressions
	//var cSwitch='gi';
	//var oRegExp=new RegExp(cMatch,cSwitch);
	//oRegExp.exec(cString);
	//alert('oRegExp='+oRegExp);
	//alert('oRegExp='+oRegExp.test('X'));
	//=== Using String.match (problem: if cMatch is contained in cReplace loops forever !
	//while (cString.match(cMatch)!=null) { 
	//	if (!confirm(cMatch)) return cString;
	//	cString=cString.replace(cMatch,cReplace); 
	//}
	//return cString;
	*/
}

//--------------------
//- Created_: 31-Aug-2000, Antonio Olmedo Soler
//- Modified: 31-Aug-2000, Antonio Olmedo Soler
//- Syntax__: String_SubStrAfter(cString,cMatch)
//- Returns_: a String
//- Description: Returns the substring after the given match (only the last occurence !)
//--------------------
function String_SubStrAfter(cString,cMatch) {
	//·Debug_Function('String_SubStrAfter',arguments);
	//---
	nLen=cMatch.length;
	for (var i=cString.length-1 ;i>=0; i-- ) {
		if (cString.slice(i,i+nLen)==cMatch) return (cString.slice(i+nLen));
	}
	return cString;
}

//--------------------
//- Created_: 20-Dec-2005, Antonio Olmedo Soler
//- Modified: 17-Aug-2006, Antonio Olmedo Soler
//- Syntax__: String_SubStrBefore(cString,cMatch)
//- Returns_: a String
//- Description: Returns the substring before the given match (only the last occurence !)
//--------------------
function String_SubStrBefore(cString,cMatch) {
	//·DebugFunction('String_SubStrBefore',arguments);
	//---
	nLen=cMatch.length;
	//Debug(cString,nLen);
	for (var i=cString.length-1 ;i>=0; i-- ) {
	   //Debug(i,cString.slice(i,i+nLen));
		if (cString.slice(i,i+nLen)==cMatch) return (cString.substring(0,i+nLen-1));
	}
	return cString;
}

//--------------------
//- Created_: 31-Aug-2000, Antonio Olmedo Soler
//- Modified: 10-Oct-2001, Antonio Olmedo Soler
//- Syntax__: String_CharTrim(cString,[cChar=' '])
//- Returns_: a String
//- Description: Removes the given character from the left side of the string.
//--------------------
function String_CharTrim(cString) {
	//·Debug_Function('String_CharTrim',arguments);
	//--- Optional arguments
	var cChar=' ';
	if (arguments.length>1) if (arguments[1]) cChar=arguments[1];	
	//---
	for (var i=0; i<cString.length ; i++) {
		//Debug('cString.slice('+i+',1)=['+cString.slice(i,i+1)+']');
		if (cString.slice(i,i+1)!=cChar) return (cString.slice(i));
	}
	return cString;
}

//--------------------
//- Created_: 21-Nov-2000, Antonio Olmedo Soler
//- Modified: 21-Nov-2000, Antonio Olmedo Soler
//- Syntax__: String_Initials (cString)
//- Returns_: a String
//- Description: Extracts the initials from any string
//--------------------
function String_Initials (cString) {
	//·Debug_Function('String_Initials',arguments);
	var cOut='';
	//---
	var nLen=cString.length;
	for (var i=0; i<nLen ; i++ ) {
		if (i==0) {
			cOut+=cString.slice(i,i+1);
		} else if (cString.slice(i-1,i)==' ') {
			cOut+=cString.slice(i,i+1);
		}
	}
	//Debug('->',cOut)
	return cOut.toUpperCase();
}


//--------------------
//- Created_: 01-Aug-2003, Antonio Olmedo Soler
//- Modified: 01-Aug-2003, Antonio Olmedo Soler
//- Syntax__: HTML_CleanForm(cHTML)
//- Returns_: HTML Code
//- Description: Replaces FORM tag in HTML strings, to be handled withing DIV objects
//--------------------
function HTML_CleanForm(cIn) {
	var cOut=cIn;
	//---
	//alert(cOut);
	cOut=String_Replace(String_Replace(cOut,'<FORM','&nbsp;<VIRTOF-FORM'),'</FORM','&nbsp;</VIRTOF-FORM');
	cOut=String_Replace(String_Replace(cOut,'<Form','&nbsp;<VIRTOF-FORM'),'</Form','&nbsp;</VIRTOF-FORM');
	cOut=String_Replace(String_Replace(cOut,'<form','&nbsp;<VIRTOF-FORM'),'</form','&nbsp;</VIRTOF-FORM');
	//alert(cOut);
	//---
	return cOut;
}

//--------------------
//- Created_: 01-Aug-2003, Antonio Olmedo Soler
//- Modified: 01-Aug-2003, Antonio Olmedo Soler
//- Syntax__: HTML_RestoreForm(cHTML)
//- Returns_: HTML Code
//- Description: Restores FORM tag in HTML strings, to be handled withing DIV objects
//--------------------
function HTML_RestoreForm(cIn) {
	var cOut=cIn;
	//---
	cOut=String_Replace(String_Replace(cOut,'&nbsp;<VIRTOF-','<'),'&nbsp;</VIRTOF-','</');
	cOut=String_Replace(String_Replace(cOut,'<VIRTOF-','<'),'</VIRTOF-','</');
	//---
	return cOut;
}

//==================================================
// ARRAY FUNCTIONS
//==================================================

//--------------------
//- Created_: 12-Oct-2001, Antonio Olmedo Soler
//- Modified: 12-Oct-2001, Antonio Olmedo Soler
//- Syntax__: Array_delete(aArray,nPosition)
//- Description: Returns an array removing the item in the given position
//--------------------
function Array_delete(aArray,nPosition) {
	var aNew=new Array();
	for (var i in aArray) { if (i!=nPosition) aNew[aNew.length]=aArray[i]; }
	aArray=aNew;
	return aNew;
}

//--------------------
//- Created_: 21-Jul-2007, Antonio Olmedo Soler
//- Modified: 21-Jul-2007, Antonio Olmedo Soler
//- Syntax__: Array_find(aArray,xItem)
//- Description: Returns the position of the item in the array (-1 if not found)
//--------------------
function Array_find(aArray,xItem) {
	for (var i in aArray) { 
		if (aArray[i]==xItem) return i; 
	}
	return -1;
}

//--------------------
//- Created_: 21-Jul-2007, Antonio Olmedo Soler
//- Modified: 21-Jul-2007, Antonio Olmedo Soler
//- Syntax__: Array_add(aArray,xItem)
//- Description: Returns an array, adding the new item
//--------------------
function Array_add(aArray,xItem) {
	var nPos=Array_find(aArray,xItem);
	//if (nPos==-1) aArray[aArray.length]=xItem; 
	if (nPos==-1) aArray.push(xItem);
	return aArray;
}

//==================================================
// VALUE COMPARISON FUNCTIONS
//==================================================

//--------------------
//- Created_: 29-Mar-2001, Antonio Olmedo Soler
//- Modified: 29-Mar-2001, Antonio Olmedo Soler
//- Description: 
//--------------------
function Max(nV1,nV2) { return (nV1>nV2?nV1:nV2); }

//--------------------
//- Created_: 29-Mar-2001, Antonio Olmedo Soler
//- Modified: 29-Mar-2001, Antonio Olmedo Soler
//- Description: 
//--------------------
function Min(nV1,nV2) {	return (nV1<nV2?nV1:nV2); }


//==================================================
// DYNAMIC HTML FUNCTIONS
//==================================================

//--------------------
//- Modified: 26-Jul-1999, Antonio Olmedo Soler
//- Description: Change the HTML content of a DIV or LAYER element.
//--------------------
function Div_Set(cId,cHTML) {
	var oDoc=document;
	if (arguments.length>2) oDoc=arguments[2];
	//alert('Div_Set('+cId+',\n'+cHTML+',\n'+oDoc.location.href+')');
	//---
	if (ie4) {
		if (oDoc.all[cId]) {
			//if (oDoc.all[cId].innerHTML) 
			oDoc.all[cId].innerHTML = cHTML;
			return oDoc.all[cId];
		}
		return null;
	} else if (ns4) {
		if (!oDoc) return false;
		//alert('Layers: '+oDoc.layers.length);
		if (oDoc.layers.length==0) return null;
		//--- Note. This doesn't work if the layer is embedded into a table (!)
		var lyr=oDoc.layers[cId];
		if (lyr) {
			lyr.document.open();
			lyr.document.write(cHTML);
			lyr.document.close();
			return lyr;	
		}
		/*
		//--- Loop in layers until found StatusLayer
		for (i=0; i<oDoc.layers.length; i++)  {
			//alert('Layer '+i+': '+oDoc.layers[i].id);
			if (oDoc.layers[i].id==cId) {
				oDoc.layers[i].document.open();
				oDoc.layers[i].document.write(cHTML);
				oDoc.layers[i].document.close();
				return oDoc.layers[i];
			}
		}
		*/
	}
	return null;
}


//==================================================
// INTERACTIVITY FUNCTIONS
//==================================================

//--------------------
//- Created_: 30-Aug-2000, Antonio Olmedo Soler
//- Modified: 31-Aug-2000, Antonio Olmedo Soler
//- Syntax__: 
//- Description: 
//--------------------
function Button_Disable (oButton,bDisabled) {
	if (!oButton) return false;
	//alert('Button_Disable('+oButton.name+','+bDisabled+')');
	//--- Enable/Disable button (only IE4)
	/*
	if (ie4) {
		if (!oButton.filters) return false;
		oButton.filters.item(0).enabled = bDisabled;
		oButton.filters.item(0).opacity = 50;
	}
	*/
	oButton.disabled=bDisabled;
	return true;
}


//==================================================
// DEBUGGING FUNCTIONS
//==================================================

//--------------------
//- Created_: 02-Nov-2000, Antonio Olmedo Soler
//- Modified: 22-Jun-2001, Antonio Olmedo Soler
//- Syntax__: Debug_Function(cFunction,[exception],[aArguments])
//            Debug_Function(cFunction,[exception],[...])
//- Description: Shows to the user an Error message
//--------------------
function Debug_Function (cFunction) {
	var cBanner='\n-------------------------------------------------------------------------\n';
	var oException=null;
	var aArguments=null;
	var cOut='There was an error executing JavaScript code:';
	cOut+=cBanner+'Function_: '+cFunction;
	//--- Optional arguments
	if (arguments.length>1) if (arguments[1]) oException=arguments[1];
	if (arguments.length==3 && typeof(arguments[2])=='object') {
		aArguments=arguments[2];
		cOut+=' ('+aArguments.length+' arguments)';
		for (var i=0; i<aArguments.length; i++)  cOut+='\n- arg['+i+']= '+aArguments[i];
	} else {
		//for (var i=2; i<arguments.length; i++)  cOut+='\n- arg['+(i-1)+']= '+arguments[i];
		for (var i in arguments) { cOut+='\n- arg['+(i-1)+']= '+arguments[i]; }
		//for (var i=2; i<arguments.length; i++)  cOut+='\n- arg['+(i-1)+']= '+Value_Describe(arguments[i]);
	}
	//---
	if (oException) {
		cOut+=cBanner+'Exception: ['+(oException.number & 0xFFFF)+']';
		cOut+='\n- '+oException.description;
		cOut+=cBanner+'If the error persists, please report to the ATD Administrator.';
	}
	//---
	return alert(cOut);
}


//--------------------
//- Created_: 21-Oct-2000, Antonio Olmedo Soler
//- Modified: 08-Mar-2002, Antonio Olmedo Soler
//- Syntax__: Value_Describe(vWhat,[nVerbose],[bFunctions],[cTitle],[cIndent=''])
//- Returns_: a String 
//- Description: Builds HTML code showing the value of any kind of object 
//--------------------
function Value_Describe (vWhat) {
	var nVerbose=4;
	var bFunctions=false;
	var cTitle='';
	var cIndent=''
	//--- Optional arguments
	if (arguments.length>1) if (arguments[1])	nVerbose=arguments[1];
	if (arguments.length>2) bFunctions=arguments[2];
	if (arguments.length>3) if (arguments[3]) cTitle=arguments[3];
	if (arguments.length>4) if (arguments[4]) cIndent=arguments[4];
	//---
	//alert(vWhat+'\n'+typeof(vWhat));
	var cOut='';
	try {
		switch (typeof(vWhat)) {
		case 'object':	
			if (!vWhat.constructor) {
				if (vWhat.tagName) {
					cOut='<'+vWhat.tagName+' Class='+vWhat.className+'>';
				} else {
					cOut='[???]';
				}
			} else if (vWhat.constructor.toString().indexOf('function Array() {')==1) {
				for (oItem in vWhat) cOut+=(cOut==''?'':', ')+Value_Describe(vWhat[oItem],nVerbose-1,bFunctions,'',cIndent);
			} else if (vWhat.constructor.toString().indexOf('function Date() {')==1) {
				//cOut='Date: '+vWhat;
				cOut=Date_FormatDate(vWhat,true);
			} else {
				if (cTitle=='') cTitle=ObjectConstructorName(vWhat);
				cOut+='[Object: '+cTitle+']';
				if (nVerbose>0) {
					for (oItem in vWhat) {
						if (typeof(vWhat[oItem])=='function') {
							if (bFunctions) cOut+='\n- '+oItem+': [function]';
						} else {
							cOut+='\n'+cIndent+'- '+oItem+': '+Value_Describe(vWhat[oItem],nVerbose-1,bFunctions,'',cIndent+'   ');
						}
					}
				}
			}
			break;
		case 'function':	cOut='[function]';						break;
		case 'date':		cOut=Date_FormatDate(vWhat,true);	break;
		case 'string':		cOut=(vWhat=='')?'':vWhat;				break;
		case 'number':		cOut=vWhat;									break;
		case 'boolean':	cOut=vWhat?'Y':'N';						break;
		case 'undefined':	cOut='[undefined]';						break;
		default:				cOut='['+typeof(vWhat)+'] '+vWhat;
		}
	} catch (oError) { Debug_Function('Value_describe',oError,arguments); }
	return cOut;
}

//--------------------
//- Created_: 21-Oct-2000, Antonio Olmedo Soler
//- Modified: 19-Mar-2002, Antonio Olmedo Soler
//- Syntax__: ObjectConstructorName (oObject)
//- Returns_: a String 
//- Description: Extracts the name of an object (Class) from its Constructor function
//--------------------
function ObjectConstructorName (oObject) {
	var cOut='';
	if (typeof(oObject)=='object') {
		var cName=oObject.constructor.toString();
		var nPos=cName.indexOf('{');
		if (nPos) cOut=cName.slice(8,nPos-3);
		//if (nPos) cOut=cName.slice(10,nPos-3);
		//alert(oObject.constructor.toString()+' '+nPos+' '+cOut)
	}
	return String_CharTrim(cOut);
}

//--------------------
//- Created_: 04-Dec-2000, Antonio Olmedo Soler
//- Modified: 07-Dec-2000, Antonio Olmedo Soler
//- Syntax__: Debug_onclick([e])
//- Description: Shows information about an element of a we page (by default, the element on which the user clicked).
//--------------------
function Debug_onclick() {
	//--- Optional arguments
	var e;
	if (window.event) e=window.event.srcElement;
	if (arguments.length>0) if (arguments[0]) e=arguments[0];
	if (!e) { return void(null); }
	//---
	var cMsg='';
	try {
		cMsg+='\nId=\t'+e.id;
		cMsg+='\ntag=\t'+e.tagName;
		cMsg+='\nclass=\t'+e.className;
		cMsg+='\n--------------------\t\tleft\ttop\twidh\theight'
		cMsg+='\ne.style.[...]\t'+e.style.left+'\t'+e.style.top+'\t'+e.style.width+'\t'+e.style.height;
		cMsg+='\ne.style.pixel[...]\t\t'+e.style.pixelLeft+'\t'+e.style.pixelTop+'\t'+e.style.pixelWidth+'\t'+e.style.pixelHeight;
		cMsg+='\ne.offset[...]\t\t'+e.offsetLeft+'\t'+e.offsetTop+'\t'+e.offsetWidth+'\t'+e.offsetHeight;
		if (window.event) {
			cMsg+='\n--------------------';
			cMsg+='\nwindow.event.client[X,Y]\t'+window.event.clientX+'\t'+window.event.clientY;
		}
	} catch (exception) { Debug_Function('Debug_onclick',exception,arguments); }
	//---
	alert(cMsg);
	return void(null);
}

//--------------------
//- Created_: 02-Dec-2004, Antonio Olmedo Soler
//- Modified: 02-Dec-2004, Antonio Olmedo Soler
//- Syntax__: Check_DefaultPage([cURL='default.asp'])
//- Description: 
//--------------------
function Check_DefaultPage() {
	try {
		var cURL='default.asp';
		if (arguments.length>0) if (arguments[0]) cURL=arguments[0];
		//---
		var cHref=document.location.href;
		if (cHref.indexOf('.asp')<0 && cHref.indexOf('.htm')<0) {
			document.location.href=cURL;
		}
	} catch(oError) {}
	return void(null);
}



//==================================================


