<!--		22/12/2009 	vserver.js -->
//confirm('start vserver.js');
/*******************************************************
Virtual Client-Side Server Script
==================================================================
v3.0 - vhistory array for back-button wih external popUrl()
v2.0 - four level depth
==================================================================*/


// Instantiate default global variables
/*****************************************************************************/
	//select$all indicator for search all/any
	if (typeof select$all == 'undefined') { var select$all = false;}
	// reset by runtime 
	docTitle=document.title; 
	backUrl	='';		
	renderUrl	='';		
	searchField	='2';
	indexField	='1';
	searchPath 	= '"","'+searchField+'","'+indexField+'"';
	$field	=Array('');
	$docAddr	='0000';
	$name		='&nbsp;&#149;&nbsp;';
	$uri		='';
	vhistory=new Array();
	pgLngth=new Array(); 		
	Index=new Array('0');
	last1=0;last2=0;last3=0; 
	nAddr='0000'; 	
	docAddr='0000.0000'; 	
	navObj='';
	Bg='off';
	hlc='';
	pl=1;
	dl='';
	avis=new Array('pic','pic2','mp3|wav|mid|m4a');
	pics=new Array('pic','pic2','jpg|gif|jpe|jpeg');
	pdfs=new Array('pdf','pdf2','pdf|PDF');
	docs=new Array('doc','doc2','doc|DOC');
	wwws=new Array('www','www2','www|php|asp|aspx|com|org|net');
	htms=new Array('ndoc','ndoc2','htm|shtml|html|txt');


function findDataEq(){
/******************************************************************************
Syntax: 	findDataEq(qrystr,[srchfield|"index"]],[sortfield])				
Purpose: 	search default_dbase for 1st instance of qrystr in srchfield, sorted by sortfield
returns: 	recnum of found record 
******************************************************************************/
	dataSet=new Array();
	find$dataset('dBase',arguments[0],arguments[1],arguments[2]);
	//confirm(selfUrl()+'/findDataEq/Line 53:'+'\narguments[0]='+arguments[0]+'\narguments[1]srchfield='+arguments[1]+'\narguments[2]sortfield='+arguments[2]+'\n'+aList('dataSet'));
	return(dataSet[0]);
	}


function xshowTitle(){
/*****************************************************************************
Syntax: showTitle(qrystr,searchField,indexField)
Returns record number and $name from dbase
Enable find by $url or recnum
******************************************************************************/
	//dF=(xtractUrl(arguments[0]));
	var dF=arguments[0];
	var sf=searchField;if(arguments[1]){sf=arguments[1];}
	var so=indexField;if(arguments[2]){so=arguments[2];}
	findEQ('dBase',dF,sf,so)
	//defineFields(findDataEq(dF,sf,so));
	//confirm(selfUrl()+'/vserver/showTitle:'+'\narguments[0]='+dF+'\n$docAddr='+$docAddr);
	/*
	confirm(selfUrl()+'/vserver/showTitle:'
		+'\nqrystr[0]='+arguments[0]
		+'\nsearchField='+searchField	
		+'\nindexField='+indexField
		+'\ndocTitle='+docTitle
		+'\n$docAddr='+$docAddr	
		+'\ndLink='+dLink	
		+'\n'+aList('dataSet'));
	confirm(selfUrl()+'/vserver/showTitle:'
		+'\n'+aList('dataSet'));
	*/
	if(dataSet.length>0){return(dataSet[0]);}
	}


function findEQ(){
/*****************************************************************************
Syntax: 	findEQ('dbase',qrystr,[srchfield|"index"]],[sortfield])				
Purpose: 	search dBase instances of qrystr in srchfield, sorted by sortfield
Enable:	find by $url or recnum
Returns:	recordno from dbase, with all fields defined
******************************************************************************/
	//confirm(selfUrl()+'/vserver/findEQ/Line93:'+'\narguments[0]='+arguments[0]+'\narguments[1]='+arguments[1]+'\narguments[2]='+arguments[2]+'\narguments[3]='+arguments[3]);
	var qs='';if(arguments[1]){qs=arguments[1];}
	var sf='';if(arguments[2]){sf=arguments[2];}
	var so='';if(arguments[3]){so=arguments[3];}
	dataSet=new Array();
	dl=find$dataset(arguments[0],qs,sf,so);
	if(dl>0){
		//confirm(selfUrl()+'/vserver/findEQ:'+' by "'+sf+'"\narguments[0]='+arguments[0]+'\nqs='+qs+'\ndl='+dl+'\n'+aList('dataSet'));
		defineDataFields(arguments[0],dataSet[0]);
		return(dataSet[0]+1);
		}
	}


function findEQV(){
/*****************************************************************************
Syntax: 	findEQV('dbase',qrystr,[srchfield|"index"]],[sortfield])				
Purpose: 	search dBase for instances of qrystr in srchfield, sorted by sortfield
Returns:	Index.n, array of matching records from dbase
		global variable: dl=dataset.length
******************************************************************************/
	//confirm(selfUrl()+'/vserver/findEQV/Line 114:'+'\narguments[0]='+arguments[0]+'\narguments[1]='+arguments[1]+'\narguments[2]='+arguments[2]+'\narguments[3]='+arguments[3]);
	var qs='';if(arguments[1]){qs=arguments[1];}
	var sf='';if(arguments[2]){sf=arguments[2];}
	var so='';if(arguments[3]){so=arguments[3];}
	dataSet=new Array();
	dl=find$dataset(arguments[0],qs,sf,so);
	ds=''; 
	if(dl>0){
	/* 	numerate index for main target frame */
		n=Index.length
		//(arguments[0].indexOf("main")>-1)?n=Index.length:n=0;
		//convert to string for passing on
		ds='Index['+n+']'; 
		Index[n]=new Array();
		for(x=0;x<dl;x++){Index[n][Index[n].length]=dataSet[x];}
		}
	//confirm(selfUrl()+'/vserver/findEQV/Line177: '+'\narguments[0]='+arguments[0]+'\narguments[1]|qs='+qs+'\narguments[2]|srchfield='+sf+'\nds='+ds+'\n'+aList(ds));
	//return(Index[n]); 
	//return(eval(ds)); 
	return(ds); 	//literal value for vspage.shtml
	}


