var G_inlinelogin='loginblock';	//the id of the div to toggle when logged out (in SC, this is the login box). This can be overridden elsewhere.

var G_FilterString="";
var G_dnifilter='';
var G_viewmode='1|1|S';
var G_st_answer=1;
var G_st_busy=0;
var G_st_noanswer=0;
var G_st_other=0;

var G_RPTable=new Array();
var G_DPTable=new Array();
var G_OBTable=new Array();
var G_VMTable=new Array();
var G_CSTable=new Array();

if(!window.G_imgdir) {var G_imgdir='';}

//used for alt text and title attribute, each in two places, so defined globally rather than repeating them all the time. This array is also used as a list of keys for the button types.
var G_AltText=new Array;
G_AltText['suspended']="Number is suspended: Please contact us to re-enable it.";
G_AltText['nowhere']="Number inactive. Callers will hear an engaged tone.";
G_AltText['number']="Configure with a single destination number (eg route to my home phone)";
G_AltText['dayparting']="Configure with a day parting (eg route to my mobile after office hours)";
G_AltText['routeplan']="Configure with a route plan (eg divert call after 15 seconds)";
G_AltText['fax2email']="Configured as a fax to email service.";
G_AltText['externally-routed']="Special customised configuration.";
G_AltText['2stageIDA']="Configured with 2-Stage Indirect Access.";
G_AltText['customer']="Allocate to one of your customers.";
G_AltText['sip']="Configure with a SIP (VOIP) address.";
G_AltText['sipport']="Configure with a SIP (VOIP) address.";
G_AltText['sipext']="Configure with a SIP (VOIP) address.";
G_AltText['originbased']="Origin-based routing. (caller location)";
G_AltText['voicemail']="Divert number directly to a voicemail box";
//G_AltText['voip']="Divert number directly to a voip gateway service";


var g_EditPage=new Array();
g_EditPage['notes']=new Array();
g_EditPage['number']='';
var NoteLen=25;


function ShowMain() {
	document.getElementById(G_inlinelogin).className="hideblock";
	document.getElementById("mainblock").className="showblock";
}
function HideMain() {
	document.getElementById(G_inlinelogin).className="showblock";
	document.getElementById("mainblock").className="hideblock";
}

//--------------------------------------------------------------------------

function LoadAcctCallsList(page,clickedelement) {
	if(document.getElementById('calls_showgraph')) {document.getElementById('calls_showgraph').innerHTML='';}
	var vmode=G_viewmode.split("|");
	var apicall = { "page":page, "perpage":G_ResultsPerPage, "sortfield":G_SortField, "sortorder":G_SortDir,
			"start_day":G_StartDay, "start_month":G_StartMonth, "start_year":G_StartYear, "end_day":G_EndDay, "end_month":G_EndMonth, "end_year":G_EndYear,
			"viewmode":G_viewmode, "st_answer":G_st_answer, "st_busy":G_st_busy, "st_noanswer":G_st_noanswer, "st_other":G_st_other, "dni":G_dnifilter};
	switch(vmode[2]) {
		case 'S' :
			document.body.style.cursor = "wait";				//this will be reset by ListNums or ListNumsErr.
			if(clickedelement) {if(clickedelement.style) {clickedelement.style.cursor="wait";}}	//this doesn't need to be reset, as the element involved will be destroyed anyway.
			apilite_post("callsummary.php?",apicall, 'ListCalls', page+","+G_FilterString, 'ListCallsErr', page+","+G_FilterString);
			break;
		case 'G' :
			CallSummaryGraph(apicall);
			break;
		default  : alert("Please select a valid report option.");
	}
}

function CallSummaryGraph(params) {
	if(!G_enable_graphs) {alert("Graph options are not available. Please contact us to enable this feature."); return;}
	var url='callout/callsummarygraph.php?';
	for(var pa in params) {if(params[pa]) {url+=pa+'='+params[pa]+'&';}}
	document.getElementById("mainblock").innerHTML=ListCallsSearch('a');;
	ShowDebug("Graph: "+url+"\n<br />");
	document.getElementById('calls_showgraph').innerHTML='<center><img src="'+url+'" /></center>';
	document.body.style.cursor = "default";
	ShowMain();
}

function ListCalls(responsestring,args) {
	//alert(responsestring);
	var tmp=responsestring.split("\n");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";
	var chgcols="";
	if(tmp.length==0) {
		outstr="<div align='center'>No account call data was found in your account within the specified date range.</div>";
	} else {
		var totnums=parseInt(tmp[0]);
		var pagenum=parseInt(argv[0]);
		var itemdesc="";

		outstr+=ListCallsSearch('a');

		outstr+="<table cellspacing='0' cellpadding='2' style='width:98%;' class='smallText pad15L resultTable'>";

		var hdr_dni='';
		var vmode=G_viewmode.split("|");
		if(vmode[1]==1) {
			//period summary; shows number of DNIs dialled
			hdr_dni='<span class="infohelp" title="How many of your numbers were called during this period">DNIs<br />used</span>';
		}else{
			//dni summary; shows each individual DNI.
			hdr_dni='<span class="infohelp" title="DNI: Dialled Number Identifier; your Skycom number">DNI</span> '+SortButtons('DNI','dni',pagenum);
		}

		outstr+="<tr class='t2bb numlookup_hdr'>"
		if(vmode[0]==9) {
			outstr+="<th align='left' rowspan='2'>Call<br />Time "+SortButtons('Call Time','day',pagenum)+"</th><th rowspan='2'>Call Status</th><th rowspan='2'>"+hdr_dni+"</th><th rowspan='2'><span class='infohelp' title='DDI: Direct Dialling In; your destination number'>DDI</span> "+SortButtons('DDI','ddi',pagenum)+"</th><th rowspan='2'><span class='infohelp' title='CLI: Caller Line Identity; the number that called you'>CLI</span> "+SortButtons('CLI','cli',pagenum)+"</th><th colspan='5' class='t2bl t2br' style='border-bottom:none;'>Duration (minutes:seconds) "+SortButtons('Total duration','dur_tot',pagenum)+"</th>"
			if(!G_nocharge) {outstr+="<th class='infohelp' title='Call cost to nearest tenth of a penny. Rebates are shown as negatives.' align='left' rowspan='2'>Net<br />Charge "+SortButtons('Net Charge','charge_mGBP',pagenum)+"</th>";}
		}else{
			outstr+="<th rowspan='2'>"+(vmode[0]==1?'Month ':'Date ')+SortButtons('Call Date','day',pagenum)+"</th><th rowspan='2'>"+hdr_dni+"</th><th rowspan='2'>Number<br />of Calls</th><th colspan='5' class='t2bl t2br' style='border-bottom:none;'>Duration (minutes:seconds)</th>"
			if(!G_nocharge) {outstr+="<th align='right' rowspan='2'>Charge</th><th align='right' rowspan='2'>Rebate</th><th class='infohelp' title='Call cost; rebates shown as negatives.' align='right' rowspan='2'>Net Charge</th>";}
		}
		outstr+="</tr>"
			+"<tr class='t2bb numlookup_hdr'>"
			+"<th align='right' class='t2bl'>Peak</th><th align='right'>Off-peak</th><th align='right'>Weekend</th><th align='right'>Total</th><th align='right' class='t2br'><span class='infohelp' title='Chargeable minutes: total call time minus bundled minutes used'>Chargeable</span></th>"
			+"</tr>";

		for(count=1;count<tmp.length-1;count++) {
			var field=tmp[count].split("|");
			var bgcol=(count%2==0?"numrow_1":"numrow_2")

			var mnth={'01':"Jan",'02':"Feb",'03':"Mar",'04':"Apr",'05':"May",'06':"Jun",'07':"Jul",'08':"Aug",'09':"Sep",'10':"Oct",'11':"Nov",'12':"Dec"};

			var fld_mins_pkr=SecsToMins(field[3]);
			var fld_mins_opk=SecsToMins(field[4]);
			var fld_mins_wkd=SecsToMins(field[5]);
			var fld_mins_tot=SecsToMins(field[6]);
			var fld_mins_chg=SecsToMins(field[7]);

			if(vmode[0]==9) {
				var fld_chgout=parseInt(field[8]*1000)/1000;
				var fld_rebate=parseInt(field[9]*1000)/1000;
				var fld_charge=parseInt(field[10]*1000)/1000;

				var mnthnum=field[0].substr(5,2);
				var fld_date='';
				var thismonth=mnth[mnthnum]+'-'+field[0].substr(2,2);
				var datadate=(vmode[0]==1?'':field[0].substr(8,2)+'-')+thismonth+(vmode[0]==9?"<br />"+field[0].substr(11,8):"");

				var datadate2='';
				var answertime='';
				if(field[12]) {
					var mnthnum=field[12].substr(5,2);
					var fld_date='';
					var thismonth=mnth[mnthnum]+'-'+field[12].substr(2,2);
					datadate2=field[12].substr(8,2)+'-'+thismonth+" "+field[12].substr(11,8);
					answertime=field[12].substr(11,8)
				}

				var stypes={ANSWER:"<span class='infohelp' title='Call was answered'>Answered<br />at "+answertime+"</span>",BUSY:"<span class='infohelp' title='Your line was busy when the call was made'>Busy</span>",NOANSWER:"<span class='infohelp' title='Your phone rang but was not answered'>Unanswered</span>",CANCEL:"<span class='infohelp' title='Call was rejected or aborted before anwswer'>Cancelled</span>"};
				var callstatus="<span class='infohelp' title='An error occurred connecting the call'>Failed</span>";	//default for several statuses. (CHANUNAVAIL,CONGESTION,FAILED, plus any other unknown ones)
				if(stypes[field[11]]) {callstatus=stypes[field[11]];}

				if(!G_nocharge) {chgcols="<td align='right'>"+"&#163;"+fld_charge.toFixed(3)+"</td>";}

				outstr+="<tr class='"+bgcol+";'>"
					+"<td>"+datadate+"</td>"
					+"<td>"+callstatus+"</td>"
					+"<td align='left'>"+field[1]+"</td>"
					+"<td align='left'>"+field[13]+"</td>"
					+"<td align='left'>"+(field[14].match(/x/)?'* Withheld *':field[14])+"</td>"
					+"<td align='right' class='t2bl'>"+fld_mins_pkr+"</td>"
					+"<td align='right'>"+fld_mins_opk+"</td>"
					+"<td align='right'>"+fld_mins_wkd+"</td>"
					+"<td align='right'>"+fld_mins_tot+"</td>"
					+"<td align='right' class='t2br'>"+fld_mins_chg+"</td>"
// 					+"<td align='right'>"+"&#163;"+fld_chgout.toFixed(3)+"</td>"
// 					+"<td align='right'>"+"&#163;"+fld_rebate.toFixed(3)+"</td>"
					+chgcols
					+"</tr>";
			}else{
				var fld_chgout=Math.ceil(field[8]*100)/100;	//round up away from zero (charges are positive)
				var fld_rebate=Math.floor(field[9]*100)/100;	//round down away from zero (rebates are negative)
				var fld_charge=(field[10]>0?Math.ceil(field[10]*100):Math.floor(field[10]*100))/100;	//round up or down depending if pos or neg

				var mnthnum=field[0].substr(5,2);
				var fld_date='';
				var thismonth=mnth[mnthnum]+'-'+field[0].substr(0,4);
				var datadate=(vmode[0]==1?'':field[0].substr(8,2)+'-')+thismonth+(vmode[0]==9?" "+field[0].substr(12,8):"");

				if(!G_nocharge) {
					chgcols="<td align='right'>"+"&#163;"+fld_chgout.toFixed(2)+"</td>"
						+"<td align='right'>"+"&#163;"+fld_rebate.toFixed(2)+"</td>"
						+"<td align='right'>"+"&#163;"+fld_charge.toFixed(2)+"</td>";
				}

				outstr+="<tr class='"+bgcol+";'>"
					+"<td style='padding-left:15px;'>"+datadate+"</td>"
					+"<td align='"+(vmode[1]==1?'right':'left')+"'>"+field[1]+"</td>"
					+"<td align='right'>"+field[2]+"</td>"
					+"<td align='right' class='t2bl'>"+fld_mins_pkr+"</td>"
					+"<td align='right'>"+fld_mins_opk+"</td>"
					+"<td align='right'>"+fld_mins_wkd+"</td>"
					+"<td align='right'>"+fld_mins_tot+"</td>"
					+"<td align='right' class='t2br'>"+fld_mins_chg+"</td>"
					+chgcols
					+"</tr>";
			}
		}

		outstr+="</table>";

		outstr+="<div class='smallText pad15L' align='right' style='margin:0px; width:98%; text-align:right;'>"+Pages((pagenum-1)*G_ResultsPerPage,G_ResultsPerPage,totnums)+"</div>";

		var pstart=parseInt((pagenum-1)*G_ResultsPerPage+1);
		var pend=pstart+(G_ResultsPerPage-1);
		if(pend>totnums) {pend=totnums;}
		outstr+="<div class='smallText' style='width:98%' align='right'>Showing results "+pstart+" to "+pend+" of "+totnums+".</div>";
	}
	document.getElementById("mainblock").innerHTML=outstr;
	document.body.style.cursor = "default";
	ShowMain();
}

