// aimsPrintPatch.js
/*
* extends (patches) the default print and attribute parsing routines
* to allow attribute data to be included on printed output page
* based on the 3.1 HTML viewer code set
*
* usage:  put this file in your website's javascript folder
*         then include this js file in MapFrame.htm just like all the other js files
*         but *AFTER* having first included aimsPrint.js and aimsIdentify.js
*         so that the routines is this file will override routines in the other two
*         (in other words, just include it last)
*
* method: displayAttributeData() now builds up a temporary string of its page
*         content before writing it.  this string is saved globally for later
*         use on the print page.  this method was chosen over something like
*         trying to read .innerHTML for portability reasons.
*
* notes:  other than the specified change, should otherwise work just as original code
*
* to do:  method of breaking links, changing <A> tags to <P> tags, is sorta slimey
*         (see last line of displayAttributeData())
*         done so that printed page doesn't contain any live links
*         might be better to build up separate strings, one with links, one without
*
* published 01/14/2002
* Dave Bollinger
* GIS Programmer/Analyst
* San Joaquin County, CA
* davebollinger@hotmail.com
*
*/

var aimsPrintPatchPresent=true;
var printPatchContent = "";

//-------------------------------------------------------------------
// displayAttributeData1()
// overrides same function in aimsIdentify.js
// adds support for printing attribute data
//-------------------------------------------------------------------
function displayAttributeData1(theReply) {
	var isSecond= true;
	var ppc = "";   // to build up printPatchContent, localize it for speed and ease of typing
        var gmd = "";   // to store 'get more data' section
        var efc
	//alert(theReply);
	setLayerFields(ActiveLayerIndex);
	var theError = getXMLErrorMessage(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var epos = 1;
	var spos = 1;
	var morePoints=true;
	var moreFeatures=true;
	var featureCount = justGetFeatureCount(theReply);
	//alert(featureCount);
	var pos = 0;
	var startpos = 0;
	var endpos = xmlEndPos;
	var stillMore = false
	pos = theReply.indexOf('hasmore="true"',endpos);
	if (pos!=-1) stillMore = true;
	pos=0;
	var tempCount = 0;
	var selectedData="";
	var inData="";
	var xStr="";
	var yStr="";
	var tempString = "";
	var fCount = featureCount;
	//alert("displayAttributeData1()[featurecount=" + featureCount + "]");
	selectCount = 0;
	var tempString="";
	var Win1 = parent.ResultsFrame;
	var theFrame = "parent.MapFrame";
	if (featureCount > 0) {
		newSelectCount += 1;


		if (showSelectedData) {
			//alert("displayAttributeData1()[opening html page]");
			if ((useExternalWindow) || (!useTextFrame)) {
				Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
				theFrame = "opener";
				if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
			} else {
				Win1 = parent.ResultsFrame;
				Win1.document.open();
			}
			Win1.document.open();
			Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[7] + '</title>');
			Win1.document.writeln('<script language="javascript">');
			Win1.document.writeln('function myprint() {');
			Win1.document.writeln('	 	window.print()');
			Win1.document.writeln('}');
			Win1.document.writeln('</script>');
			Win1.document.writeln('</head>');
			Win1.document.writeln('<body bgcolor="#FFFFFF" link="#404040" text="#000000" vlink="#526384" LEFTMARGIN=0 onload="window.focus()">');
		      Win1.document.writeln('<a href="javascript:myprint()"><img src="http://pslpdgis.cityofpsl.com/images/printer.gif" border=0 alt="Print" align=right></a>');
			ppc += '<FONT FACE="Arial" SIZE="-1"><b>' + LayerName[ActiveLayerIndex] + '</b></FONT>';
			ppc += '<table align="center" width="98%" border="1" cellspacing="0" cellpadding="2" nowrap bgcolor="' + tableBackColor + '">';
		}
		endpos = 1;
		
		for (var i=0;i<fCount;i++) {
			//alert(endpos);
			if (toolMode!=4) {
				var theXYs = getEnvelopeXYs(theReply, endpos)
				selectLeft[selectCount] = theXYs[0];
				selectBottom[selectCount] = theXYs[1];
				selectRight[selectCount] = theXYs[2];
				selectTop[selectCount] = theXYs[3];
				endpos = xmlEndPos;
			}
			//alert(endpos);
			inData = parseRecordString(theReply, endpos);
			endpos = xmlEndPos;
			//selectedData = clearLeadingSpace(inData);
			selectedData = inData;
			
			epos = theReply.indexOf("</FEATURE",endpos);
			if (showSelectedData) {
				//alert("2\n" + selectedData);
				var showHyper = false;
				if (hyperLinkLayers!=null) {
					for (var s1=0;s1<hyperLinkLayers.length;s1++) {
						if (hyperLinkLayers[s1] == LayerName[ActiveLayerIndex]) showHyper=true;
					}
				}
					
				var fName1 = getFieldNames(selectedData);
				var fValue1 = getFieldValues(selectedData);
				selectPoints[selectCount] = getIdValue(fName1, fValue1);
				
				var idFieldNum = -1;
				var shapeFieldNum = -1;
				if (hideIDFieldData) {
					// hide ID column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
					}
				}
				if (hideShapeFieldData) {
					// hide Shape column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
					}
				}
			

				if (selectCount==0) {
					ppc += '<tr><td><FONT FACE="Arial" SIZE="-2">Rec</FONT></a></td>';
					ppc += '<td>';
					
					if (toolMode!=4) ppc += '<a href="javascript:' + theFrame + '.showHighlight(' + selectCount + ')">';
					ppc += '<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord) + '</FONT>';
					if (toolMode!=4) ppc += '</a>';
					ppc += '</td></tr>';

					for (var f=0;f<fName1.length;f++) {	
						var f2 = -1;
						if (useFieldAlias) {
							for (f3=0;f3<AliasFieldName.length;f3++) {
								if (AliasFieldName[f3]==fName1[f]) f2 = f3;
							}
						}
						if (f2!=1) {
							ppc += '<tr><td valign=top';
							if (isSecond) {
								ppc += ' bgcolor="#FFFFFF">';
							}else{
								ppc += '>';
							} 
							ppc += '<font face="arial" size="-2">' + AliasFieldAlias[f2] + '</font></a></td>';
							ppc += '<td valign=top';
							if (isSecond) {
								ppc += ' bgcolor="#FFFFFF">';
							}else{
								ppc += '>';
							} 
							ppc += '<font face="arial" size="-2">' + fValue1[f] + '</font>';
							ppc += '</td></tr>';
						} else {
							ppc += '<tr><td valign=top';
							if (isSecond) {
								ppc += ' bgcolor="#FFFFFF">';
							}else{
								ppc += '>';
							} 
							ppc += '<font face="arial" size="-2">' + fName1[f] + '</font></a></td>';
							ppc += '<td valign=top';
							if (isSecond) {
								ppc += ' bgcolor="#FFFFFF">';
							}else{
								ppc += '>';
							} 
							ppc += '<font face="arial" size="-2">' + fValue1[f] + '</font>';
							ppc += '</td></tr>';
						
						}
					isSecond = !isSecond 
					}

				}
				fName1 = null;
				fValue1 = null;
				
			}
			selectCount += 1;
					
		}
		if (showSelectedData) {
			
			ppc += '</table>';
			gmd += '<center><FONT FACE="Arial" SIZE="-2">';
			if (toolMode!=25) {
				if (queryStartRecord>1) {
					var prevRecord = queryStartRecord - maxFeaturesReturned;
					if (prevRecord<1) prevRecord=1;
					gmd += '<a href="javascript:' + theFrame + '.getMoreData(' + prevRecord + ')">' + msgList[61] + maxFeaturesReturned + msgList[62] + '</a>&nbsp;&nbsp;&nbsp;';
				}
				if (stillMore) {
					var nextRecord=featureCount + queryStartRecord;
					gmd += '<a href="javascript:' + theFrame + '.getMoreData(' + nextRecord + ')">' + msgList[63] + '</a>';
				}
			}
			if ((toolMode!=4) && (toolMode!=25) && (selectCount>1)) {
				gmd += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="javascript:' + theFrame + '.zoomToReturnedRecords()">Zoom to these records</A></b>';
			}

			gmd += '</font></center>';
			Win1.document.writeln(ppc);
			Win1.document.writeln(gmd);
			Win1.document.writeln('</body></html>');
			Win1.document.close();
		}
		//alert("toolMode:" + toolMode);
		
		if ((queryStartRecord==1) && (toolMode!=4) && (toolMode!=25)) {
			if ((selectCount==1) && (zoomToSingleSelect)) {
				var fWidth = selectRight[0] - selectLeft[0];
				var fHeight = selectTop[0] - selectBottom[0];
				var mWMargin = 0;
				var mHMargin = 0;
				if (selectType=="point") {			
					mWMargin = fullWidth * selectPointMargin;
					mHMargin = fullHeight * selectPointMargin;
					if (mWMargin > xDistance/2) {
						mWMargin = xDistance/2;
						mHMargin = yDistance/2;
					}
				} else {
					mWMargin = fWidth * selectMargin;
					mHMargin = fHeight * selectMargin; 
				}
				saveLastExtent();
				eLeft = selectLeft[0] - mWMargin;
				eRight = selectRight[0] + mWMargin;
				eTop = selectTop[0] + mHMargin;
				eBottom = selectBottom[0] - mHMargin;
			}
			sendMapXML();
		}
		
		
			
	} else {
		//alert(tempString);
		if ((useExternalWindow) || (!useTextFrame)) {
			Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
		} else {
			Win1 = parent.ResultsFrame;
			Win1.document.open();
		}
		Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
		Win1.document.writeln('	<title>' + titleList[8] + '</title>');
		Win1.document.writeln('</head>');
		Win1.document.writeln('<body BGCOLOR="#FFFFFF" TEXT="White" LEFTMARGIN=0 TOPMARGIN=0>');
		Win1.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
		Win1.document.writeln('<br>' + msgList[64]);
		if (debugOn>0) {
			Win1.document.writeln('<p>' + msgList[65] + '<br>');
			Win1.document.writeln(untag(theReply));
		} else {
			if (theError!="") {
				Win1.document.writeln('<p>' + msgList[66] + '<br>');
				Win1.document.writeln(theError);
			}
		}
		Win1.document.writeln('</FONT>');
		Win1.document.writeln('</body></html>');
		Win1.document.close();
	}
	if (toolMode==4) selectCount=0;
	Win1=null;
	hideRetrieveData();

	printPatchContent = ppc.replace(/<a/g, "<p");  // globalize it (also break links)
}