function findDataSet(){
/******************************************************************************
Jul072007  target dropped from declaration
Syntax: 	findDataSet('dbase',[qrystr],[srchfields|"index"]],[sortfields])				
eg:		dl=findDataSet(arguments[0],arguments[1],arguments[2],arguments[3]);
Purpose:	select all records matching qrystr 				
Result:	instantiate dataSet, sorted by sortfields, recnum
Returns:	dataSet.length
******************************************************************************/
	//confirm(selfUrl()+'/findDataSet/Line145:'+'\narguments[0]='+arguments[0] +'\narguments[1]='+arguments[1] +'\narguments[2]='+arguments[2] +'\narguments[3]='+arguments[3]);
	var sf='';if(arguments[2]){sf=arguments[2];}
	var so='';if(arguments[3]){so=arguments[3];}
	//confirm(selfUrl()+'/findDataSet:'+'\narguments[0]='+arguments[0] +'\narguments[1]='+arguments[1] +'\narguments[2]='+arguments[2] +' sf='+sf +'\narguments[3]='+arguments[3]+' so='+so);
	dataSet=new Array();
	find$dataset(arguments[0],arguments[1],sf,so);
	//find$dataset('dBase',arguments[1],sf,so);
	//confirm(selfUrl()+'/findDataSet:'+'\narguments[0]='+arguments[0] +'\narguments[1]='+arguments[1] +'\narguments[2]='+arguments[2] +'\n'+aList('dataSet'));
	if(dataSet.length>0){
	/* 	numerate index for main target frame */
		n=0;
		(arguments[0].indexOf("main")>-1)?n=Index.length:n=0;
		//convert to string for passing on
		ds='Index['+n+']'; 
		Index[n]=new Array();
		for(x=0;x<dataSet.length;x++){Index[n][Index[n].length]=dataSet[x];}
		}
	//confirm(selfUrl()+'/findDataSet/Line166:'+'\n'+aList('Index'));
/* debugmessage
	confirm(selfUrl()+'/findDataSet:'
		+'\narguments[0]='+arguments[0]
		+'\narguments[1]='+arguments[1]
		+'\narguments[2]='+arguments[2]
		+'\narguments[3]='+arguments[3]
		//+'\n'+aList('Index')
		+'\nn='+n
		+'\nIndex['+n+']='+Index[n] 
		//+'\ndataSet.length='+dataSet.length
		//+'\ncomposite index='+dataSet[dataSet.length-1]
		//+'\n'+aList(eval('ds'))
		);
*/
	return(dataSet.length);
	}


function find$dataset(){
/******************************************************************************
Syntax: find$dataset('dbase',qrystr,searchfields,sortfields)	
	select all records matching arguments[2] 	
	if ~ arguments[3]: search whole record for elements of qrystr
	if arguments[3]=="index": {search in indexed fields}
	arguments[3]: index fields
	save as sorted dataSet[]							
******************************************************************************/
	//confirm(selfUrl()+'/find$dataset/Line337:\narguments[0]|dBase='+arguments[0]+'\narguments[1]|qrystr='+arguments[1]+'\narguments[2]|searchfields='+arguments[2]+'\narguments[3]|indexfields='+arguments[3]);
	//var $dBase=new Array('');
	$dBase=eval(arguments[0]);
	qarray=new Array('');if(arguments[1]){qarray=arguments[1].split('|');}
	//qarray=new Array('');if(arguments[1]){qarray=arguments[1].toLowerCase().split('|');}
	//qarray=new Array();if(arguments[1]){qarray[0]=arguments[1];}
	//confirm(selfUrl()+'/find$dataset/Line312:\narguments[0]/$dBase='+arguments[0]+'\n$dBase.length='+$dBase.length+'\narguments[1]/qrystr='+arguments[1]+'\narguments[2]/searchfields='+arguments[2]+'\narguments[3]/sortfields='+arguments[3]);

	iarray=new Array();if(arguments[3]){iarray=arguments[3].split('|');}
	sarray=new Array();if(arguments[2]){
		if(arguments[2]=='index'){sarray=iarray;}
		else{sarray=arguments[2].split('|');}
		}
	lcase=(qarray[0].length>1)?1:0;
	//confirm(selfUrl()+'/find$dataset/Line320:\nqarray='+qarray+'\n'+'\nlcase='+lcase+'\n'+aList("$dBase"));
	//confirm(selfUrl()+'/find$dataset/Line321:\n$dBase.length='+$dBase.length+'\narguments[1]/qrystr='+arguments[1]+'\n'+aList('qarray')+'\narguments[2]/searchfields='+arguments[2]+'\n'+aList('sarray')+'\narguments[3]/sortfields='+arguments[3]+'\n'+aList('iarray'));
	var select$=false;
	var compstr='';
	for(x=0;x<$dBase.length;x++){
		//* default comparison string is whole record	*//
		var compstr=$dBase[x];
		if(lcase>0){compstr=$dBase[x].toLowerCase();}
		fs=compstr.split('|');
		//* loop through sarray fields to assemble truncated comparison string	*//
		//if(!confirm(selfUrl()+'/find$dataset:\ncompstr='+compstr)){break;}
		if(sarray.length>0) {
			compstr=fs[sarray[0]];
			for(s=1; s<sarray.length; s++){
				compstr=compstr+'|'+fs[sarray[s]];
				}
			//if(!confirm(selfUrl()+'/find$dataset:\ncompstr='+compstr)){break;}
			}
		//* loop thru qrystr until match found in compstr *//
		select$=select$all;
		for(q=0;q<qarray.length;q++){
		//confirm(selfUrl()+'/find$dataset/Line 184:\ncompstr='+$dBase[x]+'\n'+aList('fs')+'\nfs[sarray[0]]='+fs[sarray[0]]+'\n'+aList('qarray')+'\n'+aList('sarray'));
			if(select$all){if(compstr.indexOf(qarray[q])==-1){select$=false;}}
			else{if(compstr.indexOf(qarray[q])!=-1){select$=true;}}
			//if(!confirm(selfUrl()+'/find$datasetAny:\nqarray='+qarray+'\ncompstr='+compstr+'\n'+aList('dataSet'))){break;}
			}
		if(select$){
			var idx_rec=x;
			for(i=0;i<iarray.length;i++){
				idx_rec=fs[iarray[i]]+','+idx_rec;
				}
			dataSet[dataSet.length]=idx_rec;
			}
		}
	//confirm(selfUrl()+'/find$dataset/Line352:\n$dBase.length='+$dBase.length+'\narguments[1]/qrystr='+arguments[1]+'\n'+aList('qarray')+'\narguments[2]/searchfields='+arguments[2]+'\n'+aList('sarray')+'\narguments[3]/sortfields='+arguments[3]+'\n'+aList('iarray'));
/* debugmessage
	confirm(selfUrl()+'/find$dataset(3):'
		//+'\narguments[0]/qrystr='+arguments[0]
		+'\n'+aList('qarray')
		//+'\narguments[1]/searchField='+arguments[1]
		+'\n'+aList('sarray')
		//+'\narguments[2]/idxorder='+arguments[2]
		+'\n'+aList('iarray')
		+'\nlast compstr='+compstr
		//+'\nlast temp index='+dataSet[dataSet.length-1]
		+'\n'+aList('dataSet'));
*/
	if(iarray.length>0){
		if(dataSet.length>1){dataSet=dataSet.sort();}
		for(x=0;x<dataSet.length;x++){
			//retrieve recnum from last field in dataSet record 
			fn=dataSet[x].split(',');
			dataSet[x]=parseInt(fn[fn.length-1]);
			}
		}
	return(dataSet.length);
	}