function ListCallsErr(responsestring,args) {
	//alert(responsestring);
	var tmp=responsestring.split("|");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";
	var chgcols="";

	if(!G_nocharge) {chgcols="<th rowspan='2'>Charge</th><th rowspan='2'>Rebate</th><th rowspan='2'>Net Charge</th>";}

	if(responsestring.match("expired")) {AutoLogout(); return;}
	if(tmp.length==2) {responsestring=tmp[1];}	//drop the error code number, if it was passed.
	if(responsestring.match(/dni.starts/)) { responsestring="You must enter a number, or part of a number, to filter the search."; }
	outstr+=ListCallsSearch('a');

	outstr+="<table cellspacing='0' cellpadding='2' style='width:98%;' class='smallText pad15L resultTable'>";
	outstr+="<tr>"
		+"<th rowspan='2'>Date</th><th rowspan='2'>DNI</th><th rowspan='2'>Number<br />of Calls</th><th colspan='4'>Duration</th>"+chgcols
		+"</tr>"
		+"<tr>"
		+"<th>Tot Peak</th><th>Tot Off-peak</th><th>Total</th><th>Tot Chargeable</th>"
		+"</tr>";

	outstr+="<tr><td colspan='20' align='center'>"+responsestring+"</td></tr>";

	outstr+="</table>";

	outstr+="<div class='smallText pad15L' align='right' style='margin:0px; width:98%; text-align:right;'>"+Pages(0,G_ResultsPerPage,0)+"</div>";

	document.getElementById("mainblock").innerHTML=outstr;
	document.body.style.cursor = "default";
	ShowMain();
}

function ListCallsSearch(ab) {
	var outstr="";
	outstr+="<table class='smallText pad15L' style='margin:0px; width:98%;'>";
	outstr+="<tr><td style='vertical-align:20%;'>Report Type: </td><td><select style='font-size:1.1em;' name='showtype_"+ab+"' id='showtype_"+ab+"' onchange='G_SortField=G_DefSortField;G_SortDir=G_DefSortDir;'>"+CallsSummaryOpts()+"</select> "
		+"<span style='border:solid 1px #BBBBBB; padding-top:5px; padding-left:5px; padding-right:5px; margin:2px;'><span style='vertical-align:20%;'>Call Statuses:</span>"
		+StatusCheckbox("status_answer_"+ab,"Answered",G_st_answer)+StatusCheckbox("status_busy_"+ab,"Busy",G_st_busy)+StatusCheckbox("status_noanswer_"+ab,"Un-answered",G_st_noanswer)+StatusCheckbox("status_other_"+ab,"Other",G_st_other)
		+"</td></tr>";
	outstr+="<tr><td style='vertical-align:20%;'>Between:</td><td>"+DayCombo("st_day_"+ab,G_StartDay)+MonthCombo("st_month_"+ab,G_StartMonth)+YearCombo("st_year_"+ab,G_StartYear)+"<span style='vertical-align:20%;'> and </span>"+DayCombo("en_day_"+ab,G_EndDay)+MonthCombo("en_month_"+ab,G_EndMonth)+YearCombo("en_year_"+ab,G_EndYear)+"</td></tr>"
		+"<tr><td id='filter_dni' class='infohelp' title='A number or number prefix to filter the search' style='vertical-align:20%;'>Number starts:</td><td><input class=\"cartForm mgtsearchfield\" style='font-size:1.1em;' type='text' size='14' name='shownumber_"+ab+"' id='shownumber_"+ab+"' value='"+G_dnifilter+"' /> ";
	outstr+="<img src='"+G_imgdir+"images/search-a.gif' class='clickable mgtsearchbtn' style='vertical-align:-25%;' onmouseover='this.src=\""+G_imgdir+"images/search-b.gif\";' onmouseout='this.src=\""+G_imgdir+"images/search-a.gif\";' onclick='SetDateRange(\""+ab+"\",2); "+G_LoadFunc+"(1,this);' /></td></tr>";
	outstr+="</table><br />";
	outstr+="<div id='calls_showgraph' style='width:100%;'/>";
	return outstr;
}

function CallsSummaryOpts() {
	var outstr="";
	var sel="selected='1'";
	outstr=  "<option value='1|1|S' "+(G_viewmode=='1|1|S'?sel:"")+">Monthly call summary</option>"
		+"<option value='2|1|S' "+(G_viewmode=='2|1|S'?sel:"")+">Daily call summary</option>"
		+"<option value='1|2|S' "+(G_viewmode=='1|2|S'?sel:"")+">Monthly totals per number</option>"
		+"<option value='2|2|S' "+(G_viewmode=='2|2|S'?sel:"")+">Daily totals per number</option>"
		+"<option value='9|9|S' "+(G_viewmode=='9|9|S'?sel:"")+">Individual call data</option>";
	if(G_enable_graphs) {
		outstr +="<option value=''> ------------------------- </option>"
			+"<option value='1|1|G|Q' "+(G_viewmode=='1|1|G|Q'?sel:"")+">Monthly call qty graph</option>"
			+"<option value='1|1|G|M' "+(G_viewmode=='1|1|G|M'?sel:"")+">Monthly call mins graph</option>"
			+"<option value='2|1|G|Q' "+(G_viewmode=='2|1|G|Q'?sel:"")+">Daily call qty graph</option>"
			+"<option value='2|1|G|M' "+(G_viewmode=='2|1|G|M'?sel:"")+">Daily call mins graph</option>"
	}
	return outstr;
}

//--------------------------------------------------------------------------

function LoadAcctHistList(page,clickedelement) {
	document.body.style.cursor = "wait";				//this will be reset by ListNums or ListNumsErr.
	if(clickedelement) {if(clickedelement.style) {clickedelement.style.cursor="wait";}}	//this doesn't need to be reset, as the element involved will be destroyed anyway.
	var apicall="accthist.php?page="+page+"&perpage="+G_ResultsPerPage+"&start_day="+G_StartDay+"&start_month="+G_StartMonth+"&start_year="+G_StartYear+"&end_day="+G_EndDay+"&end_month="+G_EndMonth+"&end_year="+G_EndYear;
	apilite_call(apicall, 'ListHist', page+","+G_FilterString, 'ListHistErr', page+","+G_FilterString);
}