//-------------------------------------------------------------------
// displayAttributeData()
// overrides same function in aimsIdentify.js
// adds support for printing attribute data
//-------------------------------------------------------------------
function displayAttributeData(theReply) {
	var isSecond= true
	var ppc = "";   // to build up printPatchContent, localize it for speed and ease of typing
        var gmd = "";   // to store 'get more data' section
        var efc
	//alert(theReply);
	setLayerFields(ActiveLayerIndex);
	var theError = getXMLErrorMessage(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var epos = 1;
	var spos = 1;
	var morePoints=true;
	var moreFeatures=true;
	var featureCount = justGetFeatureCount(theReply);
	//alert(featureCount);
	var pos = 0;
	var startpos = 0;
	var endpos = xmlEndPos;
	var stillMore = false
	pos = theReply.indexOf('hasmore="true"',endpos);
	if (pos!=-1) stillMore = true;
	pos=0;
	var tempCount = 0;
	var selectedData="";
	var inData="";
	var xStr="";
	var yStr="";
	var tempString = "";
	var fCount = featureCount;
	//alert("displayAttributeData()[featurecount=" + featureCount + "]");
	selectCount = 0;
	var tempString="";
	var Win1 = parent.ResultsFrame;
	var theFrame = "parent.MapFrame";
	if (featureCount > 0) {
		newSelectCount += 1;

		// Hannah Added: variables for text saving
		var iRecNum = 1;
		var sRecText = "";


		if (showSelectedData) {
			//alert("displayAttributeData()[opening html page]");
			if ((useExternalWindow) || (!useTextFrame)) {
				Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
				theFrame = "opener";
				if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
			} else {
				Win1 = parent.ResultsFrame;
				Win1.document.open();
			}
			Win1.document.open();
			Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[7] + '</title></head>');
			Win1.document.writeln('<body bgcolor="#FFFFFF" link="#404040" text="#000000" vlink="#526384" LEFTMARGIN=0 onload="window.focus()">');
			ppc += '<div align="left">';
			ppc += '<FONT FACE="Arial" SIZE="-1"><b>' + LayerName[ActiveLayerIndex] + '</b></font></div>';
			// Hannah Added: link to download attributes
            ppc += '<table width="98%" border="0" align="center"><tr>';
			ppc += '<td><font face="arial" size="1"><a href="javascript:'+theFrame+'.saveToTextFile()">Save Results to File</a></font></td>';
			ppc += '<td><a href="javascript:window.print()"><img src="http://pslpdgis.cityofpsl.com/images/printer.gif" border=0 alt="Print Results" align=right></a></td>';
			ppc += '</tr></table>';
			ppc += '<center><table align="center" width="98%" border="1" cellspacing="0" cellpadding="2" bgcolor="' + tableBackColor + '">';
		}
		endpos = 1;
		
		for (var i=0;i<fCount;i++) {
			//alert(endpos);
			if (toolMode!=4) {
				var theXYs = getEnvelopeXYs(theReply, endpos)
				selectLeft[selectCount] = theXYs[0];
				selectBottom[selectCount] = theXYs[1];
				selectRight[selectCount] = theXYs[2];
				selectTop[selectCount] = theXYs[3];
				endpos = xmlEndPos;
			}
			//alert(endpos);
			inData = parseRecordString(theReply, endpos);
			endpos = xmlEndPos;
			//selectedData = clearLeadingSpace(inData);
			selectedData = inData;
			
			epos = theReply.indexOf("</FEATURE",endpos);
			if (showSelectedData) {
				//alert("2\n" + selectedData);
				var showHyper = false;
				if (hyperLinkLayers!=null) {
					for (var s1=0;s1<hyperLinkLayers.length;s1++) {
						if (hyperLinkLayers[s1] == LayerName[ActiveLayerIndex]) showHyper=true;
					}
				}
					
				var fName1 = getFieldNames(selectedData);
				var fValue1 = getFieldValues(selectedData);
				selectPoints[selectCount] = getIdValue(fName1, fValue1);
				
				var idFieldNum = -1;
				var shapeFieldNum = -1;
				if (hideIDFieldData) {
					// hide ID column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
					}
				}
				if (hideShapeFieldData) {
					// hide Shape column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
					}
				}
				
				if (selectCount==0) {
					ppc += '<tr><th bgcolor="#C0C0C0"><FONT FACE="Arial" SIZE="-2" color="#000000">' + msgList[86] + '</FONT></a></th>';
					for (var f=0;f<fName1.length;f++) {
						if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
							var f2 = -1;
							if (useFieldAlias) {
								for (var f3=0;f3<AliasFieldName.length;f3++) {
									if (AliasFieldName[f3]==fName1[f]) f2 = f3;
								}
							}
							if (f2!=-1) {
								ppc += '<th bgcolor="#C0C0C0"><FONT FACE="Arial" SIZE="-2" color="#000000">' + AliasFieldAlias[f2] + '</FONT></a></th>';
							} else {
								ppc += '<th bgcolor="#C0C0C0"><FONT FACE="Arial" SIZE="-2" color="#000000">' + fName1[f] + '</FONT></a></th>';
							}
							// Hannah Added: compile list of field names for text
							sRecText += fName1[f] + ";";

						}
					}
					ppc += '</tr>';
					// Hannah Added: put field name list in array, minus last comma
					arrRecs[0] = sRecText.substr(0,sRecText.length-1);
					sRecText = "";
				}
				ppc += '<tr><td';
				if (isSecond) {
					ppc += ' bgcolor="#FFFFFF">';
				}else{
					ppc += '>';
				} 
				if (toolMode!=4) ppc += '<a href="javascript:' + theFrame + '.showHighlight(' + selectCount + ')">';
				ppc += '<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord) + '</FONT>';
				if (toolMode!=4) ppc += '</a>';
				ppc += '</td>';
				for (var f=0;f<fName1.length;f++) {	
					if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
						// Hannah Added: compile list of field values for text
						sRecText += fValue1[f] + ";";
						ppc += '<TD';
						if (isSecond) {
							ppc += ' bgcolor="#FFFFFF">';
						}else{
							ppc += '>';
						} 
						var isHyper=false;
						if (showHyper) {
							for (var s1=0;s1<hyperLinkFields.length;s1++) {
								if (hyperLinkFields[s1]==fName1[f]) {
									var theLinkURL = currentHyperLinkPrefix + fValue1[f] + currentHyperLinkSuffix;
									ppc += '<a href="' + theLinkURL + '" target="_blank">';
									isHyper=true;
								}
							}
						}
						var s2 = -1;
						for (var s1=0;s1<LayerFields.length;s1++) {
							if (fName1[f]==LayerFields[s1]) s2=s1;
						}
						if (LayerFieldType[s2]=="91") {
							//alert(fName1[f]);
							if (isNaN(fValue1[f])) {
								var theDate = fValue1[f];
							} else {
								//var theDate = new Date(parseInt(fValue1[f]));
								var theDateObj = new Date(parseFloat(fValue1[f]));
								var d = theDateObj.toUTCString();
								var theDate = d.replace(/GMT|UTC/,"");
							}
							ppc += '<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>';
							theDate=null;
						} else {
							// put html entity for spaces so display is correct - browsers trim extra spaces
							tempString = fValue1[f].replace(/ /g, "&nbsp;");
							ppc += '<FONT FACE="Arial" SIZE="-2">' + tempString + '</FONT>';
							//Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + '</FONT>');
						}
						if (isHyper) ppc += '</a>';
						ppc += '</td>';
					}
				}
				ppc += '</tr>';
				fName1 = null;
				fValue1 = null;
				isSecond = !isSecond 
				//Hannah Added: add record's values to array
				arrRecs[iRecNum] = sRecText.substr(0,sRecText.length-1);
				sRecText = "";
				iRecNum++;
				
			}
			selectCount += 1;
					
		}
		if (showSelectedData) {
			
			ppc += '</table></center>';
			gmd += '<center><FONT FACE="Arial" SIZE="-2">';
			if (toolMode!=25) {
				if (queryStartRecord>1) {
					var prevRecord = queryStartRecord - maxFeaturesReturned;
					if (prevRecord<1) prevRecord=1;
					gmd += '<a href="javascript:' + theFrame + '.getMoreData(' + prevRecord + ')">' + msgList[61] + maxFeaturesReturned + msgList[62] + '</a>&nbsp;&nbsp;&nbsp;';
				}
				if (stillMore) {
					var nextRecord=featureCount + queryStartRecord;
					gmd += '<a href="javascript:' + theFrame + '.getMoreData(' + nextRecord + ')">' + msgList[63] + '</a>';
				}
			}
			if ((toolMode!=4) && (toolMode!=25) && (selectCount>1)) {
				gmd += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="javascript:' + theFrame + '.zoomToReturnedRecords()">Zoom to these records</A></b>';
			}

			gmd += '</font></center>';
			Win1.document.writeln(ppc);
			Win1.document.writeln(gmd);
			Win1.document.writeln('</body></html>');
			Win1.document.close();
		}
		//alert("toolMode:" + toolMode);
		
		if ((queryStartRecord==1) && (toolMode!=4) && (toolMode!=25)) {
			if ((selectCount==1) && (zoomToSingleSelect)) {
				var fWidth = selectRight[0] - selectLeft[0];
				var fHeight = selectTop[0] - selectBottom[0];
				var mWMargin = 0;
				var mHMargin = 0;
				if (selectType=="point") {			
					mWMargin = fullWidth * selectPointMargin;
					mHMargin = fullHeight * selectPointMargin;
					if (mWMargin > xDistance/2) {
						mWMargin = xDistance/2;
						mHMargin = yDistance/2;
					}
				} else {
					mWMargin = fWidth * selectMargin;
					mHMargin = fHeight * selectMargin; 
				}
				saveLastExtent();
				eLeft = selectLeft[0] - mWMargin;
				eRight = selectRight[0] + mWMargin;
				eTop = selectTop[0] + mHMargin;
				eBottom = selectBottom[0] - mHMargin;
			}
			sendMapXML();
		}
		
		
			
	} else {
		//alert(tempString);
		if ((useExternalWindow) || (!useTextFrame)) {
			Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
		} else {
			Win1 = parent.ResultsFrame;
			Win1.document.open();
		}
		Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
		Win1.document.writeln('	<title>' + titleList[8] + '</title>');
		Win1.document.writeln('</head>');
		Win1.document.writeln('<body BGCOLOR="#FFFFFF" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
		Win1.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
		Win1.document.writeln('<br>' + msgList[64]);
		if (debugOn>0) {
			Win1.document.writeln('<p>' + msgList[65] + '<br>');
			Win1.document.writeln(untag(theReply));
		} else {
			if (theError!="") {
				Win1.document.writeln('<p>' + msgList[66] + '<br>');
				Win1.document.writeln(theError);
			}
		}
		Win1.document.writeln('</FONT>');
		Win1.document.writeln('</body></html>');
		Win1.document.close();
	}
	if (toolMode==4) selectCount=0;
	Win1=null;
	hideRetrieveData();
	
	printPatchContent = ppc.replace(/<a/g, "<p");  // globalize it (also break links)
}

// Hannah Added: array for text output
// var arrRecs = new Array();