function errmsg(){
/******************************************************************************/
/*	errmsg(target,qrystr)							 		*/
/******************************************************************************/
savebackUrl();
definePage(arguments[0],'idx');
docObj=eval(arguments[0] +'.document');
with (docObj){
	open("text/html","replace");
	writeln(docInit+docHead+'<div align="center">'
	+'<br /><h1>&nbsp;'+parent.docTitle+'</h1>'
	+'<br /><br /><h4>&nbsp;No documents found matching "'+arguments[1]+'"</h4>'
	+'<br /><br /></div>'+docFoot+docExit);
 	close();
	}}



function navdata() {
/******************************************************************************
Syntax: navdata(target,sn,dataSet,pl,cmd) 
******************************************************************************/
	//confirm(selfUrl() +'/navdata/Line:443'+'\narguments[0]|target=' +arguments[0]+'\narguments[1]|sn=' +arguments[1]+'\narguments[2]|ds=' +arguments[2]+'\narguments[3]|pl=' +arguments[3]+'\narguments[4]|cmd=' +arguments[4]);
	// start_no for search in index
	sn=0;if(arguments[1]>0){sn=arguments[1];}
	dl=eval(arguments[2]+'.length');
	//confirm(selfUrl() +'/navdata/Line446: '+arguments[2]+'.length='+dl);
	pl=arguments[3];
	cmd=arguments[4];
	//confirm(selfUrl() +'/navdata/Line450 '+'\narguments[0]|target=' +arguments[0]+'\narguments[1]|sn=' +sn+'\narguments[2].length|dl=' +dl+'\narguments[3]|pl=' +pl+'\narguments[4]|cmd=' +cmd);
	maxpg=Math.round(((2*dl)+(pl-1))/(2*pl)); 
	pg=new Array();
	navObj='';
	//confirm(selfUrl()+'/navdata:'+'\narguments[0]='+arguments[0]+'\narguments[1]='+arguments[1]+'\narguments[3]='+arguments[3]+'\narguments[4]='+arguments[4]);
	//confirm(selfUrl()+'/navdata:'+'\narguments[0]='+arguments[0]+'\narguments[1]|start.no='+arguments[1]+'\narguments[2]|dataSet='+arguments[2]+'\narguments[3]|pl='+arguments[3]+'\narguments[4]='+arguments[4]+'\npl='+pl+'\ndl='+dl+'\nmaxpg='+maxpg+'\n'+aList('pg'));
	for(i=0;i<(maxpg);i++){pg[i]=cmd+"('"+arguments[0]+"',"+(i*pl)+",'"+arguments[2]+"',"+pl+")";}
	//prev page - recnum of 1st record on previous page
	pp=0; if(sn>pl){pp=(sn-pl);}
	//page next recnum of 1st record on next page
	pn=dl; if(dl>(sn+pl)){pn=(sn+pl);}
	//page current starting at 0
	pc=Math.round(((2*sn)+(pl-1))/(2*pl));
	if(sn>0){ 			
		navObj+='<a href="javascript:parent.'+pg[pc-1]+'">&nbsp;&#171;&nbsp;Prev&nbsp;&nbsp;'+(pp+1);
		if(pl>1){navObj+='-'+(pp+pl);}
		navObj+='&nbsp;</a>&nbsp;&nbsp;&nbsp;&nbsp;';
		}
	navObj=navObj+'Item';
	if(sn+1<dl){navObj+='s';}
	navObj=navObj+' '+(sn+1);
	if((sn+1)<dl){navObj+='-'+pn;}
	navObj+=' of '+dl;
	if(pn<dl){if(pn>sn){ 	
		navObj+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:parent.'+pg[pc+1]+'">&nbsp;Next&nbsp;&nbsp;'+(pn+1);
		if(pl>1){if((pn+pl)>dl){navObj+='-'+dl;}else{navObj+='-'+(pn+pl);}}
		navObj+='&nbsp;&#187;&nbsp;</a>';
		}}
	if(pg.length>1){
		navObj+='\n<br />';
		for(i=0;i<(pg.length);i++){
			if(i!=pc){navObj+='<a href="javascript:parent.'+pg[i]+'">&nbsp;';}else{navObj+='<span class="on">&nbsp;';}
			navObj+=(1+i);
			if(i!=pc){navObj+='&nbsp;</a>';}else{navObj+='&nbsp;</span>';}
			if(i<(pg.length-1)){
				if(((i+1)%20)==0){navObj+='<br />';}
				else{navObj+=' ';}
				//else{navObj+='|';}
				}
			}
		}
	//confirm(selfUrl()+'/navdata:'+'\n'+aList('pgLngth'));
	return(navObj);	
	}	