function ListHist(responsestring,args) {
	//alert(responsestring);
	var tmp=responsestring.split("\n");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";
	if(tmp.length==0) {
		outstr="<div align='center'>No account history records were found in your account within the specified date range.</div>";
	} else {
		var totnums=parseInt(tmp[0]);
		var pagenum=parseInt(argv[0]);
		var itemdesc="";

		outstr+=ListHistSearch('a');

		outstr+="<table cellspacing='0' cellpadding='2' style='width:98%;' class='smallText pad15L resultTable'>";
		outstr+="<tr class='numlookup_hdr' style='height:2.5em; font-weight:bold;'><td style='padding-left:15px;'>Date</td><td align='left'>Item</td><td align='right' style='text-align:right;'>Credit</td><td align='right' style='text-align:right;'>Debit</td><td align='right' style='text-align:right;'>Balance</td><!--<td>Actions</td>--></tr>";

		for(count=1;count<tmp.length-1;count++) {
			var field=tmp[count].split("|");
			var bgcol=(count%2==0?"numrow_1":"numrow_2")
			if(field[5]=='invoice') {
				itemdesc="<a href='displayinvoice.php?invid="+field[6]+"' target='_blank'>INVOICE #"+field[7]+", "+field[10]+" item(s)</a>";
			} else {
				itemdesc=field[9].toUpperCase()+" "+field[5].toUpperCase()+", Ref: "+field[8];
			}
			outstr+="<tr class='"+bgcol+"'><td style='padding-left:15px;'>"+field[2]+"</td><td align='left'>"+itemdesc+"</td><td align='right' style='text-align:right;'>"+(field[3]>0?field[3]:"&nbsp;")+"</td><td align='right' style='text-align:right;'>"+(field[3]<0?field[3]:"&nbsp;")+"</td><td align='right' style='text-align:right;'>"+field[4]+"</td><!--<td>Actions</td>--></tr>";
		}
		outstr+="</table>";

		outstr+="<div class='smallText pad15L' align='right' style='margin:0px; width:98%; text-align:right;'>"+Pages((pagenum-1)*G_ResultsPerPage,G_ResultsPerPage,totnums)+"</div>";

		var pstart=parseInt((pagenum-1)*G_ResultsPerPage+1);
		var pend=pstart+(G_ResultsPerPage-1);
		if(pend>totnums) {pend=totnums;}
		outstr+="<div class='smallText' style='width:98%' align='right'>Showing results "+pstart+" to "+pend+" of "+totnums+".</div>";
	}
	document.getElementById("mainblock").innerHTML=outstr;
	document.body.style.cursor = "default";
	ShowMain();
}

function ListHistErr(responsestring,args) {
	//alert(responsestring);
	var tmp=responsestring.split("|");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";

	if(responsestring.match("expired")) {AutoLogout(); return;}
	if(tmp.length==2) {responsestring=tmp[1];}	//drop the error code number, if it was passed.
	outstr+=ListHistSearch('a');

	outstr+="<table cellspacing='0' cellpadding='2' style='width:98%;' class='smallText pad15L resultTable'>";
	outstr+="<tr class='numlookup_hdr' style='height:2.5em; font-weight:bold;'><td style='padding-left:15px;'>Date</td><td align='center'>Item</td><td align='right' style='text-align:right;'>Credit</td><td align='right' style='text-align:right;'>Debit</td><td align='right' style='text-align:right;'>Balance</td><!--<td>Actions</td>--></tr>";

	outstr+="<td colspan='20' align='center'>"+responsestring+"</td></tr>";

	outstr+="</table>";

	outstr+="<div class='smallText pad15L' align='right' style='margin:0px; width:98%; text-align:right;'>"+Pages(0,G_ResultsPerPage,0)+"</div>";

	document.getElementById("mainblock").innerHTML=outstr;
	document.body.style.cursor = "default";
	ShowMain();
}

function ListHistSearch(ab) {
	outstr="";
	outstr+="<table class='smallText pad15L' style='margin:0px; width:98%;'><tr><td align='left'>";
	outstr+="<span style='vertical-align:20%;'>Range: </span>"+DayCombo("st_day_"+ab,G_StartDay)+MonthCombo("st_month_"+ab,G_StartMonth)+YearCombo("st_year_"+ab,G_StartYear)+"<span style='vertical-align:20%;'> to </span>"+DayCombo("en_day_"+ab,G_EndDay)+MonthCombo("en_month_"+ab,G_EndMonth)+YearCombo("en_year_"+ab,G_EndYear);
	outstr+="<img src='"+G_imgdir+"images/search-a.gif' class='clickable mgtsearchbtn' style='vertical-align:-25%;' onmouseover='this.src=\""+G_imgdir+"images/search-b.gif\";' onmouseout='this.src=\""+G_imgdir+"images/search-a.gif\";' onclick='SetDateRange(\""+ab+"\"); "+G_LoadFunc+"(1,this);' />";
	outstr+="</td></tr></table>";
	return outstr;
}

//--------------------------------------------------------------------------

function PreloadSequence(pldseq) {
	pldseq++;
	switch(pldseq) {
		case 1: //routeplans
			BuildRoutePlanArray(G_RPTable,"",'PreloadSequence('+pldseq+')','PreloadSequence('+pldseq+')');
			break;
		case 2: //dayparting
			BuildDayPartingArray(G_DPTable,"",'PreloadSequence('+pldseq+')','PreloadSequence('+pldseq+')');
			break;
		case 3: //customers
			//DCK -- if(readCookie('cpt')) {
			if(readCookie('cpt') || readCookie('uid')=="22774") {
			//DCK: the CPT value hold the reseller status such as "bronze, gold etc." 
			//     22774 is Mrs. Anne Example 
				BuildResoldCustArray(G_CSTable,'PreloadSequence('+pldseq+')','PreloadSequence('+pldseq+')');
				break;
			}
		case 4: //mailboxes
			BuildMailboxArray(G_VMTable,'PreloadSequence('+pldseq+')','PreloadSequence('+pldseq+')');
			break;
		default://insert new features in sequence above here.
			LoadNumberList(1);
			ShowMain();
			break;
	}
}

function LoadNumberList(page,clickedelement) {
	document.body.style.cursor = "wait";				//this will be reset by ListNums or ListNumsErr.
	if(clickedelement) {if(clickedelement.style) {clickedelement.style.cursor="wait";}}	//this doesn't need to be reset, as the element involved will be destroyed anyway.
	var apicall="listmynums.php?page="+page+"&filter="+G_FilterString+"&perpage="+G_ResultsPerPage+"&sortfield="+G_SortField+"&sortorder="+G_SortDir;
	apilite_call(apicall, 'ListNums', page+","+G_FilterString, 'ListNumsErr', page+","+G_FilterString);
}

