var oMapObj;

var wManager = null;
var bLoggedIn = true;
var oFOWaiting = null;
var sUrlLogin;
var arrRegions = [];

var eMessage;

var eDivAddress, eDivGeocode;
var eMsgLat, eMsgLon;
var eMsgPin, eMsgBlock, eMsgAddress;

var sAppName;

var eFormPin, eFormAddr;
var nFormInputs;

var sSearchMessage = null;
var ePrintPageButton = null;

var sCurDescription = null;
var sCurAddress = null;

var oHttpReq;

var winPP;
var nTimerPP = null;


var oDasher = {
	17197:[/(\d{2})(\d{2})(\d{2})(\d{3})(\d{3})(\d{4})?/,4],
	17031:[/(\d{2})(\d{2})(\d{3})(\d{3})(\d{4})?/,3],
	def:[/(\d{2})(\d{2})(\d{3})(\d{3})?/,3]
}

var reAddress = /([^,]+), *([^0-9]+)([0-9]{5}(-[0-9]{4})?)/;

function ReDashPin(sPin,nFips)
{
	var sPinDisp = "";

	var a=oDasher[nFips];
	if (!a)
		a=oDasher.def;
	var arrPin=a[0].exec(sPin);

	var s;
	if (arrPin && arrPin.length>3)
	{
		for (var i=1; i<arrPin.length; i++)
		{
			s = arrPin[i];
			if (s && s.length>0)
				sPinDisp += (i>1?"-":"") + s;
			else
			{
//				sPinDisp += " fragment";
				break;
			}
		}
	}

	return sPinDisp;
}

function getBlock(sPin,nFips)
{
	var a=oDasher[nFips];
	if (!a)
		a=oDasher.def;

	var s,ap=a[0].exec(sPin);
	if (ap && (s=ap[a[1]]).length>0)
		return s;
	else
		return "";
}

function OpenOnSearch()
{
	var arrQS, sPin, sCounty, sOc;
	var sQS = window.location.search;
	var reQS = /[?&]([^=]+)=([^&]+)/g;
	while (arrQS = reQS.exec(sQS))
	{
		switch(arrQS[1].toLowerCase())
		{
			case "pin":
				sPin = arrQS[2];
				break;
			case "county":
				sCounty = arrQS[2];
				break;
			case "oc":
				sOc = arrQS[2];
				break;
		}
	}

//	if (sCounty=="17097" && sPin.length>10)
//		sPin = sPin.substring(0,10);

	if (sPin && sCounty && sOc)
		PostFindData("Pin=" + sPin + "&County=" + sCounty + "&oc=" + sOc);
}

function returnFalse() { return false; }

function disableRightClick(node)
{
	var n = elFirstChild(node);
	while (n)
	{
		if (n.nodeType==1)
			disableRightClick(n);
		n = elNextSibling(n);
	}
	node.oncontextmenu = returnFalse;
}

function SetupPage()
{
	SetupButtons();

	oMapObj = new MapObject("MapImage", "MapData", true);
	oMapObj.setRegion(nMLSNIRegion);
	oMapObj.setLoggedInMode(true);
	oMapObj.bGeocoding = true;
	oMapObj.sLayer = "Tax";

	eFormPin = document.forms["PinForm"];
	eFormPin.onsubmit = OnFormSubmit;

	eFormAddr = document.forms["AddrForm"];
	eFormAddr.onsubmit = OnFormSubmit;

	eMessage = document.getElementById("Message");

	eDivAddress = document.getElementById("AddressInfo");
	eDivGeocode = document.getElementById("GeocodeInfo");

	eMsgPin = document.getElementById("msgPin")
	eMsgBlock = document.getElementById("msgBlock");
	eMsgAddress = document.getElementById("msgAddress");

	eMsgLat = document.getElementById("msgLat");
	eMsgLon = document.getElementById("msgLon");

	ePrintPageButton = document.getElementById("ShowPrintPage");
	SetupButton(ePrintPageButton);
	ePrintPageButton.onclick = onPrintPageClick;
	ePrintPageButton.style.visibility = "hidden";

	var arrPans = ["PanLeft", "PanRight", "PanUp", "PanDown"];
	for (var i=0; i<4; i++)
	{
		var e = document.getElementById(arrPans[i]);
		e.onmouseover = onPanMouseOver;
		e.onmouseout = onPanMouseOut;
		e.onclick = onPanClick;
	}

	try
	{
		if (extraSetup)
			extraSetup();
	}
	catch(e)
	{
		;
	}

	disableRightClick(document);

	var aPath = /\/Maps\/([^\/]+)\/MapSearch/.exec(window.location.pathname);
	if (aPath)
		sAppName = aPath[1];

	ClearRequest();
	OpenOnSearch();
}