function tTable() {
/******************************************************************************
Syntax: 	tTable(target,'dBase',qrystr,[srchfield|"index"]],[sortfield])				
Purpose:	Display multiple records per page
Notes:		qrystr is optional, starting field for search results
		searchField constrains search to specified fields, separated by comma
******************************************************************************/
	//confirm(selfUrl()+'/mTable/Line 554'+'\nparent.searchPath='+parent.searchPath+'\narguments[0]/target='+arguments[0]+'\narguments[1]/dBase='+arguments[1]+'\narguments[2]/qrystr='+arguments[2]+'\narguments[3]/srchfield='+arguments[3]);
	$ds=findEQV(arguments[1],arguments[2],arguments[3],arguments[4])
	//confirm(selfUrl()+'/mTable/Line 554'+'\nparent.searchPath='+parent.searchPath+'\narguments[0]/target='+arguments[0]+'\narguments[1]/dBase='+arguments[1]+'\narguments[2]/qrystr='+arguments[2]+'\narguments[3]/srchfield='+arguments[3]+'\nds.length='+ds.length);
	if(dl>0){tdx(arguments[0],arguments[4],$ds,dl);}
	else{errmsg(arguments[0],arguments[2]);}
	}


function xtDisplay() {
/******************************************************************************
Syntax: 	tDisplay(target,qrystr,[srchfield|"index"]],[sortfield][,start_no])				
Purpose:	Display formatted text to inner.html of docObj.target 					
Notes:		qrystr is optional, starting field for search results
		searchField constrains search to specified fields, separated by comma
******************************************************************************/
	//confirm(selfUrl()+'/tDisplay/Line 485:'+'\nparent.searchPath='+parent.searchPath+'\narguments[0]/target='+arguments[0]+'\narguments[1]/qrystr='+arguments[1]+'\narguments[2]/srchfield='+arguments[2]+'\narguments[3]/sortfield='+arguments[3]+'\narguments[4]/start_no='+arguments[4]);
	dl=findDataSet(arguments[0],arguments[1],arguments[2],arguments[3]);
	if(dl>0){tdx(arguments[0],arguments[4],ds,dl);}
	}



function tdx() {
/******************************************************************************
Syntax:	tdx(target,start_no,dataSet,page.length)		
Purpose:	inner loop sets up Prev & Next strings 
Activated:	navObj, textDisplay() 
		start search at sn, sequential recnum of dataSet
		default sn=0, start at beginning
		if sn>pagelength evaluates sn=to start of page
******************************************************************************/
	dl=arguments[3];
	pl=arguments[3];
	if(arguments[0].indexOf("main")!=-1){
		for(i=0;i<pgLngth.length;i++){
			if(pgLngth[i]=='tdx'){
				pl=pgLngth[(i+1)];
				break;
				//confirm(selfUrl()+'/tdx/Line508:'+'\npl='+pl);
				}
			}
		} 
	sn=0;
	if(parseInt(arguments[1])>0){
		sn=parseInt(arguments[1]/pl)*pl;
		//confirm('arguments[1]='+parseInt(arguments[1])+'\nsn=='+sn);
		}
	//confirm(selfUrl()+'/tdx/Line513:'+'\nparent.searchPath='+parent.searchPath+'\narguments[0]=arguments[0]='+arguments[0]+'\narguments[1]=sn='+arguments[1]+'\narguments[2]='+arguments[2]+'\narguments[3]=pl='+arguments[3]+'\nsn=arguments[1]/pl x'+pl+'='+sn);
	if(arguments[0].indexOf("main")!=-1){
		var $str="javascript:parent.tdx(\'"+arguments[0]+"\',\'"+arguments[1]+"\',\'"+arguments[2]+"\',\'"+arguments[3]+"\');";
		//confirm(selfUrl()+'/tdx:\nsavebackUrl('+$str+')');
		savebackUrl($str);
		}
	navObj=navdata(arguments[0],sn,arguments[2],pl,'tdx');
/// navObj defines pn ///
	definePage(arguments[0],'tdx');
	dObj=eval(arguments[0]+'.document');
	with (dObj){
		open("text/html","replace");
		writeln(docInit+docHead);
		for(sn;sn<pn;sn++){
			defineDataFields('dBase',eval(arguments[2]+'['+sn+']'),'tdx');
			writeln(textFormat());
			}
		writeln(docFoot+docExit);
 		close();
		}
	//confirm(selfUrl() +'/tdx:'+'\narguments[0]|target=' +arguments[0]+'\narguments[1]|qs=' +arguments[1]+'\n$docAddr=' +$docAddr+'\narguments[2]|ds=' +arguments[2]+'\narguments[3]|pl=' +arguments[3]+'\nparseInt(arguments[1]/arguments[3])=' +parseInt(arguments[1]/arguments[3])+'\npl/pgLngth[(i+1)]=' +pl+'\nsn=' +sn+'\narguments[2][sn]=' +arguments[2]+'['+sn+']='+eval(arguments[2]+'['+sn+']')+'\n'+aList(eval('arguments[2]')));
	}


function mTable() {
/******************************************************************************
Syntax: 	mTable(target,'dBase',qrystr,[srchfield|"index"]],[sortfield])				
Purpose:	Display multiple records per page
Notes:		qrystr is optional, starting field for search results
		searchField constrains search to specified fields, separated by comma
******************************************************************************/
	$ds=findEQV(arguments[1],arguments[2],arguments[3],arguments[4])
	//confirm(selfUrl()+'/mTable/Line430'+'\nparent.searchPath='+parent.searchPath+'\narguments[0]/target='+arguments[0]+'\narguments[1]/dBase='+arguments[1]+'\narguments[2]/qrystr='+arguments[2]+'\narguments[3]/srchfield='+arguments[3]+'\ndl='+dl);
	if(dl>0){mdx(arguments[0],arguments[4],$ds,dl);}
	else{errmsg(arguments[0],arguments[2]);}
	}


function xmDisplay() {
/******************************************************************************
Syntax: 	mDisplay(target,qrystr,[srchfield|"index"]],[sortfield][,start_no])				
Purpose:	Display multiple textbox objects per page
Notes:		qrystr is optional, starting field for search results
		searchField constrains search to specified fields, separated by comma
******************************************************************************/
	dl=findDataSet(arguments[0],arguments[1],arguments[2],arguments[3]);
	//confirm(selfUrl() +'/mDisplay/Line:581'+'\narguments[0]|target=' +arguments[0]+'\narguments[1]|qs=' +arguments[1]+'\narguments[2]|srchfield=' +arguments[2]+'\narguments[3]|sortfield=' +arguments[3]+'\narguments[4]=' +arguments[4]+'\ndl=' +dl);
	if(dl>0){mdx(arguments[0],arguments[4],ds,dl);}
	}