function ListNums(responsestring,args) {
	var tmp=responsestring.split("\n");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";
	var anyexterns=false;
	var lastnum='';

	if(tmp.length==0) {
		outstr="<div align='center'>No numbers were found in your account.</div>";
	} else {
		var totnums=parseInt(tmp[0]);
		var pagenum=parseInt(argv[0]);
		var anyfacs=false;
		var maxbtns=0;

		outstr+=ListNumsSearchAndPages((pagenum-1)*G_ResultsPerPage,G_ResultsPerPage,totnums,argv[1],'a');
		outstr+="<table cellspacing='0' cellpadding='2' class='smallText pad15L resultTable2 numlookup_tbl'>";
		outstr+="<tr class='numlookup_hdr' style='height:2.5em; font-weight:bold;'><td style='padding-left:15px;'>Number "+SortButtons('Number','number',pagenum)+"</td>"+(!G_nocharge?"<td align='center' class='advancedblock'>Notes</td>":"")+"<td align='center' class='advancedblock'>Termination Method</td><td colspan='3' align='center'>Termination Details</td></tr>";

		if(!G_RPTable.length) {
			var rpselopts="<option value=''>-- no route plans --</option>";
		} else {
			var rpselopts="<option value=''>-- please select --</option>";
			for(count in G_RPTable) {
				rpselopts+="<option value='"+count+"'>"+G_RPTable[count]['name']+"</option>";
			}
		}

		if(!G_DPTable.length) {
			var dpselopts="<option value=''>-- no day partings --</option>";
		} else {
			var dpselopts="<option value=''>-- please select --</option>";
			for(count in G_DPTable) {
				dpselopts+="<option value='"+count+"'>"+G_DPTable[count]['name']+"</option>";
			}
		}

		if(!G_OBTable.length) {
			var obselopts="<option value=''>-- no origin lists --</option>";
		} else {
			var obselopts="<option value=''>-- please select --</option>";
			for(count in G_OBTable) {
				obselopts+="<option value='"+count+"'>"+G_OBTable[count]['name']+"</option>";
			}
		}

		if(!G_VMTable.length) {
			var vmselopts="<option value=''>-- no voicemail boxes --</option>";
		} else {
			var vmselopts="<option value=''>-- please select --</option>";
			for(count in G_VMTable) {
				vmselopts+="<option value='"+count+"'>"+G_VMTable[count]['name']+"</option>";
			}
		}

		if(G_CSTable.length==0) {
			var csselopts="<option value=''>-- no customers --</option>";
		} else {
			var csselopts="<option value=''>-- please select --</option>";
			for(count in G_CSTable) {
				csselopts+="<option value='"+count+"'>"+G_CSTable[count]['name']+"</option>";
			}
		}

		for(count=1;count<tmp.length-1;count++) {
			var field=tmp[count].split("|");
			var bgcol=(count%2==0?"numrow_1":"numrow_2")
			var notesfield=field[6].replace(/#!#/g,"|");	//pipes were transformed in the calling func to stop them interfering with split, so put them back now if neccessary.
			var notesfield=field[6].replace(/#!!#/g,"\n");	//pipes were transformed in the calling func to stop them interfering with split, so put them back now if neccessary.
			var fullnotes=notesfield;
			if(notesfield.length>NoteLen) {notesfield=notesfield.substr(0,NoteLen-3)+"...";}
			g_EditPage['notes'][field[0]]=fullnotes;
			var facilities=new Array();
			var suspfacs=new Array();
			var tmpsplt=field[7].split(/~/);
			for(var fac in tmpsplt) {facilities[tmpsplt[fac]+'.DNI']=tmpsplt[fac]+'.DNI';}
			var availfacs=new Array();
			var tmpsplt=field[8].split(/~/);
			for(var fac in tmpsplt) {
				var fldspl=tmpsplt[fac].split(/@/);
				availfacs[fldspl[0]+'.DNI']=fldspl;
			}
			var tmpsplt=field[9].split(/~/);
			for(var fac in tmpsplt) {suspfacs[tmpsplt[fac]+'.DNI']=tmpsplt[fac]+'.DNI';}
			lastnum=field[0];	//remember the last one we looked at.

// 			facilities['ROU.BASIC.DNI']=99; availfacs['ROU.BASIC.DNI']=new Array(); suspfacs['ROU.BASIC.DNI']=0;

			var afacs={
				   'ROU.DAYPART.DNI':'dayparting|Day Parting|1|',
				   'ROU.ORIGIN.DNI':'originbased|Origin-based|1|',
				   'ROU.FAX2EMAIL.DNI':'fax2email|Fax-to-Email|1|',
				   'DNIENBL.DNI':'dni|DNI (Dialled Number Identifier)|1|',
				   'ROU.DDI.MOB.DNI':'mobile|Mobile Routing|1',
				   'ROU.DDI.INT.DNI':'international|International Routing|1',
				   'ROU.DDI.NGN.DNI':'ngn|Non-Geographic Routing|1',
				   'DNI.OSIS.DNI':'osis|Directory Enquiries Listing (OSIS)|1',
				   'WHISPER.DNI':'whisper|Announcements|1',
				   'ROU.VMAIL.DNI':'voicemail|Voicemail|1|',
				   'ROU.VOIP.DNI':'voip|Voip|1|'
				};

			var facattrs=new Array();
			var facaopts=new Array();
			var factoggle=new Array();
			for(var df in afacs) {factoggle[df]=-1;}
			var tmpsplt=field[10].split(/~/);
			for(var allattr in tmpsplt) {
				var attrsplt=tmpsplt[allattr].split(/;/);
				for(var attr in attrsplt) {
					var fldspl=attrsplt[attr].split(/:/);
					var fa_attrfac=fldspl.shift()+'.DNI';
					var fa_attrcode=fldspl.shift();
					var fa_attropts=fldspl.shift(); if(fa_attropts=='X') {fa_attropts='';}
					var fa_attrvalue=fldspl.join(':');	//remaining bits make up the description and value.

					if(fa_attrcode=='active') {	//special case for 'active' attribute, to display the play/pause buttons.
						factoggle[fa_attrfac]=fldspl[1];
					} else {
						if(!facattrs[fa_attrfac]) {facattrs[fa_attrfac]=new Array();}
						if(!facaopts[fa_attrfac]) {facaopts[fa_attrfac]=new Array();}
						var facls=fa_attrfac;
						var faatt=fa_attrcode;
						facaopts[fa_attrfac][fa_attrcode]=fa_attropts;
						facattrs[fa_attrfac][fa_attrcode]=fa_attrvalue;
					}
				}
			}

			var facstr='';
			if(field[5]=='0') {
				facstr="<div style='padding:5px;'>This is one of our older numbers and as such cannot use some of the newer facilities, such as Route Plans or Day Parting. If you wish to use these features, please contact us to discuss your options.</div>";
			} else {
				if(!G_rsld) {
					for(var df in afacs) {
						if(availfacs[df] || facilities[df]) {
							facstr+=FacilityInfo(field[0],df,afacs[df],facilities[df],availfacs[df],suspfacs[df],factoggle[df],facattrs[df],facaopts[df]);
							anyfacs=true;
						}
					}
				}
			}

			var expander='';
			if(facstr.length>0) {
				expander="<img src='"+G_imgdir+"images/plus.gif' id='expanderplus_"+field[0]+"' class='clickable mgtsortbtn' onclick='DisplayToggle(\"numextra_"+field[0]+"\",this)' title='Click to view facility options for this number.'> ";
			}

			outstr+="<tr class='"+bgcol+"' style='height:27px;'>"
				+"<td style='padding-left:15px;'>"+expander+field[0]+"</td>";
			if(!G_nocharge) {outstr+="<td style='padding-left:15px;' class='advancedblock'>"+"<img src='"+G_imgdir+"images/pencil.gif' class='clickable' onclick='editnotes(\""+field[0]+"\",document.getElementById(\"numnotes_"+field[0]+"\").innerHTML);' /><span id='numnotes_"+field[0]+"'>"+notesfield+"</span></td>";}

			//----------------------------------------

			var enable_nw=(field[5]!='0')?true:false;	//route to nowhere.
			var enable_vp=(field[5]!='0')?true:false;	//route to nowhere.
			var enable_rp=(field[5]!='0' && facilities['ROU.ROUTEPLAN.DNI'])?true:false;
			var enable_dp=(field[5]!='0' && facilities['ROU.DAYPART.DNI'])?true:false;
			var enable_ob=(field[5]!='0' && facilities['ROU.ORIGIN.DNI'])?true:false;
			var enable_fx=(field[5]!='0' && facilities['ROU.FAX2EMAIL.DNI'])?true:false;
			var enable_vm=(field[5]!='0' && facilities['ROU.VMAIL.DNI'])?true:false;
			var enable_cs=readCookie('cpt');
			if(window.G_custbtnoverride) {enable_cs=true;}
			var thisbtns=new Array();
			var singlebuttons={'suspended':true,'externally-routed':true,'2stageIDA':true};	//these types are manually configured and can't be toggled, so if they're set, we'll only show the one button.
			if(field[5]=='0') {singlebuttons.fax2email=true;}
			var groupbuttons={'nowhere':enable_nw,'number':true,'routeplan':enable_rp,'dayparting':enable_dp,'originbased':enable_ob,'fax2email':enable_fx, 'voicemail':enable_vm, 'sip':enable_vp};	//these types can be toggled in the admin panel.

			var mainbuttons=true;
			for(var sb in singlebuttons) {if(field[12]==sb) {thisbtns[sb]=true; mainbuttons=false;}}
			if(mainbuttons) {for(var gb in groupbuttons) {if(groupbuttons[gb]) {thisbtns[gb]=true;}}}
			if(enable_cs && field[12]!='suspended') {thisbtns['customer']=true;}	//customer is a special type which shows at the end for resellers, regardless of what else is being shown (except suspended)

			var totbtns=0;
			for(var key in thisbtns) {totbtns++;}
			if(totbtns>maxbtns) {maxbtns=totbtns;}

			outstr+="<td align='center' id='advanced_"+field[0]+"' class='advancedblock routetoggleblock'><div class='routetogglediv'>";
			for(var key in thisbtns) {outstr+=DrawBtn(key,field[0],field[1]);}
			outstr+="</div></td>";

			outstr+="<td class='termopt_td' align='center' style='width:305px;'>";
			if(thisbtns['suspended']){outstr+=RoutingField('suspended',false,field[0],field[1],'Number suspended. Please contact us to re-enable it.','none','');}
			if(thisbtns['fax2email']){outstr+=RoutingField('fax2email',enable_fx,field[0],field[1],'Email Addr:','input',field[2]);}
			if(thisbtns['sip']){outstr+=RoutingField('sip',true,field[0],field[1],'SIP Addr:','input',field[2]);}
			if(thisbtns['externally-routed']) {outstr+=RoutingField('externally-routed',false,field[0],field[1],'Externally Routed <sup>*</sup>','none',''); anyexterns=true;}
			if(thisbtns['2stageIDA']) {outstr+=RoutingField('2stageIDA',false,field[0],field[1],'2-Stage IDA (Indirect Access)','none','');}
			if(thisbtns['number']) {outstr+=RoutingField('number',true,field[0],field[1],'Number:','input',field[2]);}
			if(thisbtns['routeplan']) {outstr+=RoutingField('routeplan',true,field[0],field[1],'Route Plan:','select',rpselopts);}
			if(thisbtns['dayparting']) {outstr+=RoutingField('dayparting',true,field[0],field[1],'Day Parting:','select',dpselopts);}
			if(thisbtns['originbased']) {outstr+=RoutingField('originbased',true,field[0],field[1],'Origin List:','select',obselopts);}
			if(thisbtns['voicemail']) {outstr+=RoutingField('voicemail',true,field[0],field[1],'Mailbox:','select',vmselopts);}
			if(thisbtns['customer']) {outstr+=RoutingField('customer',true,field[0],field[1],'Customer:','select',csselopts);}
			if(thisbtns['nowhere']) {outstr+=RoutingField('nowhere',true,field[0],field[1],'Inactive:','saveonly','Caller hears engaged tone');}
// 			if(field[12]=='nowhere') {outstr+=RoutingField('nowhere',false,field[0],field[1],'Number not routed: Use this page to configure it.','');}
			outstr+="</td>";

			outstr+="</tr>";

			//----------------------------------------

			outstr+="<tr id='numextra_"+field[0]+"' class='mgtextrainfo "+bgcol+"' style='display:none;'><td colspan='4' style='border:none;'>";
			outstr+="<table style='width:100%;'><td style='border:none;'><img src='"+G_imgdir+"images/spacer.gif' style='width:25px;' width='25' height='10' /></td><td align='right' style='border:none; padding:2px;'>";
			outstr+="<table class='expandTable'>"+facstr+"</table>";
			outstr+="</td></tr></table>";
			outstr+="</td></tr>";
		}
		outstr+="</table>";

		if(maxbtns==5 || maxbtns==6) {maxbtns=3;}
		if(maxbtns==7 || maxbtns==8) {maxbtns=4;}
		if(maxbtns>8) {maxbtns=5;}
		var btnpos=(30*maxbtns);
		SetStyle('.routetogglediv','width',btnpos+'px');

		if(G_ResultsPerPage>=25) {outstr+=ListNumsSearchAndPages((pagenum-1)*G_ResultsPerPage,G_ResultsPerPage,totnums,argv[1],'b');}
		var pstart=parseInt((pagenum-1)*G_ResultsPerPage+1);
		var pend=pstart+(G_ResultsPerPage-1);
		if(pend>totnums) {pend=totnums;}
		outstr+="<div class='smallText' style='width:98%' align='right'>Showing results "+pstart+" to "+pend+" of "+totnums+".</div>";
		if(anyexterns) {
			outstr+="<div class='smallText' style='width:90%;'><div style='float:left; margin:5px;'><sup>*</sup></div><div style='float:left; margin:5px;'>Any number marked as Externally Routed can only be re-routed manually or via an advanced control area.<br />Please contact us for details.</div></div>";
		}
	}
	var plusstr='';
	if(anyfacs) {plusstr='<div style="padding-left:10px; font-weight:bold;" id="pageinfo">Click the plus icon by your numbers to view the available facilities.</div><br />';}

	document.getElementById("mainblock").innerHTML=plusstr+outstr;

	//once the table is drawn, we can populate the selected opts in the drop box lists, if needed.
	//(this is easier to do here than in the previous loop, because this way we don't have to change the selopts variable)
	if(tmp.length) {
		for(count=1;count<tmp.length-1;count++) {
			var combos={'routeplan':true,'dayparting':true,'originbased':true,'voicemail':true};
			var field=tmp[count].split("|");
			var elem=document.getElementById('sel-'+field[12]+'-'+field[0]);
			if(elem && combos[field[12]]) {elem.value=field[3];}
			if(field[1]=='customer') {document.getElementById('sel-'+field[1]+'-'+field[0]).value=field[11];}
		}
	}

	if(!G_rsld && totnums==1) {DisplayToggle("numextra_"+lastnum,document.getElementById('expanderplus_'+lastnum));}	//if only got one number, expand the facilities immediately.

	document.body.style.cursor = "default";
	ShowMain();
}

function RoutingField(ftype,cansave,field0,field1,flddesc,itype,opts) {
	var trigger="if(this.value) {ShowSave(\""+ftype+"\",\""+field0+"\");} else {DimSave(\""+ftype+"\",\""+field0+"\");}";
	var fldcode='';
	switch(itype) {
		case 'select' :
			fldcode="<select id='sel-"+ftype+"-"+field0+"' class='cartForm' style='font-size:10px; width:15em; height:17px; vertical-align: middle;' onclick='"+trigger+"' onkeydown='"+trigger+"' onkeyup='"+trigger+"'>"+opts+"</select>";
			break;
		case 'input' :
			if(field1!=ftype) {opts='';}
			fldcode="<input "+(cansave?"":"readonly='1'")+" type='text' class='cartForm mgttermnumfield' style='"+(cansave?"":"background-color:#DDDDDD; ")+"vertical-align:middle;' size='20' name='term-"+ftype+"-"+field0+"' id='term-"+ftype+"-"+field0+"' value='"+opts+"' "+(cansave?"onkeydown='"+trigger+"' onkeyup='"+trigger+"' onchange='"+trigger+"' onclick='"+trigger+"' ":"")+"/>";
			break;
		case 'saveonly' :
			fldcode=opts;
			break;
		default:
			break;
	}
	var outstr="<span id='popvalue-"+ftype+"-"+field0+"' class='"+(field1==ftype?'showblock':'hideblock')+"'>";
	if(fldcode)  {outstr+="<span class='termopt_desc'>"+flddesc+"</span><div class='termopt_field'>"+fldcode+"</div>";}
		else {outstr+="<span class='termopt_info'>"+flddesc+"</span>";}
	if(cansave) {
		outstr+="<div id='cansave_"+ftype+"_"+field0+"'  class='termopt_save hideblock'><img src='"+G_imgdir+"images/save1.gif' class='clickable mgtsavebtn' onmouseover='this.src=\""+G_imgdir+"images/save2.gif\";' onmouseout='this.src=\""+G_imgdir+"images/save1.gif\";' onclick='SaveNum(this.parentNode.id);' /></div>"
			+"<div id='dontsave_"+ftype+"_"+field0+"' class='termopt_save showblock'><img src='"+G_imgdir+"images/save3.gif' class='mgtsavebtn' /></div>";
	}
	outstr+="</span>";
	return outstr;
}

function DrawBtn(inname,field0,field1) {
	var gfxname=G_imgdir+"images/mgt/mgt-"+inname;
	var stext="alt='"+G_AltText[inname]+"' title='"+G_AltText[inname]+"'";
	var script="onmouseover='this.src=\""+gfxname+"-b.gif\";' onmouseout='this.src=\""+gfxname+"-c.gif\";' onclick='NumTermSwitch(\""+inname+"\",\""+field0+"\");'";

	var outstr='';
	outstr+= "<img src='"+gfxname+"-a.gif' "+stext+" id='term-"+inname+"-a_"+field0+"' class='termbtn_active "+(field1==inname?"showblock":"hideblock")+"' />"
		+"<img src='"+gfxname+"-c.gif' "+stext+" id='term-"+inname+"-b_"+field0+"' class='termbtn_ready " +(field1!=inname?"showblock":"hideblock")+"' "+script+" />";
	return outstr;
}

function FacilityInfo(number,facility,disp,alreadyowned,availdata,suspended,toggleval,attributes,attropts) {
	var spl=disp.split("|");
	var buyable=spl[2]>0;
	var togglable=toggleval>-1;
	var text=new Array();
	var xpcls=new Array('','nlxp_btn','nlxp_desc','','nlxp_spacer','nlxp_price','nlxp_cart');

// 	text[0]="";
	text[1]="<img src='"+G_imgdir+"images/mgt/mgt-"+spl[0]+"-b.gif' style='padding-right:5px;' />";
	text[2]=spl[1];

	text[4]="";

	if(alreadyowned) {
		text[6]="<img src='"+G_imgdir+"images/tick.gif' title='This facility is available for use' />";
		if(alreadyowned==99) {
			text[5]="This facility is included <b>free</b> with your number.";
		}else{
			if(togglable) {	//togglable?
				text[5]="This facility is <b>available</b> <span id='tx_active_"+facility+"_"+number+"' class='"+(toggleval==0?"hideblock":"showblock")+"'>and <b>active</b></span><span id='tx_inactive_"+facility+"_"+number+"' class='"+(toggleval==0?"showblock":"hideblock")+"'>but <b>inactive</b></span>";
				text[6]="<span id='sp_active_"+facility+"_"+number+"' class='"+(toggleval==0?"hideblock":"showblock")+"'>"
					+"<span><img src='"+G_imgdir+"images/play-on.gif' /></span><span class='fakelink' onclick='activateFacility(\""+number+"\",\""+facility+"\",0)'><img src='"+G_imgdir+"images/pause-off.gif' onmouseover='this.src=\""+G_imgdir+"images/pause-hover.gif\"' onmouseout='this.src=\""+G_imgdir+"images/pause-off.gif\"' /></span>"
					+"</span>"
					+"<span id='sp_inactive_"+facility+"_"+number+"' class='"+(toggleval==0?"showblock":"hideblock")+"'>"
					+"<span class='fakelink' onclick='activateFacility(\""+number+"\",\""+facility+"\",1)'><img src='"+G_imgdir+"images/play-off.gif' onmouseover='this.src=\""+G_imgdir+"images/play-hover.gif\"' onmouseout='this.src=\""+G_imgdir+"images/play-off.gif\"' /></span><span><img src='"+G_imgdir+"images/pause-on.gif' /></span>"
					+"</span>";
			} else {
				text[5]="This facility is <b>available</b> for this number.";
			}
		}
		text[6]+="<img src='"+G_imgdir+"images/spacer.gif' width='10' height='10' />";
	} else if(suspended) {
		text[5]="This facility is <b>suspended</b>. Please contact us to re-enable it.";
		text[6]="<img src='"+G_imgdir+"images/cross.gif' title='This facility is suspended' />";
	} else {
		if(buyable) {
			text[6]="<img id='buyme_"+number+"' alt='Click to buy this facility for this number' title='Click to buy this facility for this number' class='fakelink' src='"+G_imgdir+"images/addtocart.gif' onclick='buyFacility(\""+number+"\",\""+facility+"\",this)' />";
			text[5]="&pound;"+availdata[1]+" setup";
			if(availdata[2]) {text[5]+="; &pound;"+availdata[2]+"/month";}
			if(availdata[3] && availdata[3]!='monthly') {text[5]+=" charged "+availdata[3];}
		} else {
			text[5]="This facility needs to be <a href='cartitems.php'>purchased account-wide</a>.";
		}
	}

	var attrstring='';
	var anyattrs=false;
	if(attributes) {
		attrstring="<tr id='showfacattrs_"+number+"_"+facility+"' style='display:none;'><td colspan='2'>&nbsp;</td><td colspan='3'>";
		attrstring+="<table width='100%' cellpadding='0' cellspacing='0' style='padding: 1px; border-left:dotted 1px #bbbbbb;'>";
		var allatrs=new Array();
		for(atr in attributes) {allatrs.push(atr);}
		for(atr in attributes) {
			var atrostr='';
			var atrdet=attributes[atr].split(/:/);
			var atrname=atrdet.shift(); atrname=atrname.replace(/ $/,'');
			if(atrname) {	//no display description, so don't show the attribute at all.
				if(attropts[atr].length>0) {
					if(attropts[atr]=='V') {attropts[atr]='';}
					attropts[atr]='0=-- Not Set --'+attropts[atr];
					var tmpatropt=attropts[atr].split(/\[/);
					var atropt=new Array();
					for(var ato in tmpatropt) {
						var tspl=tmpatropt[ato].split(/=/);
						var atrselected=(atrdet[0]==tspl[0]?"selected='1'":'');
						atrostr+="<option value='"+tspl[0]+"' "+atrselected+">"+tspl[1]+"</option>";
					}
				}
				attrstring+="<tr><td align='left' valign='top' style='width:175px;'><div style='padding-left:4px; padding-right:6px;'>"+atrname+":</div></td>";
				if(attropts[atr].length>0) {
					attrstring+="<td align='left' style='width:225px;' valign='top'><select class='cartSelect' style='width:220px;' id='atropt_"+number+"_"+facility+"_"+atr+"' onchange='EnblFacActBtn(\""+number+"\",\""+facility+"\");'>"+atrostr+"</select></td>";
					if(!anyattrs) {attrstring+="<td align='left'><input type='button' style='font-size:10px;' disabled='1' id='clkatropt_"+number+"_"+facility+"' value='Update' onclick='SetFacilityAttr(\""+number+"\",\""+facility+"\",\""+allatrs.join(':')+"\")'/></td>";}
				} else {
					attrstring+="<td align='left' colspan='2' valign='top'>"+atrdet.join('<br />')+"</td>";	//just show the attribute text.
				}
				attrstring+="</tr>";
				anyattrs=true;
			}
		}
		attrstring+="</table>";
		attrstring+="</td></tr>";

		if(anyattrs) {text[5]+=" <span class='fakelink' onclick='ToggleFacAttr(this,\""+number+"\",\""+facility+"\");'>(View details)</span>";}
	}
	if(!anyattrs) {attrstring='';}

	for(tx in text) {
		var align=''; var classes=new Array();
		if(tx==1) { align=' align="right"';} else {align=' align="left"';}
		if(xpcls[tx]>'') {classes.push(xpcls[tx]);}
		var classtx="";
		for(cl in classes) {classtx+=classes[cl];} if(classtx) {classtx=" class='"+classtx+"'";}
		text[tx]="<td"+align+classtx+">"+text[tx]+"</td>";
	}

	return "<tr>"+text.join("")+"</tr>"+attrstring;
}

function ToggleFacAttr(togg,number,facility) {
	var obj=document.getElementById('showfacattrs_'+number+'_'+facility);
	if(!obj) {return;}
	if(obj.style.display=='none') {
		obj.style.display='';
		togg.innerHTML='(Hide details)';
	} else {
		obj.style.display='none';
		togg.innerHTML='(Show details)';
	}
}

function EnblFacActBtn(number,facility,atr) {
	document.getElementById('clkatropt_'+number+'_'+facility).disabled=false;
}

function SetFacilityAttr(number,facility,allatrs) {
	var attrset={number:number, facility:facility};
	var allatrs=allatrs.split(/:/);
	for(atr in allatrs) {
		attrset['attr_'+allatrs[atr]]=document.getElementById('atropt_'+number+'_'+facility+'_'+allatrs[atr]).value;
	}
	apilite_post("dnifacilattrs.php", attrset, 'modFacAttrOkay', attrset, 'modFacAttrFail', attrset);
}

function modFacAttrOkay(responsestring,args) {
	document.getElementById('clkatropt_'+args.number+'_'+args.facility).disabled=true;
	alert(responsestring);
}
function modFacAttrFail(responsestring,args) {
	alert(responsestring);
}

function buyFacility(number,facility,clickedelement) {
	document.body.style.cursor = "wait";				//this will be reset by okay or fail func below.
	if(clickedelement) {if(clickedelement.style) {clickedelement.style.cursor="wait";}}	//this doesn't need to be reset, as the element involved will be destroyed anyway.
	var passobj={number:number, facility:facility, clickedelement:clickedelement};

	var apicall="dnifacilities.php?fc="+facility+"&num="+number;
	apilite_call(apicall, 'buyFacOkay', passobj, 'buyFacFail', passobj);
}

function buyFacOkay(responsestring,args) {
	if(args.clickedelement) {
		args.clickedelement.style.cursor='';
// 		args.clickedelement.className='';	//remove the class so it uses the default.
		args.clickedelement.src=G_imgdir+'images/incart.gif';
		args.clickedelement.onclick=GoToCart;
	}
	document.body.style.cursor = "default";
	alert(responsestring);
}

function buyFacFail(responsestring,args) {
	document.body.style.cursor = "default";
	if(args.clickedelement) {if(args.clickedelement.style) {args.clickedelement.style.cursor="";}}
	alert(responsestring);
}

function activateFacility(number,facility,activate) {
	document.body.style.cursor = "wait";				//this will be reset by okay or fail func below.
	var passobj={number:number, facility:facility, activate:activate};
	var apicall="facactivate.php?fc="+facility+"&num="+number+"&act="+activate;
	apilite_call(apicall, 'actFacOkay', passobj, 'actFacFail', passobj);
}

function actFacOkay(responsestring,args) {
	document.body.style.cursor = "default";
	document.getElementById('sp_active_'+args.facility+'_'+args.number).className=(args.activate?'showblock':'hideblock');
	document.getElementById('sp_inactive_'+args.facility+'_'+args.number).className=(args.activate?'hideblock':'showblock');

	document.getElementById('tx_active_'+args.facility+'_'+args.number).className=(args.activate?'showblock':'hideblock');
	document.getElementById('tx_inactive_'+args.facility+'_'+args.number).className=(args.activate?'hideblock':'showblock');
}

function actFacFail(responsestring,args) {
	document.body.style.cursor = "default";
	if(responsestring.match(/already/)) {actFacOkay(responsestring,args); return;}	//trying to toggle to existing setting? buttons must be badly set, so call the okay func to flip them.
	alert(responsestring);
}

function GoToCart() {
	window.location="showcart.php";
}

function DisplayToggle(id,clickedelement) {
	if(G_rsld) {return;}
	var obj=document.getElementById(id);
	if(obj) {
		obj.style.display=(obj.style.display=='none'?'':'none');
		if(clickedelement) {clickedelement.src=(obj.style.display!='none'?G_imgdir+'images/minus.gif':G_imgdir+'images/plus.gif');}
	}
}

function ShowSave(type,num) {
	//show the clickable save button when the user edits a termination number or route plan.
	document.getElementById("cansave_"+type+"_"+num).className="showblock termopt_save";
	document.getElementById("dontsave_"+type+"_"+num).className="hideblock termopt_save";
	NumTermSwitch(type,num);	//force MSIE6 to update the display correctly, by redisplaying the entire containing block. (this line isn't neccessary for other browsers, but doesn't cause any harm)
}

function DimSave(type,num) {
	//show the greyed-out save button to indicate that the termination number/route plan shown is the current value, and doesn't need to be saved.
	document.getElementById("cansave_"+type+"_"+num).className="hideblock termopt_save";
	document.getElementById("dontsave_"+type+"_"+num).className="showblock termopt_save";
}

function ListNumsErr(responsestring,args) {
	var tmp=responsestring.split("\n");	//split the returned lines into an array.
	var argv=args.split(",");
	var outstr="";

	if(responsestring.match("expired")) {AutoLogout(); return;}
	if(tmp.length==2) {responsestring=tmp[1];}	//drop the error code number, if it was passed.
	outstr+=ListNumsSearchAndPages(0,G_ResultsPerPage,0,argv[1],'a');

	outstr+="<table cellspacing='0' cellpadding='2' style='width:98%;' class='smallText pad15L resultTable2'>";
	outstr+="<tr class='numlookup_hdr' style='height:2.5em; font-weight:bold;'><td style='padding-left:15px;'>Number</td><td align='center'>Termination Method</td><td colspan='3' align='center'>Termination Configuration</td></tr>";
	outstr+="<td colspan='20' align='center'>"+responsestring+"</td></tr>";
	outstr+="</table>";

	document.getElementById("mainblock").innerHTML=outstr;
	document.body.style.cursor = "default";
	ShowMain();
}

function editnotes(number,notes) {
	g_EditPage['number']=number;
	var leftVal=(screen.width-400)/2;
	var topVal=(screen.height-200)/2;
	pagecc_custform = window.open('editnumbernotes.php', 'editnumbernotes', 'width=440,height=220,top='+topVal+',left='+leftVal+',toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1');
}

function UpdateNotes(number,notes) {
	var shortnotes=notes;
	if(shortnotes.length>NoteLen) { shortnotes=shortnotes.substr(0,NoteLen-3)+'...'; }
	document.getElementById('numnotes_'+number).innerHTML=shortnotes;
	g_EditPage['notes'][number]=notes;
}

function ValidateNum(fieldname,nextfunc,numinfo) {
	var field=document.getElementById(fieldname);
	var temp=fieldname.split("-");
	var ingress=temp[2];
	field.valid=false;
ShowDebug("FNAME: "+fieldname+" ... "+temp[2]+"\n");
	if(!field.value) {EgressAdjustError('1|The field is blank.',fieldname); return;}
	field.value = field.value.replace(/^00/g,"+");		//if they started the number with double-zero, then they probably meant an international number, so change it to a plus sign so it's formatted correctly.
	var testnum = field.value.replace(/(\(|\)|\.|\-|\s)/g,"");	//strip out dots, dashes, brackets and spaces, so we're left with just the number and validated formatting characters.
	testnum = testnum.replace(/^0/g,"+44");	//if UK code, replace zero with intl prefix, so api function accepts it.
// 	testnum = testnum.replace(/\+/g,"%2B");		//Replace plus sign with encoded value.
	if(testnum.length<10) { EgressAdjustError('1|Too short.',fieldname); return; }
	if(testnum.length>25) { EgressAdjustError('2|Too long.',fieldname); return; }
	apilite_call('egressdetails.php?number='+testnum+"&ingress="+ingress, 'DisplayEgressAdjust', fieldname+","+nextfunc+","+numinfo+","+ingress, 'EgressAdjustError', fieldname+","+nextfunc+","+numinfo+","+ingress);
}

function DisplayEgressAdjust(responsestring,args) {
ShowDebug("RString: "+responsestring+"\n");
	var argv=args.split(",");
	var field=document.getElementById(argv[0]);
	var numdata=responsestring.split("|");
	var message="This is a "+numdata[0]+" number. ";
	var rates=  [0,
			(parseInt(numdata[8])+parseInt(numdata[1]))/10000,	//rates[1]: standard weekend
			(parseInt(numdata[9])+parseInt(numdata[2]))/10000,	//rates[2]: standard evening
			(parseInt(numdata[10])+parseInt(numdata[3]))/10000,	//rates[3]: standard daytime

			(parseInt(numdata[11])+parseInt(numdata[1]))/10000,	//rates[4]: low-usage weekend
			(parseInt(numdata[11])+parseInt(numdata[2]))/10000,	//rates[5]: low-usage evening
			(parseInt(numdata[11])+parseInt(numdata[3]))/10000	//rates[6]: low-usage daytime
		];

	if(argv[3].match(/^070/)) {for(var thisrate in rates) {if(rates[thisrate]<0) {rates[thisrate]=0;}}}

	if(G_rsld) {
		if(numdata[0]!='UK Geog') {
			message+="Note: You may incur additional charges for receiving calls to numbers other than UK landlines. Please contact us for prices.";
		}
	} else {
		if(argv[3].match(/^080(0|8)/)) {
			if(rates[3]==rates[1]) {
				message+="Calls will cost "+Math.abs(rates[1])+"p/min (standard) or "+Math.abs(rates[4])+"p/min (low usage)";
			} else {
				message+="Calls will cost "+Math.abs(rates[3])+"p/min (standard daytime),"+Math.abs(rates[2])+"p/min (standard evening), "+Math.abs(rates[1])+"p/min (standard weekends), or "+Math.abs(rates[6])+"p/min (low usage daytime), "+Math.abs(rates[5])+"p/min (low usage evening), "+Math.abs(rates[4])+"p/min (low usage weekend)";
			}
		} else {
			if(rates[1]<0 && !argv[3].match(/^070/)) {
				message+="You will earn "+(rates[3]*-1)+"p/min peak, "+(rates[2]*-1)+"p/min off-peak and "+(rates[1]*-1)+"p/min weekends.";
			} else {
				message+="Calls will cost "+rates[3]+"p/min peak, "+rates[2]+"p/min off-peak and "+rates[1]+"p/min weekends.";
			}
		}
	}
	field.valid=true;
	if(argv[1]) {window[argv[1]](argv[2],message);}	//continue saving (jump to SaveNum2)
}
function EgressAdjustError(responsestring,args) {
	var argv=args.split(",");
	var field=document.getElementById(argv[0]);
	var numdata=responsestring.split("|");
	field.valid=false;
	if(numdata[0]>=500) {
		alert(numdata[1]);
	}else{
		alert("Error with "+(field.value?field.value:"This")+": "+numdata[1].replace(/£/g,"\u00A3"));
	}
	DisplayToggle("numextra_"+argv[3],document.getElementById('expanderplus_'+argv[3]));
}

function SaveNum(numinfo) {
	tmp=numinfo.split("_");
	if(tmp[0]!="cansave") {return;}
	switch(tmp[1]) {
		case 'number' :	//if entered an actual phone number, then need to validate it before we can save...
			ValidateNum('term-number-'+tmp[2],'SaveNum2',numinfo);
			break;
		case 'fax2email' :
			var valid=valid_email(document.getElementById('term-fax2email-'+tmp[2]).value);
			if(valid) {SaveNum2(numinfo);} else {alert(document.getElementById('term-fax2email-'+tmp[2]).value+" is not a valid email address.");}
			break;
		default:	//if entered a route plan or day parting ID, then no need to validate.
			SaveNum2(numinfo);
			break;
	}
}

function SaveNum2(numinfo,message) {
	tmp=numinfo.split("_");
	tmp[3]=message;
	DimSave(tmp[1],tmp[2]);

	var apicall="updatemynums.php?number="+tmp[2];
	switch(tmp[1]) {
		case "nowhere":    apicall+="&termopt=nowhere"; break;
		case "number":     apicall+="&termopt=number&destnumber="+document.getElementById('term-number-'+tmp[2]).value.replace(/(\+|\(|\)|\.|\s)/,""); break;
		case "routeplan":  apicall+="&termopt=routeplan&rpid="+document.getElementById('sel-routeplan-'+tmp[2]).value; break;
		case "dayparting": apicall+="&termopt=dayparting&dpid="+document.getElementById('sel-dayparting-'+tmp[2]).value; break;
		case "voicemail":  apicall+="&termopt=voicemail&vmid="+document.getElementById('sel-voicemail-'+tmp[2]).value; break;
		case "customer":   apicall+="&termopt=customer&csid="+document.getElementById('sel-customer-'+tmp[2]).value; break;
		case "fax2email":  apicall+="&termopt=fax2email&destemail="+document.getElementById('term-fax2email-'+tmp[2]).value.replace(/(\+|\(|\)|\s)/,""); break;
		case "sip":        apicall+="&termopt=sip&sip="+document.getElementById('term-sip-'+tmp[2]).value.replace(/(\+|\(|\)|\s)/,"");break;		
		
		default:return;
	}
	document.body.style.cursor = "wait";				//this will be reset by ListNums or ListNumsErr.
	apilite_call(apicall, 'SaveNumOkay', tmp, 'SaveNumErr', tmp);
}

function SaveNumOkay(responsestring,args) {
	document.body.style.cursor = "default";
	if(args[3]) {args[3]+="\n\n";} else {args[3]='';}
	switch(responsestring) {
		case "duplicate" :
			alert(args[3]
				+"You have already requested this amendment, please allow time\n"
				+"for the update to take effect.\n"
				+"Note: New numbers are updated instantly and may provide better\n"
				+"rates; if you wish to upgrade, please contact us on 08000 226644.");
			break;
		case "replacement" :
		case "new" :
			alert(args[3]
				+"NB - This is one of our original numbers and is subject to a 72 hour delay\n"
				+"on rerouting. As a long-standing customer you will qualify for a better\n"
				+"number and better rates if you switch to one of our current ranges - please\n"
				+"contact us on 08000 226644 if you would like to know more.");
			break;
		default :
			alert(args[3]+"Your changes have been saved; they will be applied immediately.");
			break;
	}
}
function SaveNumErr(responsestring,args) {
	document.body.style.cursor = "default";
	alert(responsestring);
	if(responsestring.match(/enable/)) {DisplayToggle("numextra_"+args[2],document.getElementById('expanderplus_'+args[2]));}
	ShowSave(args[1],args[2]);	//re-enable the button so they can try again, in the event of it being a temporary error.
}

function ListNumsSearchAndPages(startat,limit,max,filt,ab) {
	outstr="";
	outstr +="<table class='smallText pad15L' style='margin:0px; width:98%;'>"
// 		+"<tr><td colspan='2' align='right'>"
// 		+"<div class='smallText pad15L'><span class='"+(G_AdvancedMode?"hideblock":"showblock")+"' id='toggle_advanced_"+ab+"'><span class='fakelink' onclick='NumToggleMode(true);'>Switch to Advanced Mode</span></span>"
// 		+"<span class='"+(G_AdvancedMode?"showblock":"hideblock")+"' id='toggle_simple_"+ab+"'><span class='fakelink' onclick='NumToggleMode(false);'>Switch to Simple Mode</span></span></div>"
// 		+"</td></tr>"
		+"<tr><td align='left'>"
		+"Search: <input type='text' class='cartForm mgtsearchfield' style='vertical-align:middle;' size='13' id='numsearch_"+ab+"' value='"+filt+"' onkeydown='trigger_search(event,this.value);' />"
		+"<img src='"+G_imgdir+"images/search-a.gif' class='clickable mgtsearchbtn' onmouseover='this.src=\""+G_imgdir+"images/search-b.gif\";' onmouseout='this.src=\""+G_imgdir+"images/search-a.gif\";' onclick='G_FilterString=document.getElementById(\"numsearch_"+ab+"\").value; "+G_LoadFunc+"(1,this);' />"
		+"</td>"
		+"<td align='right' style='text-align:right;'>"
		+Pages(startat,limit,max)
		+"</td></tr></table>";
	return outstr;
}

function trigger_search(evt,val) {
	//check which key was pressed (doing various checks to ensure it works for all browsers)
	evt = (evt) ? evt : event;
	var charCode = (evt.charCode) ? evt.charCode :
		((evt.which) ? evt.which : evt.keyCode);
	if (charCode == 13 || charCode == 3) {
		G_FilterString=val;
		window[G_LoadFunc](1);	//user pressed return, so trigger search.
	}
}

function NumTermSwitch(termtype,number) {
	for(var key in G_AltText) {
		NumTermSwitch2(key,termtype,number);
	}
}
function NumTermSwitch2(key,termtype,number) {
	var ta=document.getElementById("term-"+key+"-a_"+number);	//this is the highlighted toggle image for this termination type.
	var tb=document.getElementById("term-"+key+"-b_"+number);	//this is the greyed toggle button for this termination type.
	var pv=document.getElementById("popvalue-"+key+"-"+number);	//this is the input block for this termination type.
	//need to check that they all exist, as some termination types may be disabled.
	if(ta) { ta.className="termbtn_active "+(termtype==key?"showblock":"hideblock"); }
	if(tb) {
		tb.className="termbtn_ready "+(termtype==key?"hideblock":"showblock");
		tb.src=G_imgdir+"images/mgt/mgt-"+key+"-c.gif";	//simulate a mouseout event, so we don't leave highlighted images behind.
	}
	if(pv) { pv.className=((termtype==key)?"showblock":"hideblock"); }

	if(termtype=='nowhere') {
		//this type doesn't have any input options, so nothing that can enable the save button, so we have to do it here straight away.
		document.getElementById("cansave_"+termtype+"_"+number).className="showblock termopt_save";
		document.getElementById("dontsave_"+termtype+"_"+number).className="hideblock termopt_save";
	}
}

function NumToggleMode(newmode) {
	G_AdvancedMode=newmode;
	document.getElementById('toggle_advanced_a').className=(newmode?"hideblock":"showblock");
	document.getElementById('toggle_simple_a').className=(newmode?"showblock":"hideblock");
	if(document.getElementById('toggle_advanced_b')) {
		document.getElementById('toggle_advanced_b').className=(newmode?"hideblock":"showblock");
		document.getElementById('toggle_simple_b').className=(newmode?"showblock":"hideblock");
	}
	if(newmode) {
		SetStyle('.advancedblock','display','');
		SetStyle('.advancedblock','visibility','visible');
	} else {
		SetStyle('.advancedblock','display','none');
		SetStyle('.advancedblock','visibility','hidden');
	}
}

//--------------------------------------------------------------------------

function LoadAcctManagement() {
	document.getElementById('signupFormDiv').style.display = 'block';
}
//--------------------------------------------------------------------------

function SetDateRange(ab,mode) {
	G_StartDay=document.getElementById("st_day_"+ab).value;
	G_StartMonth=document.getElementById("st_month_"+ab).value;
	G_StartYear=document.getElementById("st_year_"+ab).value;
	G_EndDay=document.getElementById("en_day_"+ab).value;
	G_EndMonth=document.getElementById("en_month_"+ab).value;
	G_EndYear=document.getElementById("en_year_"+ab).value;

	if(mode==2) {
		G_viewmode=document.getElementById("showtype_"+ab).value;
		G_st_answer=document.getElementById("status_answer_"+ab).checked?1:0;
		G_st_busy=document.getElementById("status_busy_"+ab).checked?1:0;
		G_st_noanswer=document.getElementById("status_noanswer_"+ab).checked?1:0;
		G_st_other=document.getElementById("status_other_"+ab).checked?1:0;
		G_dnifilter=document.getElementById("shownumber_"+ab).value;

		if(!G_st_busy && !G_st_noanswer && !G_st_other) {G_st_answer=1;}	//force at least one checkbox.
	}
}

function StatusCheckbox(name,caption,checked) {
	var chk=(checked==1?"checked='1'":"");
	var outstr="<input type='checkbox' name='"+name+"' id='"+name+"' value='1' "+chk+" /><label style='vertical-align:20%;' for='"+name+"'>"+caption+"</label>";
	return outstr;
}

function DayCombo(name,def) {
	var outstr="<select style='font-size:1.1em;' name='"+name+"' id='"+name+"'>";
	var sel="";
	for(var count=1; count<=31; count++) {
		sel=(def==count?"selected='1'":"");
		outstr+="<option value='"+count+"' "+sel+">"+count+"</option>";
	}
	outstr+="</select>";
	return outstr;
}

function MonthCombo(name,def) {
	var outstr="<select style='font-size:1.1em;' name='"+name+"' id='"+name+"'>";
	var sel="";
	var mname=new Array("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	for(var count=1; count<=12; count++) {
		sel=(def==count?"selected='1'":"");
		outstr+="<option value='"+count+"' "+sel+">"+mname[count]+"</option>";
	}
	outstr+="</select>";
	return outstr;
}

function YearCombo(name,def) {
	var currDate=new Date();
	var currYear=currDate.getFullYear();
	var outstr="<select style='font-size:1.1em;' name='"+name+"' id='"+name+"'>";
	var sel="";
	for(var count=currYear-10; count<=currYear+10; count++) {
		sel=(def==count?"selected='1'":"");
		outstr+="<option value='"+count+"' "+sel+">"+count+"</option>";
	}
	outstr+="</select>";
	return outstr;
}

function SortButtons(fielddesc,field,page) {
	var outstr="";
	var click1="onclick='G_SortField=\""+field+"\"; G_SortDir=\"asc\"; "+G_LoadFunc+"("+page+",this);'";
	var click2="onclick='G_SortField=\""+field+"\"; G_SortDir=\"desc\"; "+G_LoadFunc+"("+page+",this);'";
	if(field==G_SortField && G_SortDir=='asc') {
		outstr+="<img title='"+fielddesc+" sort ascending' alt='"+fielddesc+" sort ascending' src='"+G_imgdir+"images/sort_up2.gif' class='mgtsortbtn' />";
	} else {
		outstr+="<img title='"+fielddesc+" sort ascending' alt='"+fielddesc+" sort ascending' src='"+G_imgdir+"images/sort_up1.gif' class='clickable mgtsortbtn' "+click1+"/>";
	}
	if(field==G_SortField && G_SortDir=='desc') {
		outstr+="<img title='"+fielddesc+" sort descending' alt='"+fielddesc+" sort descending' src='"+G_imgdir+"images/sort_dn2.gif' class='mgtsortbtn' />";
	} else {
		outstr+="<img title='"+fielddesc+" sort descending' alt='"+fielddesc+" sort descending' src='"+G_imgdir+"images/sort_dn1.gif' class='clickable mgtsortbtn' "+click2+"/>";
	}
	return outstr;
}

function Pages(startat,limit,max) {
	var buildstring="";
	var nextstop=startat+limit;
	var prevstop=startat-limit;
	
	var page=Math.floor((startat)/limit)+1;
	var maxpage=Math.ceil(max/limit);
	if(nextstop>max) {nextstop=max;}
	if(prevstop<1) {prevstop=1;}
	buildstring+="<table width='100%'><tr><td>";

	if(page>1) {
		buildstring+="<a href='javascript:"+G_LoadFunc+"("+(page-1)+",this)'>&lt;&lt; Prev Page</a>";
	} else {
		buildstring+="<span style='color:#bbbbbb'>&lt;&lt; Prev Page</span>";
	}
	var minpg=page-3;
	var maxpg=page+3;
	if(page<=3) {maxpg+=(4-page);}
	for(var count=minpg;count<=maxpg;count++) {
		if(count>0 && count<=maxpage) {
			if(count!=page) {
				buildstring+=" <a href='javascript:"+G_LoadFunc+"("+count+",this)'>["+count+"]</a> ";
			} else {
				buildstring+=" <b>["+count+"]</b> ";
			}
		}
	}
	if(page<maxpage) {
		buildstring+="<a href='javascript:"+G_LoadFunc+"("+(page+1)+",this)'>Next Page &gt;&gt;</a>"
	} else {
		buildstring+="<span style='color:#bbbbbb'>Next Page &gt;&gt;</span>";
	}
	buildstring+="</td>";

	var sel10 =""; if(G_ResultsPerPage==10)  {sel10 ="selected='1'";}
	var sel25 =""; if(G_ResultsPerPage==25)  {sel25 ="selected='1'";}
	var sel50 =""; if(G_ResultsPerPage==50)  {sel50 ="selected='1'";}
	var sel100=""; if(G_ResultsPerPage==100) {sel100="selected='1'";}

	buildstring+="<td align='right'>";
	buildstring+="Results per page: <select style='font-size:1.0em;' onchange='ChangeResultsPerPage(this.value,"+page+");'><option value='10' "+sel10+">10</option><option value='25' "+sel25+">25</option><option value='50' "+sel50+">50</option><option value='100' "+sel100+">100</option></select>";
	buildstring+="</td>";

	buildstring+="</tr></table>";

	return buildstring;
}

function ChangeResultsPerPage(perpage,page) {
	G_ResultsPerPage=parseInt(perpage);
	eval(G_LoadFunc+"(page)");
}