function ClearNode(node)
{
	var nC;
	nC = node.firstChild;
	while (nC)
	{
		node.removeChild(nC);
		nC = node.firstChild;
	}
}

function ClearRequest()
{
	if (oHttpReq)
	{
		if (oHttpReq.readyState>0 && oHttpReq.ReadyStateChanged<4)
			oHttpReq.abort;

		oHttpReq = null;
	}

	WriteMessage(sSearchMessage?sSearchMessage:"Ready to search");
	sSearchMessage = null;
}

function WriteMessage(sStr)
{
	ClearNode(eMessage);
	if (sStr)
	{
		var arrLines = sStr.split("\n");
		if (arrLines)
		{
			for (var i=0; i<arrLines.length; i++)
			{
				if (i>0)
					eMessage.appendChild(document.createElement("BR"));
				eMessage.appendChild(document.createTextNode(arrLines[i]));
			}
		}

		if (sStr=="Searching")
		{
			var eButton = document.createElement("Button");
			eButton.value = "Cancel";
			eButton.onclick = ClearRequest;
			SetupButton(eButton);
			eMessage.appendChild(document.createTextNode(" "));
			eMessage.appendChild(eButton);
		}
	}
}

function hidePrintPageButton() { ePrintPageButton.style.visibility = "hidden"; }
function showPrintPageButton() { ePrintPageButton.style.visibility = "visible"; }

function ClearResults(sNodeType)
{
	eMsgPin.firstChild.data
		= eMsgBlock.firstChild.data
		= eMsgLat.firstChild.data
		= eMsgLon.firstChild.data
		= "";

	oMapObj.hide();
	hidePrintPageButton();

	ClearNode(eMsgAddress);
	sCurDescription = sCurAddress = null;

	if (false && sNodeType && sNodeType=="GeoCode")
	{
		eDivAddress.style.display = "none";
		eDivGeocode.style.display = "block";
	}
	else
	{
		eDivAddress.style.display = "block";
		eDivGeocode.style.display = "none";
	}
}

function PrepareAddress(sAddress, el)
{
	var arrAddr = reAddress.exec(sAddress);
	if (arrAddr)
	{
		var doc = el.ownerDocument;
		el.appendChild(doc.createTextNode(arrAddr[1]));
		el.appendChild(doc.createElement("BR"));
		el.appendChild(doc.createTextNode(arrAddr[2]));
		el.appendChild(doc.createTextNode(" "));
		el.appendChild(doc.createTextNode(arrAddr[3]));
	}
}

function UpdateResults(node)
{
	var sPin, nFips, sPinDisp, sAddress;
	var arrPin, arrAddress;
	var sGeoLevel;

	var sNodeName = node.nodeName;

	ClearResults(sNodeName);

	switch(sNodeName)
	{
		case "Blocks":
			sPin = node.getAttribute("bid");
			nFips = Number(node.firstChild.getAttribute("fips"));
			
			sCurDescription = ReDashPin(sPin,nFips);
			eMsgPin.firstChild.data = sCurDescription;
			eMsgBlock.firstChild.data = getBlock(sPin,nFips);
			break;

		case "row":
			sPin = node.getAttribute("Pin");
			sAddress = node.getAttribute("Addr");
			nFips = Number(node.getAttribute("County"));

			sCurDescription = ReDashPin(sPin,nFips);
			sCurAddress = sAddress;

			sPinDisp = "";

			var sBlock = getBlock(sPin,nFips);
			if (sBlock.length>0)
			{
				eMsgPin.firstChild.data = sCurDescription;
				eMsgBlock.firstChild.data = sBlock;
			}
			PrepareAddress(sAddress, eMsgAddress);
			break;

		case "GeoCode":
			eMsgLat.firstChild.data = node.getAttribute("Lat");
			eMsgLon.firstChild.data = node.getAttribute("Lon");
			sSearchMessage = "Unknown address, geocoded to ";
			switch(node.getAttribute("Accuracy"))
			{
				case "9":
					sSearchMessage += "Zip+4";
					break;
				case "5":
					sSearchMessage = "5-digit Zipcode";
					break;
			}
			sSearchMessage += " accuracy.";
			break;
	}

}