function mdx() {
/******************************************************************************
Syntax:	mdx(target,start_no,dataSet,dataSet.length)		
Purpose:	inner loop sets up Prev & Next strings 
Activated:	navObj, textDisplay() 
******************************************************************************/
	var sn=0;
	dl=arguments[3];
	pl=arguments[3];
	if(parseInt(arguments[1]/arguments[3])==NaN){
		//confirm('arguments[1]/arguments[3])==NaN')
		}
	if(parseInt(arguments[1])>1){
		sn=parseInt(arguments[1]/pl)*pl;
		//confirm('arguments[1]='+parseInt(arguments[1])+'\nsn=='+sn);
		}
	//confirm(selfUrl() +'/mdx/Line:464'+'\narguments[0]|target=' +arguments[0]+'\narguments[1]=' +arguments[1]+'\nsn=' +sn+'\narguments[2]|$ds=' +arguments[2]+'\narguments[3]|dl=' +arguments[3]+'\n'+aList(eval('arguments[2]')));
	if(arguments[0].indexOf("main")!=-1){for(i=0;i<pgLngth.length;i++){if(pgLngth[i]=='mdx'){pl=pgLngth[(i+1)];break;}}} 
	var $str="javascript:parent.mdx('"+arguments[0]+"','"+sn+"','"+arguments[2]+"','"+pl+"')";
	if(arguments[0].indexOf("main")!=-1){
		//confirm(selfUrl()+'/mdx:\nsavebackUrl('+$str+')');
		savebackUrl($str);
		}
	navObj=navdata(arguments[0],sn,arguments[2],pl,'mdx');
/// navObj defines pn ///
	//confirm(selfUrl() +'/mdx/Line:472'+'\narguments[0]|target=' +arguments[0]+'\narguments[1]=' +arguments[1]+'\nsn=' +sn+'\narguments[2]|$ds=' +arguments[2]+'\narguments[3]|dl=' +arguments[3]+'\ndl=' +dl+'\npl=' +pl+'\npn=' +pn+'\n'+aList(eval('arguments[2]')));
	definePage(arguments[0],'mdx');
	dObj=eval(arguments[0]+'.document');
	with (dObj){
		open("text/html","replace");
		writeln(docInit+docHead);
		for(sn;sn<pn;sn++){
			defineDataFields('dBase',eval(arguments[2]+'['+sn+']'),'mdx');
			writeln(mtextFormat());
			}
		writeln(docFoot+docExit);
 		close();
		}
	}


function pTable() {
/******************************************************************************
Syntax: 	pTable(target,'dBase',qrystr,[srchfield|"index"]],[sortfield])				
Purpose:	Display multiple records per page
Notes:		qrystr is optional, starting field for search results
		searchField constrains search to specified fields, separated by comma
******************************************************************************/
	//confirm(selfUrl() +'/pTable/Line499:'+'\narguments[0]/target=' +arguments[0]+'\narguments[1]/dbase=' +arguments[1]+'\narguments[2]/qrystr=' +arguments[2]+'\narguments[3]/srchfield=' +arguments[3]);
	$ds=findEQV(arguments[1],arguments[2],arguments[3],arguments[4])
	//confirm(selfUrl() +'/pTable/Line501:'+'\narguments[0]/target=' +arguments[0]+'\narguments[1]/dbase=' +arguments[1]+'\narguments[2]/qrystr=' +arguments[2]+'\narguments[3]/srchfield=' +arguments[3]+'\nparent.searchPath='+parent.searchPath+'\ndl='+dl);
	if(dl>0){pdx(arguments[0],arguments[4],$ds,dl);}
	else{errmsg(arguments[0],arguments[2]);}
	}


function pdx() {
/******************************************************************************
Syntax:	pdx(target,qrystr,dataSet,dataset.length)		
Purpose:	inner loop sets up Prev & Next strings 
Activated:	navObj, textDisplay() 
******************************************************************************/
	//var qs='';if(arguments[1]){qs=arguments[1];}
	pl=arguments[3];
	if(arguments[0].indexOf("main")!=-1){for(i=0;i<pgLngth.length;i++){if(pgLngth[i]=='pdx'){pl=pgLngth[(i+1)];break;}}} 
	//start at rec[0] of dataSet
	sn=0; 
	//confirm(selfUrl() +'/pdx/Line518'+'\narguments[0]/target=' +arguments[0]+'\narguments[1]/qrystr=' +arguments[1]+'\narguments[2]/ds=' +arguments[2]+'\narguments[3]/dl=' +arguments[3]+'\npl=' +pl+'\nstr=' +str+'\n'+aList(eval('arguments[2]')));
	var $str="javascript:parent.printPage()";
	if(arguments[0].indexOf("main")!=-1){
		//confirm(selfUrl()+'/pdx:\nsavebackUrl('+$str+')');
		savebackUrl($str);
		}
	navObj=navdata(arguments[0],sn,arguments[2],pl,'pdx');
	dObj=eval(arguments[0]+'.document');
	with (dObj){
		open("text/html");
		//definePage(arguments[0],'pdx');
		//confirm(selfUrl() +'/pdx/Line539'+'\nprnHead=' +prnHead);
		for(p=1; p<=maxpg; p++){
			//page next recnum of 1st record on next page 
			arguments[3]>(sn+pl)?pn=(sn+pl):pn=arguments[3];
			navObj='Page: '+p+'&nbsp;of&nbsp;'+maxpg+'&nbsp;&nbsp;&nbsp;Selection: '+(sn+1);if(pl!=1){navObj+='-'+pn;}navObj+=' of '+arguments[3];
			definePrintPage(arguments[0],'pdx');
			writeln(prnHead);
			for(sn; sn<pn; sn++){
				defineDataFields('dBase',eval(arguments[2]+'['+sn+']'),'pdx');
				writeln(printFormat());
				}
			writeln(prnFoot);
			if(sn<arguments[3])	{
				if(is.ie)	{writeln('<br /><br style="page-break-before:always" />');}
				else		{writeln('<br />');}
				}
			else{break;}
			}
		close();
		}	
	}	


function iDisplay(){
/******************************************************************************
Syntax: 	iDisplay(target,qrystr,[searchField|"index"],[indexField])				
Purpose: 	Display data fields to textbox & render partid.js file
Notes:	html body exists, no body command	 
		findDataEq(partid) returns recnum 			
******************************************************************************/
	definePage(arguments[0],'idx');
	dObj=eval(arguments[0] +'.document');
	with (dObj){
		open("text/html","replace");
		writeln(docHead);
		$ds=findEQ('dBase',arguments[1],arguments[2],arguments[3])
		if(dl>0){
			//defineDataFields('dBase',$ds,'idx');
			writeln(textboxFormat());
			}
		writeln(docFoot);
		close();
		}
	}


function showMenu(){
/******************************************************************************
Syntax: showMenu(nodeAddr)	
Render menu, with hilite 
Used for menu strings
******************************************************************************/
	if(arguments[0]=='0000'){showMenu0(arguments[0]);}
	if(frames.menutree){
		//confirm(selfUrl() +'/showMenu/Line584:'+'\narguments[0]|nodeAddr='+arguments[0]);
		select$all=false;
		if(document.layers){
			eval("javascript:hl(1);tDisplay('frames.menutree','"+creatQueryStr(arguments[0])+"','0','0');");
		}else{
			eval("javascript:hl(1);show$Menu('frames.menutree','dBase','"+creatQueryStr(arguments[0])+"','0','0');");
			}
		findEQ('dBase',arguments[0],'0','0');
		//confirm(selfUrl()+'/showMenu/Line588:\narguments[0]='+arguments[0]+'\ndBase.$docAddr='+dBase.$docAddr+'\ndocTitle='+docTitle+'\n'+aList('vhistory'));
		}
	}


function showMenu0(){
/******************************************************************************
Syntax: showMenu0(nodeAddr)	
Simple function to render menu, without hilite 
Used for + - icons
******************************************************************************/
	if(frames.menutree){
		//confirm(selfUrl() +'/showMenu0:'+'\narguments[0]|nodeAddr='+arguments[0]+'\n$docAddr=' +$docAddr+'\n'+creatQueryStr(arguments[0])+'\n'+aList('frames'));
		select$all=false;
		if(document.layers){
			eval("javascript:hl(0);tDisplay('frames.menutree','"+creatQueryStr(arguments[0])+"','0','0');");
		}else{
			eval("javascript:hl(0);show$Menu('frames.menutree','dBase','"+creatQueryStr(arguments[0])+"','0','0');");
			}
		findEQ('dBase',arguments[0],'0','0');
		}
	}


function show$Menu(){
/******************************************************************************
Syntax: show$Menu('target','dBase',nodeAddr,searchField,indexField);
******************************************************************************/
	select$all=false;
	dObj=eval(arguments[0]+'.document');
	var div$ref = '';
	if (is.ns) div$ref = dObj['cMenu'];
	if (is.ie) div$ref = dObj.all['cMenu'];
	if (is.w3c) div$ref = dObj.getElementById('cMenu');
	//var $qrystr='';if(arguments[1]){$qrystr=arguments[1];}
	var $str = '';
	definePage(arguments[0],'tdx');
	$ds=findEQV(arguments[1],arguments[2],arguments[3],arguments[4])
	//confirm(selfUrl() +'/show$Menu0/Line 624:'+'\narguments[0]/target='+arguments[0]+'\narguments[1]/dBase=' +arguments[1]+'\narguments[2]/nodeAddr=' +arguments[2]+'\n$ds=' +$ds+'\ndl=' +dl);
	if(dl>0){
		$str+=docHead;
		for(n=0;n<dl;n++ ){
 			defineDataFields(arguments[1],dataSet[n]);
			$str+='\n'+(textFormat());
			}
		$str+='\n'+docFoot;
		//confirm(selfUrl()+'/show$Menu/Line 646:'+'\ndiv$ref='+div$ref+'\n$str='+$str);
		div$ref.innerHTML=$str;
		}
	}


function loadMenu(){
/******************************************************************************
Search on field[0]
******************************************************************************/
	//confirm(selfUrl()+'/loadMenu/Line642:\narguments[0]='+arguments[0]);
	//parent.defineFields(parent.findEQ(dBase,arguments[0],'0','0'));
	findEQ('dBase',arguments[0],'0','0');
	//confirm(selfUrl()+'/loadMenu/Line647:\narguments[0]='+arguments[0]+'\ndBase.$docAddr='+dBase.$docAddr+'\ndocTitle='+docTitle+'\ndBase.dLink='+dBase.dLink+'\n'+aList('vhistory'));
	eval(dBase.dLink);
	showMenu(dBase.$docAddr);
	}


function loadMenu2(){
/******************************************************************************
Search on field[2]
******************************************************************************/
	//confirm(selfUrl()+'/loadMenu2/Line655:\narguments[0]='+arguments[0]);
	findEQ('dBase',arguments[0],'2','0');
	//confirm(selfUrl()+'/loadMenu2/Line656:'+'\narguments[0]='+arguments[0]+'\nparent.dBase.$docAddr='+parent.dBase.$docAddr+'\nparent.dBase.dLink='+parent.dBase.dLink);
	eval(dBase.dLink);
	parent.showMenu(dBase.$docAddr);
	//confirm(selfUrl()+'/loadMenu2/Line659:'+'\narguments[0]='+arguments[0]+'\nparent.dBase.$docAddr='+parent.dBase.$docAddr+'\nparent.dBase.dLink='+parent.dBase.dLink);
	}


function screenPage(){
/******************************************************************************
simple function to render search results to target page				
Syntax: screenPage([target,[start_no]])					 			
parent.searchPath inherited from parent or set from commmand line
parent.select$all  inherited from parent or set from commmand line
Display text list of data set to pseudo-inner.html					
******************************************************************************/
	var tw='parent.main';if(arguments[0]){tw=arguments[0];}
	var sn='';if(arguments[1]){sn=arguments[1];}
	//confirm("parent.tDisplay(\'"+tw+"\',\'"+sn+"\',\'"+parent.searchField+"\',\'"+parent.indexField+"\');");
	//eval("parent.tDisplay(\'"+tw+"\',\'"+sn+"\',\'"+parent.searchField+"\',\'"+parent.indexField+"\');");
	eval("parent.tTable(\'"+tw+"\',\'dBase\',\'"+sn+"\',\'"+parent.searchField+"\',\'"+parent.indexField+"\');");
	}