function ReadyStateChanged()
{
	var xmlDoc, docEl, node, nNodes;
	var nCounty, sPin, sAddress, nLat, nLon;

	if (oHttpReq.readyState==4)
	{
		xmlDoc = oHttpReq.responseXML;
		try
		{
			docEl = xmlDoc.documentElement;
			node = elFirstChild(docEl);
	
			if (node==null)
				alert("Search returned no results.");
			else
			{
				while (node)
				{
					switch(node.nodeName)
					{
						case "Error":
							alert(node.firstChild.data);
							break;
						case "GeoCodeList":
							ShowXMLGeocode(node.firstChild);
							break;
						case "Blocks":
							UpdateResults(node);
							ShowBlockResults(node);
							break;
						case "PinSearch":
							UpdateResults(node);
							oMapObj.updateInfoXML(node.firstChild);
							showPrintPageButton();
							break;
						case "AddressList":
							ShowXMLRowResults(node);
							break;
						case "row":
							UpdateResults(node);
							if (node.hasChildNodes())
							{
								oMapObj.updateInfoXML(node.firstChild);
								// force refresh
								var nZoom = oMapObj.nZoom;
								oMapObj.nZoom = 0;
								oMapObj.setZoom(nZoom, false);
								showPrintPageButton();
							}
							break;
						case "Message":
							sSearchMessage = String(node.firstChild.data);
							break;
					}

					node = elNextSibling(node);
				}
			}
		}
		catch(e)
		{
			;
		}

		ClearRequest();
	}
}

function PostFindData(sPostData)
{
	sPostData += "&Height=" + String(nImageHeight) + "&Region=" + String(nMLSNIRegion) + "&Zoom=" + String(oMapObj.nZoom);

	var sTaxMapName = oMapObj.getTaxMapName();
	if (sTaxMapName && sTaxMapName.length>0)
		sPostData += "&CurTaxMap=" + sTaxMapName;
	if (sAppName)
		sPostData += "&App=" + sAppName;

	if (!oHttpReq)
	{
		oHttpReq = GetXMLReq();
	
		oHttpReq.open("POST", "/Maps/Scripts/Server/GetFindData.asp", true);
		oHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		oHttpReq.setRequestHeader("Accept", "text/xml");
		oHttpReq.setRequestHeader("Cache-Control", "no-cache");
		oHttpReq.onreadystatechange = ReadyStateChanged;
		oHttpReq.send(sPostData);
		WriteMessage("Searching")
	}
}

function SetupPrintPage()
{
	if (winPP.document.readyState=="complete")
	{
		clearInterval(nTimerPP);

		var doc = winPP.document;
		var eMapThere = doc.getElementById("MapImage");
		var eDescThere = doc.getElementById("Description");

		var eMapHere = document.getElementById("MapImage");
		eMapThere.src = eMapHere.src;

		if (sCurDescription)
		{
			eDescThere.appendChild(doc.createTextNode(sCurDescription));
			eDescThere.appendChild(doc.createElement("BR"));
		}

		if (sCurAddress)
			PrepareAddress(sCurAddress, eDescThere);

		winPP.print();
		winPP.close();
	}
}

function onPrintPageClick()
{
	winPP = window.open("PrinterMap.htm", "PrinterMap", "height=700,width=540,resizable=yes");

	if (nTimerPP)
		window.clearInterval(nTimerPP);

	nTimerPP = window.setInterval("SetupPrintPage()", 250);
}

function OnFormSubmit()
{
	var sPostData = "";
	var curEl;
	var nEls = this.elements.length;
	var sName, sValue;
	var arrF = new Array(3);
	var bBadForm = false;

	for (var i=0; i<nEls; i++)
	{
		curEl = this.elements[i];
		if (curEl.type=="text")
		{
			sValue = curEl.value;
			arrF[i] = sValue.length;
			if (sValue.length)
				sPostData += (sPostData.length>0?"&":"") + curEl.name + "=" + encodeURIComponent(sValue);
		}
	}

	if (nEls>2)
	{
		if (arrF[0]==0 || (arrF[1]==0 && arrF[2]==0))
		{
			alert("This form requires an Address with either a City or Zip.");
			bBadForm = true;
		}
	}
	else
	{
		if (arrF[0]==0)
		{
			alert("Can't post an empty form.");
			bBadForm = true;
		}
		else if (arrF[0]<7)
		{
			alert("At least 7 PIN digits required to search");
			bBadForm = true;
		}
	}

	if (bBadForm)
	{
		for (i=0; i<nEls; i++)
		{
			curEl = this.elements[i];
			if (curEl.type=="text" && curEl.value.length==0)
			{
				curEl.focus();
				break;
			}
		}
	}
	else
	{
		ClearResults();
		PostFindData(sPostData);
	}
	return false;
}


function onPanMouseOver()
{
	this.style.backgroundColor="#999999";
}

function onPanMouseOut()
{
	this.style.backgroundColor="#CCCCCC";
}

function onPanClick()
{
	if (oMapObj.isVisible())
	{
		var nX = 250;
		var nY = 250;
	
		switch(this.id.charAt(3))
		{
			case "L":
				nX -= 125;
				break;
			case "R":
				nX += 125;
				break;
			case "U":
				nY -= 125;
				break;
			case "D":
				nY += 125;
				break;
		}
		oMapObj.panMapXY(nX, nY);
	}
}