function printPage(){
/*****************************************************************************
simple function to render search results to target page				
Syntax: screenPage([target,[start_no]])					 			
parent.searchPath inherited from parent or set from commmand line
parent.select$all  inherited from parent or set from commmand line
Load base template.shtml to display printable page of data set 					
******************************************************************************/
	var fromstr='';
	//if(parent.vhistory[parent.vhistory.length-1][0].indexOf('javascript')!=-1){
		fromstr="?from="+parent.vhistory[parent.vhistory.length-1][0];
		//parent.backUrl=parent.vhistory[parent.vhistory.length-1][0];
		//}
	//confirm(selfUrl()+'/printPage:'+'\n'+'fromstr=' +fromstr+'\n'+'parent.backUrl=' +parent.backUrl+'\n'+aList('parent.vhistory'));
	//parent.main.location.href='vppage.shtml'+fromstr;
	parent.main.location.href='vppage.shtml'
	}

function printPagePrompt()	{
/******************************************************************************/
return('<a href="javascript:parent.printPage();" target="_self" title="View printer-formatted page"><small>Print-friendly Page</small><img alt="View printer-formatted page" src="'+parent.prntlo.src+'" border="0" hspace="4" vspace="2" /></a><br />');}


function vPage(){
/*****************************************************************************
Syntax: 	vPage('root_name_for_js_file'||'valid_html_url')					 				
Purpose: 	function to sequentually call data objects according to file type 
******************************************************************************/
	var $str=arguments[0].split(';');
	for(xx=0;xx<$str.length;xx++){
		//confirm(selfUrl()+'/vPage/Line 815/Iteration '+xx+'\nv$Page("'+$str[xx]+'")');
		v$Page($str[xx]);
		}
	}


function v$Page(){
/*****************************************************************************
Syntax: 	v$Page('root_name_for_js_file'||'valid_html_url')					 				
Purpose: 	function to call data objects according to file type 
		if argument[0] includes '// www. .pdf or .html' load in new window
		if argument[0] includes '.' load htm document in parent.main window
		else chain to vipage.shtml
		savebackUrl new document parameters
******************************************************************************/
	//var fromstr="from="+vhistory[vhistory.length-1][0]+";";
	var $str="javascript:parent.vPage('"+arguments[0]+"')";
	if(arguments[0].indexOf('.')==-1){
		//confirm(selfUrl()+'/v$Page/Line724:\narguments[0]='+arguments[0]+'\ndBase.$docAddr='+dBase.$docAddr+'\ndocTitle='+docTitle+'\n'+aList('vhistory'));
		savebackUrl($str);
		frames.main.location=renderUrl+'?n='+arguments[0];
		//confirm(selfUrl()+'/v$Page/Line735\n'+renderUrl+'?n='+arguments[0]);
		//confirm(selfUrl()+'/v$Page/Line735'+'\narguments[0]=' +arguments[0]+'\nbackUrl=' +backUrl+'\n$str='+$str+'\n'+aList('parent.vhistory'));
		}
	else{	
		if(arguments[0].indexOf('//')!=-1||arguments[0].indexOf('www.')!=-1||getDoctype(arguments[0])=='doc'||getDoctype(arguments[0])=='pdf'||getDoctype(arguments[0])=='html'){
			var ppw=window.open(docRoot+arguments[0],'_blank');
		}else{	
			//confirm(selfUrl()+'/v$Page:'+'\nindexOf(.shtml)='+arguments[0].indexOf('.shtml')+'\ndocRoot+arguments[0]='+docRoot+arguments[0]);
			//confirm(selfUrl()+'/v$Page:\nsavebackUrl('+$str+')');
			savebackUrl($str);
			frames.main.location.href=docRoot+arguments[0]
			}
		}
	}


function subSet(){
/*****************************************************************************
Find all next level down records from database field[0]=querystr, sorted by field[0]
if qrystr=xxxx display parent & children
if qrystr=.xxxx display children only	
******************************************************************************/
	var $str='';
	if(findDataSet('',arguments[0],'0','0')>0){
 		for(sn=0;sn<dataSet.length;sn++){
			fn=dataSet[sn];
        		$str+='.'+(dBase[fn].substr(0,4));
			//if(!confirm('subSet:\narguments[0]='+arguments[0]+'\nfn['+sn+']='+fn+'\n$str='+$str)){break;}
			if(sn+1<dataSet.length){$str+='|';}
			}
		}
	return($str);
	}


function savebackUrl(){
/******************************************************************************
syntax: savebackUrl([selfUrl()])
placed at top of calling program after showTitle() to define docTitle & docAddr
function to:
	create backUrl 	from vhistory array for upcoming document 	
	save self_url 		of calling page into vhistory[0]
	save docAddr 		of calling page into vhistory[1]
	save docTitle 		of calling page into vhistory[2]
	save searchPath 	of calling page into vhistory[3]
creates default cmdstr from backUrl
******************************************************************************/
	if(vhistory.length>0){backUrl=vhistory[vhistory.length-1][0];}
	var $str='';
	if(arguments[0]){
		$str+=arguments[0];
	}else{
		$str+=selfUrl();
		}
	vhistory[vhistory.length]=new Array($str,dBase.$docAddr,docTitle,searchPath);
	//confirm(selfUrl()+'/savebackUrl/Line786:\narguments[0]='+arguments[0]+'\nparent.backUrl='+parent.backUrl+'\nbackUrl='+backUrl+'\n$str='+$str+'\ndBase.$docAddr='+dBase.$docAddr+'\ndocTitle='+docTitle+'\nparent.searchPath='+parent.searchPath+'\nsearchPath='+searchPath+'\n'+aList('vhistory'));
	}


function popUrl(){
/******************************************************************************
	Retrieve docTitle from vhistory[vn][2]
	showMenu from vhistory[vn][1];
	truncate vhistory array
******************************************************************************/
	//confirm(selfUrl()+'\n'+aList('vhistory'));
	if(vhistory.length>0){
		vhistory.length>1?vn=(vhistory.length-2):vn=0;
		showMenu(vhistory[vn][1]);
		vhistory.length>2?vhistory.length=vn:vhistory.length=1;
		}
	//confirm(selfUrl()+'\n'+aList('vhistory'));
	}


function creatQueryStr() {
/***************************************************************
syntax: creatQueryStr(dBase.field[0]) 
Construct menu query string from database.address.field
performed for each record in dataSet
****************************************************************/
	//confirm(selfUrl()+'/creatQueryStr/Line821:\narguments[0]='+arguments[0]);
	if(frames.menutree){
		var sL=arguments[0];
		if(sL.indexOf('.')>0){sL=sL.substr(0,sL.indexOf('.'));}
		var lv=sL.indexOf('00');
		if(lv<0){
			lv=sL.indexOf('0');
			if(lv<0){lv=4;}
			}
 		for(cc=lv-1;cc>0;cc--){
			sL+='|'+arguments[0].substring(0,cc);
 			for(dd=cc;dd<4;dd++){sL+='0';}
			}
		sL+='|0000';
		//confirm(selfUrl()+'/creatQueryStr/Line 980:\narguments[0]='+arguments[0]+'\nsL='+sL+'\nlevel='+lv);
		return(sL);
		}
	}


function mTree() {
/***************************************************************
syntax: mTree(dBase.field[0]) 
Retrieve field & icon values
performed for each record in dataSet
****************************************************************/
	var chp=dBase.$field[0].split('.');
	if(arguments[0]){chp=arguments[0].split('.');}
	var icon=dBase.$field[dBase.$field.length-1];
	var last=icon.indexOf(breaks[2]);
	var frst=icon.indexOf(breaks[0])+1;
	//confirm(selfUrl()+'/mTree/Line998:\nchp[0]='+chp[0]+'\nchp[1]='+chp[1]);
	var level=chp[1].indexOf('00')+1;
	var folder=icon.indexOf(folders[0])+1;
	opened=0;if(qarray[0]!=''){
		if(chp[0]==qarray[0]){opened++;}
		if(chp[0]==qarray[1]){opened++;}
		if(chp[0]==qarray[2]){opened++;}
		if(chp[0]==qarray[3]){opened++;}
		}
	select=0;if(qarray[0]!=''){if(chp[0]==qarray[0]){select++;}}
	//confirm(selfUrl()+'/mTree:'+'\narguments[0]='+arguments[0]+'\nchp[0]='+chp[0]+'\n'+aList("qarray")+'\nopened='+opened);
	Bg='off';if(select>0){Bg=hlc;}
	icon1='';
	icon2=icon;
	icon3='';
	icon4='';
	icon5='';
	var nAddr='';
	if(folder>0){
		if(opened>0){
			nAddr=chp[1];
			icon2=icons['node1'][1];
			if(last>0){
				icon2=icons['node2'][1];
			}else{
				if(frst>0){icon2=icons['node0'][1];}
				}
			}
		else{nAddr=chp[0];}
		}
	//confirm(selfUrl()+'/mTree:'+'\nlevel='+level );
	if(level==1){
		last2=0;
		last3=0;
		last1=last;
		if(folder>0){
			if(opened>0){
				icon1=icons['fol0'][1];
			}else{
				icon1=icons['fol0'][0];
			}
		}else{ 
			if(opened>0){
				icon1=icons['doc0'][1];
			}else	{
				icon1=icons['doc0'][0];
				}
			}
	}else{	
		icon5=icons['spc'][1];
		if(last1>0){icon5=icons['spc'][0];}
		if(level==2){	
			last3=0;
			last2=last;
			if(folder>0){
				if(opened>0){	icon1=icons['fol1'][1];}
				else{		icon1=icons['fol1'][0];}}
			else{ /* 2nd level document */
				if(opened>0){	icon1=icons['doc1'][1];}
				else 	{	icon1=icons['doc1'][0];}}
			}
	else{ 	
		icon4=icons['spc'][1];
		if(last2>0){icon4=icons['spc'][0];}
		if(level==3){	
			last3=last;
			if(folder>0){
				if(opened>0){	icon1=icons['fol2'][1];}
				else{ 		icon1=icons['fol2'][0];}}
			else{
				if(opened>0)	{icon1=icons['doc2'][1];}
				else		{icon1=icons['doc2'][0];}}
			}
	else{ 	
		icon3=icons['spc'][1];
		if(last3>0){icon3=icons['spc'][0];}
		if(opened>0){		icon1=icons['doc3'][1];}
		else		{	icon1=icons['doc3'][0];}
		}}}

	if(chp[0]!=''){sLink="parent.showMenu('"+chp[0]+"');";}else{sLink="void(0);";}
	if(nAddr!=''){iLink="parent.showMenu0('"+nAddr+"');";}else{iLink="void(0);";}
	iconStr='';
	if(icon5!=''){iconStr+='<img src="'+eval(icon5+'.src')+'" height="13px" />'}
	if(icon4!=''){iconStr+='<img src="'+eval(icon4+'.src')+'" height="13px" />'}
	if(icon3!=''){iconStr+='<img src="'+eval(icon3+'.src')+'" height="13px" />'}
	iconStr+='<a href=javascript:'+iLink+'><img src="'+eval(icon2+'.src')+'" height="13px" border="0" /><img src="'+eval(icon1+'.src')+'" height="13px" border="0" /></a>';
	}


function hl(){
/******************************************************************************/
	hlc='off';if(arguments[0]>0){hlc='on';}
	//confirm(selfUrl() +'/hl:'+'\narguments[0]='+arguments[0]+'\nhlc='+hlc);
	}


function getDoctype(){
/******************************************************************************/
	var $str='';
	$str=(xtractUrl(arguments[0]));
	if($str.indexOf(".")!=-1){
		$str=$str.substring($str.lastIndexOf(".")+1,$str.length);
	}else{
		if(arguments[0].indexOf("//")!=-1){
			$str='www';
	}else{
		$str='';}}
	if($str.length>0){
	if(avis[2].indexOf($str)!=-1){icons['doc']=pics;}else{
	if(pdfs[2].indexOf($str)!=-1){icons['doc']=pdfs;}else{
	if(docs[2].indexOf($str)!=-1){icons['doc']=docs;}else{
	if(wwws[2].indexOf($str)!=-1){icons['doc']=wwws;}else{
	if(htms[2].indexOf($str)!=-1){icons['doc']=htms;}}}}}}
	//else{
	//confirm('$str='+$str+'\narguments[0]='+xtractUrl(arguments[0])+'\nicons[doc]='+icons["doc"]);//}
	return($str);
	}

//confirm('End vserver.js');


