function load()
{	
	preloadImages('http://www.google.com/intl/en_ALL/mapfiles/marker.png','http://www.google.com/intl/en_ALL/mapfiles/shadow50.png','http://www.google.com/intl/en_ALL/mapfiles/markerTransparent.png','http://www.google.com/intl/en_ALL/mapfiles/markerie.gif','http://www.google.com/intl/en_ALL/mapfiles/dithshadow.gif','http://www.google.com/intl/en_ALL/mapfiles/transparent.gif', 'http://www.predatoraware.com/images/markeryellow.png');
	resizeMap();	
	el("mapcontainer").style.display='block';
	el("offenderlistcontainer").style.display='block';
	el("ads").style.display='block';
	getOffendersListXslt();
	//getOffendersListReportXslt();
	getUnmappedOffendersXslt();
	getOffenderPopupXslt();
	listDiv = el("offenderlistrecordcontainer");
	unmappedInfoDiv = el("unmappedInfo");
	hiddenOffenderDiv = el("hiddenOffenderDiv");
	gettingRegions.length = 0;
	    
	if (GBrowserIsCompatible()) {
		yellowIcon = new GIcon();
		yellowIcon.image = "http://www.predatoraware.com/images/markeryellow.png";
		yellowIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
		yellowIcon.iconSize = new GSize(20, 34);
		yellowIcon.shadowSize = new GSize(37, 34);
		yellowIcon.iconAnchor = new GPoint(9, 34);
		yellowIcon.infoWindowAnchor = new GPoint(9, 2);
		yellowIcon.infoShadowAnchor = new GPoint(18, 25);
	
		map = new GMap2(el("map"));			
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GOverviewMapControl());
		GEvent.addListener(map, "moveend", function() { 
			if(map.getZoom() > 12)
			{
				getVisibleRegionsDelay();
			}           
		});
		el("map").text += "<div id=\"levelmarker\"></div>";
			
		if (window.attachEvent) { 
			window.attachEvent("onresize", function() {this.map.onResize()} );
		} else { 
			window.addEventListener("resize", function() {this.map.onResize()} ,false); 
		}

		map.setCenter(new GLatLng(37.4419, -95.1419), 4);
	}
	else
	{
		//Glog.write("Incompatible Browser");
	}		
}


//function go()
//{
//	var XMLDocument = getXmlDocument(xmlStr);
//    var XSLDocument = getXmlDocument(xslStr);
//    document.all['targetDIV'].innerHTML = XMLDocument.transformNode(XSLDocument);    
//}

        //function xslt(XMLDocument, XSLDocument, HTMLtarget)
        //{
			//var XMLDocument = getXmlDocument(xmlStr);
			//var XSLDocument = getXmlDocument(xslStr);
            //var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.4.0'); 
            //var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.4.0');
            //XMLDocument.setProperty("NewParser", true);
            //XSLDocument.setProperty("NewParser", true);
            //var HTMLtarget = document.all['targetDIV']; 

            //XMLDocument.validateOnParse = true; 
            //XMLDocument.load('planets.xml');
            //XMLDocument.loadXML(xmlStr);
            //if (XMLDocument.parseError.errorCode != 0) {
            //     HTMLtarget.innerHTML = "Error!" 
            //     return false; 
            //} 

            //XSLDocument.validateOnParse = true; 
            //XSLDocument.load('planets.xsl'); 
            //XSLDocument.loadXML(xslStr);
            //if (XSLDocument.parseError.errorCode != 0) {
            //     HTMLtarget.innerHTML = "Error!" 
            //     return false; 
            //} 

            //HTMLtarget.innerHTML = XMLDocument.transformNode(XSLDocument); 
            //return true;
        //}
        
   

function preloadImages() 
{
    var d=document; if(d.images){ if(!d.p) d.p=new Array();
    var i,j=d.p.length,a=preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.p[j]=new Image; d.p[j++].src=a[i];}}
}    


function getOffendersListXslt()
{	
	GDownloadUrl("offenderList.xslt", function(data, responseCode) {
	//offenderListXsl = GXslt.create(GXml.parse(data));	
	//offenderListXsl = GXml.parse(data);	
	offenderListXsl = getXmlDocument(data);	
	//may have to do this
	//offenderListXsl = xmlParse(data);
	});	
	
	//var request = GXmlHttp.create();        
    //try
    //{                       
    //    request.open("GET", "http://www.predatoraware.com/offenderList.xslt", true);
    //}
    //catch(e)
    //{
    //   //Glog.write(e.message);
    //}           
    //request.onreadystatechange = function() 
    //{
    //    if (request.readyState == 4)
    //    {   
	//		var xslDoc = request.responseXML;
	//		offenderListXsl =xmlParse(xslDoc);			
    //    }
    //}
    //request.send(null);        
}

function getUnmappedOffendersXslt()
{
	GDownloadUrl("unmappedOffenderPopup.xslt", function(data, responseCode) {
	//unmappedOffenderXsl = GXslt.create(GXml.parse(data));
	//unmappedOffenderXsl = GXml.parse(data);
	unmappedOffenderXsl = getXmlDocument(data);
	//may have to do this instead
	//unmappedOffenderXsl = xmlParse(data);
	});	
}

function getOffenderPopupXslt()
{
	GDownloadUrl("offenderPopup.xslt", function(data, responseCode) {
	//offenderPopupXsl = GXslt.create(GXml.parse(data));
	//offenderPopupXsl = GXml.parse(data);
	offenderPopupXsl = getXmlDocument(data);	
	//may have to do this instead
	//offenderPopupXsl = xmlParse(data);
	});
}

function getVisibleRegionsDelay()
{
	if(geoSearchType) //if we are in the default mode (not the name search mode)
	{	
		setSearchDivs();
		setTimeout("getVisibleRegions()",10);
	}	
}

function setSearchDivs()
{
	el("welcomemessage").style.display='none';
	el("offenderlistheader").style.display='block';
	el("offenderlistrecordcontainer").style.display='block';
	el("loadingstatus").style.display='block';
	el("legendToggle").style.display='block';
}

function getVisibleRegions()
{	
    //gets the list of regions visible within the map area
    //Glog.write("Beginning getVisibleRegions()");
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();    
    var minLat = southWest.lat();
    var maxLat = northEast.lat();
    var minLng = southWest.lng();
    var maxLng = northEast.lng();
    
    var regionMinX = getPointRegionPart(minLng);
    var regionMaxX = getPointRegionPart(maxLng);
    var regionMinY = getPointRegionPart(minLat);
    var regionMaxY = getPointRegionPart(maxLat);
    
    var numXRegions = parseInt(parseFloat(Math.abs(regionMaxX - regionMinX).toFixed(2)) / .05 + 1);
    var numYRegions = parseInt(parseFloat(Math.abs(regionMaxY - regionMinY).toFixed(2)) / .05 + 1);
    
    //Glog.write("visibleMarkers.length: " + visibleMarkers.length);
    
    //remove markers from the visibleMarker array that are no longer visible
    for(var i=visibleMarkers.length - 1;i>=0;i--)
    {
        var visibleMarker = visibleMarkers[i];
        
        //if((visibleMarker.offender.latLng.lat() > minLat && visibleMarker.offender.latLng.lat() < maxLat && visibleMarker.offender.latLng.lng() > minLng && visibleMarker.offender.latLng.lng() < maxLng) == false)
        if( bounds.contains(visibleMarker.offender.latLng) == false )
        {
			try
			{
				visibleMarkers.splice(i,1);
				visibleMarker.hide();
				////Glog.write(visibleOffendersXml.documentElement);
				//visibleOffendersXml.documentElement.selectSingleNode("mapped").removeChild(visibleMarker.offender.xmlElement);
				try
				{					
					mappedOffendersElement.removeChild(visibleMarker.offender.xmlElement);
				}
				catch(e) {} // do nothing, since this marker is from the 'name search' and does not belong to the mappedOffendersElement
				offenderCount--;
				//Glog.write("Marker Removed: " + visibleMarker.offender.id);
				visibleMarker.offender.marker = null;
				visibleMarker.offender = null;				
				availableMarkers.push(visibleMarker);
            }
            catch(e)
            {
				//Glog.write("Remove Marker: " + e.message);
            }
        }
    }
    //Glog.write("numXRegions: " + numXRegions + " numYRegions: " + numYRegions);
    viewableRegions = new Array(numXRegions * numYRegions);
    var index = 0;
    
    //Glog.write("should go into loop " + (numXRegions * numYRegions) + " times");
    for(var x=0;x < numXRegions;x++)
    {
        for(var y=0;y < numYRegions;y++)
        {
			//Glog.write("x:" + x + " y:" + y );
			
			try
			{
				regionX = parseFloat(regionMinX + (x * .05)).toFixed(2);
				regionY = parseFloat(regionMaxY - (y * .05)).toFixed(2);
	            
				var regionID = "Q" + regionY + "_" + regionX;
				
				viewableRegions[index] = regionID;
				index++;
	            
				if(typeof(cachedRegions[regionID]) == "undefined")
				{
					addViewableRegion(regionID);
				}
				else
				{
					showViewableRegionMarkers(regionID);
				}
            }
            catch(e)
            {
				//Glog.write(e.message);
            }
        }
    }        
    
    //Glog.write("end of getVisibleRegions");
    showOffendersList("one");    
}

function addViewableRegion(regionID)
{		
    if(typeof(cachedRegions[regionID]) == "undefined")
    {
        getOffendersXml(regionID);
    }
    else if(typeof(cachedRegions[regionID].mappedOffenders) == "undefined")
    {   
        var xmlDoc = cachedRegions[regionID].xmlDoc;
        try
        {
            if( typeof(xmlDoc) != "undefined" && xmlDoc != null && typeof(xmlDoc.documentElement) != "undefined" && xmlDoc.documentElement != null )
            {
                var elements = xmlDoc.documentElement.getElementsByTagName("mappedoffender");
                ////Glog.write(regionID + ": " + markers.length);
                cachedRegions[regionID].mappedOffenders = new Array(elements.length);
                for (var i=0; i < elements.length; i++)
                {
					////Glog.write("lon: " + elements[i].getAttribute("lon"));
                    var latLng = new GLatLng(parseFloat(elements[i].getAttribute("lat")),
                                        parseFloat(elements[i].getAttribute("lon")));                  
                    var offender = new Object();
                    offender.id = elements[i].getAttribute("id");
                    offender.latLng = latLng;
                    offender.xmlElement = elements[i];                        
                    offender.regionID = regionID;
                    offender.marker = null;
                    //offender.xmlElement.parentNode.removeChild(offender.XmlElement);
                    ////Glog.write("offender.xmlElement: " + offender.xmlElement );
                    ////Glog.write("this.offender.xmlElement: " + this.offender.xmlElement );                    
                    ////Glog.write(typeof(offender.xmlElement));    
                    //var result = offenderPopupXsl.transformToHtml(offender.xmlElement, hiddenOffenderDiv);
					//offender.onClick = function() { this.openInfoWindowHtml(hiddenOffenderDiv.innerHTML); }
                
					////Glog.write("1");    
                    //TODO: if result is false, like for safari, do this instead
                    
                    offender.onMouseOver = function() { var infoWindowHtml = this.offender.xmlElement.transformNode(offenderPopupXsl);
						//unmappedInfoDiv.innerHTML = infoWindowHtml;
						//unmappedInfoDiv.style.display = 'block';
						//this.offender.marker.setImage("images/markeryellow.png");
						this.offender.marker.setTooltip(infoWindowHtml);
						this.offender.marker.topMarkerZIndex();
						this.offender.marker.showTooltip();
					}
					
					offender.onMouseOut = function() { 
						unmappedInfoDiv.style.display = 'none';
						//this.offender.marker.restoreImage();
						
					}
                    
                    //offender.onClick = function() { var infoWindowHtml = this.offender.xmlElement.transformNode(offenderPopupXsl);    //xsltProcess( this.offender.xmlElement, offenderPopupXsl);
                    //this.openInfoWindowHtml(infoWindowHtml);
                    //closeUnmappedOffender(); }
                    
                    //offender.onClick = function() { this.openInfoWindowXslt(infoWindowHtml); closeUnmappedOffender(); }
                    
                    //Glog.write("Offender element processed: "  + i);
                    cachedRegions[regionID].mappedOffenders[i] = offender;                      
                }
                
                
                elements = xmlDoc.documentElement.getElementsByTagName("unmappedoffender");
                ////Glog.write(regionID + ": " + markers.length);
                cachedRegions[regionID].unmappedOffenders = new Array(elements.length);
                cachedRegions[regionID].unmappedListed = false;
                //if( elements.length > 0 )
				//	//Glog.write(elements.length + " unmapped Offenders being added");
                
                for (var i=0; i < elements.length; i++)
                {
                    var offender = new Object();
                    offender.id = elements[i].getAttribute("id");                        
                    offender.xmlElement = elements[i];             
                    offender.regionID = regionID;
                    //Glog.write("3");
                    //offender.xmlElement.parentNode.removeChild(offender.XmlElement);
                    //offender.onClick = function() { this.openInfoWindowXslt(this.offender.xmlElement, "http://www.predatoraware.com/offenderPopup.xslt"); closeUnmappedOffender(); }
                    //offender.onClick = function() { this.openInfoWindowHtml(this.offender.xmlElement.firstChild.nodeValue); }
                    cachedRegions[regionID].unmappedOffenders[i] = offender;
                }                
                //Glog.write("4");
                showViewableRegionMarkers(regionID);
            }
        }
        catch(e)
        {
            //Glog.write("2: " + e.message);
        }
        showOffendersList("two");
    }
    else
    {
        showViewableRegionMarkers(regionID);
        showOffendersList("three");
    }
}

function showViewableRegionMarkers(regionID)
{
	if(typeof(cachedRegions[regionID].mappedOffenders) == "undefined")
		return;
		
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    var minX = southWest.lat();
    var maxX = northEast.lat();
    var minY = southWest.lng();
    var maxY = northEast.lng();
    
    //Glog.write("RegionID: " + regionID + ", Offender Count: " + cachedRegions[regionID].mappedOffenders.length);
    
    if(typeof(cachedRegions[regionID].mappedOffenders) != "undefined")
    {
		for(var j=0;j < cachedRegions[regionID].mappedOffenders.length;j++)
		{           
			var offender = cachedRegions[regionID].mappedOffenders[j];
			////Glog.write("offenderID: " + offender.id + ", offender.marker: " + offender.marker );
	        
			//if the offender lies within the bounds			
			//if((offender.marker == null || typeof(offender.marker) == "undefined") && offender.latLng.lat() > minX && offender.latLng.lat() < maxX && offender.latLng.lng() > minY && offender.latLng.lng() < maxY)
			if( (offender.marker == null || typeof(offender.marker) == "undefined") && bounds.contains(offender.latLng))
			{				
				if(availableMarkers.length > 0)
				{
					try
					{
						var marker = availableMarkers.pop();
						////Glog.write(visibleOffendersXml.documentElement);
						//visibleOffendersXml.documentElement.selectSingleNode("mapped").appendChild(marker.offender.xmlElement);
						marker.offender = offender;
						offender.marker = marker;
						mappedOffendersElement.appendChild(offender.xmlElement);
						offenderCount++;
						visibleMarkers.push(marker);
						marker.setPoint(offender.latLng);
						//marker.setToolTip(marker.offender.id);
						//marker.topElement.setAttribute( "title" , marker.offender.id );
						marker.show();
						//marker.redraw(true);
						//Glog.write("Reused Marker: " + marker.offender.latLng.lat() + ", " + marker.offender.id);
					}
					catch(e)
					{
						//Glog.write("ShowViewableRegionMarkers(availableMarker): " + e.message);
					}
				}
				else
				{
					try
					{
						////Glog.write(visibleOffendersXml.documentElement.selectSingleNode);
						//visibleOffendersXml.documentElement.selectSingleNode("mapped").appendChild(offender.xmlElement);
						var newMarker = new PdMarker(offender.latLng);
						newMarker.setHoverImage("http://www.predatoraware.com/images/markeryellow.png");
						newMarker.offender = offender;
						offender.marker = newMarker;
						var html = "<img src='http://www.predatoraware.com/images/ut/7.gif'>";
						//marker.setTooltip(html);
						mappedOffendersElement.appendChild(offender.xmlElement);
						offenderCount++;
						visibleMarkers.push(newMarker);
						map.addOverlay(newMarker);
						//GEvent.bind(newMarker,"click",newMarker,newMarker.offender.onClick);
						GEvent.bind(newMarker,"mouseover",newMarker,newMarker.offender.onMouseOver);
						GEvent.bind(newMarker,"mouseout",newMarker,newMarker.offender.onMouseOut);
						//GEvent.addListener(newMarker, "mouseover", function() {
						//  newMarker.openInfoWindowHtml("ID:" + newMarker.offender.id);
						//});                       
						//if (newMarker.transparentIcon) {newMarker.topElement = newMarker.transparentIcon;}
						//if (newMarker.imageMap) {newMarker.topElement = newMarker.imageMap;}
						//if (newMarker.topElement != null && typeof(newMarker.topElement) != "undefined") { newMarker.topElement.setAttribute( "title" , newMarker.offender.id ); }
						//Glog.write("New Marker: " + newMarker.offender.latLng.lat() + ", " + newMarker.offender.id);
					}
					catch(e)
					{
						//Glog.write("ShowViewableRegionMarkers(newMarker): " + e.message);
					}
				}
			}
		}
	}
}

function showOffendersList(id)
{		
	try
	{	
		//Glog.write(id + " - viewable regions: " + viewableRegions.length + ", gettingRegions.length: " + gettingRegions.length + ", cachedRegions.length: " + cachedRegions.length);
		if(gettingRegions.length == 0)
		{	
			//Glog.write("Before region in cahcedRegions");			
			for(var region in cachedRegions)
			{
				var isVisible = false;					
				for(var i=0;i<viewableRegions.length;i++)
				{						
					if(viewableRegions[i] == region)
					{							
						if(cachedRegions[region].unmappedListed == false) //add the unmapped offenders to the list
						{
							cachedRegions[region].unmappedListed = true;
							//Glog.write("adding unmapped: " + cachedRegions[region].unmappedOffenders.length);
							for(var j=0;j<cachedRegions[region].unmappedOffenders.length;j++)
							{
								//Glog.write(cachedRegions[region].unmappedOffenders.length);
								//Glog.write(cachedRegions[region].unmappedOffenders[j].id);
								unmappedOffendersElement.appendChild(cachedRegions[region].unmappedOffenders[j].xmlElement);
								offenderCount++;
							}
						}
						isVisible = true;				
						break;
					}
				}
				if(isVisible == false && cachedRegions[region].unmappedListed == true) //remove the unmapped offenders from the list
				{
					cachedRegions[region].unmappedListed = false;
					//Glog.write("removing unmapped: " + cachedRegions[region].unmappedOffenders.length);
					for(var j=0;j<cachedRegions[region].unmappedOffenders.length;j++)
					{
						unmappedOffendersElement.removeChild(cachedRegions[region].unmappedOffenders[j].xmlElement);
						offenderCount--;
					}
				}
			}
			//Glog.write("After region in cahcedRegions");			
			
			//var elements = visibleOffendersXml.getElementsByTagName("unmappedoffender");
			////Glog.write(visibleOffendersXml.xml);
			////Glog.write("unmapped offender count in xml: " + elements.length);
			
			//var result = offenderListXsl.transformToHtml(visibleOffendersXml, listDiv);
			
			//TODO: if result is false, like for Safari, do this
			try
			{
//			    //Glog.write(typeof(visibleOffendersXml));
//			    //Glog.write(typeof(offenderListXsl));
//			    //Glog.write(typeof(listDiv));
//			    var exp = new ExprContext(visibleOffendersXml);
//			    //Glog.write(typeof(exp));
//			    xsltProcessContext(exp, offenderListXsl, listDiv);
//                alert(visibleOffendersXml.xml);
                //alert(offenderListXsl.xml);
//				var xsltHtml = xsltProcess(visibleOffendersXml, offenderListXsl);
//				listDiv.innerHTML = xsltHtml;

                //Sarissa code
                //alert(offenderListProcessor);
                //alert(visibleOffendersXml.xml);
                //var xsltHtmlDOM = offenderListProcessor.transformToDocument(visibleOffendersXml);
                //alert(xsltHtmlDOM.xml);
                //var xsltHtml = XmlSerializer().serializeToString(xsltHtmlDOM);
                //alert(xsltHtml);
                var htmltext = visibleOffendersXml.transformNode(offenderListXsl);
                //alert(htmltext);                
                listDiv.innerHTML = htmltext;                
			}
			catch(e)
			{
				//Glog.write(e.message);
			}
		}
		el("loadingstatus").style.display='none';
		el("offenderlistheader").innerHTML= offenderCount + " Registered Sex Offenders";
		//el("mapheader").innerHTML='Map';
		////Glog.write("loading done");
    }
    catch(e)
    {
		//Glog.write("showOffendersList: " + e.message);
    }
}

function getOffendersXml(pointRegionID)
{       
    if(typeof(cachedRegions[pointRegionID]) == "undefined" && (typeof(gettingRegions[pointRegionID]) == "undefined" || gettingRegions[pointRegionID] == null))
    {
		//Glog.write("Getting OffendersXML for Region: " + pointRegionID );
        gettingRegions[pointRegionID] = pointRegionID;
        gettingRegions.length++;
        var request = GXmlHttp.create();
        var url = "http://www.predatoraware.com/regions/" + pointRegionID + ".xml";
        GDownloadUrl(url, function(data, responseCode) {
				//Glog.write("Got OffendersXML for Region: " + pointRegionID );
				//var xmlDoc = GXml.parse(data);
				var xmlDoc = getXmlDocument(data);
			    var regionObject = new Object();
                regionObject.xmlDoc = xmlDoc;
                regionObject.regionID = pointRegionID;
                cachedRegions[pointRegionID] = regionObject;
                delete gettingRegions[pointRegionID];
                gettingRegions.length--;
                addViewableRegion(pointRegionID);
                //Glog.write("Finished processing OffendersXML for Region: " + pointRegionID );
		});	        
    }       
}

function getPointRegionID(point)
{
    //calculate the region filename from the point passed in, x=longitude y=latitude
    var lon = getPointRegionPart(point.x);
    var lat = getPointRegionPart(point.y);
    
    return "Q" + lat + "_" + lon;       
}

function getPointRegionPart(coordinate)
{
    var neg = coordinate < 0;
    coordinate = Math.abs(coordinate);
    
    ////Glog.write("begin getPointRegionPart: " + coordinate + ", fixed:" + coordinate.toFixed(1));
    ////Glog.write(Math.max(coordinate, coordinate.toFixed(1)));
    
    if( Math.max(coordinate, parseFloat(coordinate.toFixed(1))) == coordinate )
    {
        coordinate = (parseFloat(coordinate.toFixed(1)) + .05).toFixed(2);
    }
    else
    {
        coordinate = parseFloat(coordinate.toFixed(1)).toFixed(2);
    }
    ////Glog.write("end getPointRegionPart: coordinate=" + coordinate);
    
    if(neg)
        coordinate = coordinate * -1;
        
    return coordinate;
}

function mappedOffenderClick(id)
{
	for(var i=0;i<visibleMarkers.length;i++)
	{
		if(visibleMarkers[i].offender.id == id)
		{			
			//GEvent.trigger(visibleMarkers[i],"click");
			GEvent.trigger(visibleMarkers[i],"mouseover");
			break;
		}
	}
}

function mappedOffenderUnselect(id)
{
	for(var i=0;i<visibleMarkers.length;i++)
	{
		if(visibleMarkers[i].offender.id == id)
		{			
			//GEvent.trigger(visibleMarkers[i],"click");
			GEvent.trigger(visibleMarkers[i],"mouseout");
			break;
		}
	}
}

function unmappedOffenderClick(id)
{
	if(geoSearchType)
	{
		for(var i=0;i<viewableRegions.length;i++)		
		{
			if ( cachedRegions[viewableRegions[i]].unmappedOffenders )
			{
				for(var j=0;j<cachedRegions[viewableRegions[i]].unmappedOffenders.length;j++)
				{
					if(cachedRegions[viewableRegions[i]].unmappedOffenders[j].id == id )
					{
						//var result = unmappedOffenderXsl.transformToHtml(cachedRegions[viewableRegions[i]].unmappedOffenders[j].xmlElement, unmappedInfoDiv);
						
						//TODO: if result is false, like for safari, do this instead
						//var transformedHtml = xsltProcess(cachedRegions[viewableRegions[i]].unmappedOffenders[j].xmlElement, unmappedOffenderXsl);
						//unmappedInfoDiv.innerHTML = transformedHtml;
						unmappedInfoDiv.innerHTML = cachedRegions[viewableRegions[i]].unmappedOffenders[j].xmlElement.transformNode(unmappedOffenderXsl);    
						
						unmappedInfoDiv.style.display='block';
						return;
					}
				}
			}
		}
	}
	else
	{
		if ( nameSearchObject.unmappedOffenders )
		{
			for(var j=0;j<nameSearchObject.unmappedOffenders.length;j++)
			{
				if(nameSearchObject.unmappedOffenders[j].id == id )
				{
					//unmappedOffenderXsl.transformToHtml(nameSearchObject.unmappedOffenders[j].xmlElement, unmappedInfoDiv);
					
					//TODO: if result is false, like for safari, do this instead
					//var transformedHtml = xsltProcess(nameSearchObject.unmappedOffenders[j].xmlElement, unmappedOffenderXsl);
					//unmappedInfoDiv.innerHTML = transformedHtml;
					unmappedIfnoDiv.innerHTML = nameSearchObject.unmappedOffenders[j].xmlElement.transformNode(unmappedOffenderXsl);
					
					unmappedInfoDiv.style.display='block';
					return;
				}
			}
		}
	}
}

function closeUnmappedOffender()
{
	unmappedInfoDiv.style.display="none";
}

function changeView(reportView)
{
	if(inReportView == reportView)
		return;
		
	var mc = el("mapcontainer");
	var olc = el("offenderlistcontainer");
	var olrc = el("offenderlistrecordcontainer");
	var l = el("legend");
	
	if(reportView)
	{						
		inReportView = true;
		olrc.style.overflow = "visible";
		l.style.top = "910px";
		l.style.left = "380px";
		l.style.display = "block";
	}
	else
	{	
		mc.style.left = "365px";
		
		olc.style.top = "150px";
		olc.style.width = "305px";
		olrc.style.width = "285px";
		olrc.style.overflow = "auto";
		l.style.top = "160px";
		l.style.left = "60px";
		l.style.display = "none";
		
		inReportView = false;			
	}
	resizeMap();
	map.onResize();
}

function getNamedOffenders()
{	
	var searchText = el("offenderName").value;
	var request = GXmlHttp.create();
    var url = "http://www.predatoraware.com/SearchName.aspx?query=" + escape(searchText);
    
    try
    {                       
        request.open("GET", url, true);
    }
    catch(e)
    {
        //Glog.write(e.message);
    }           
    request.onreadystatechange = function() 
    {
        if (request.readyState == 4)
        {				
            offenderCount = 0;
            var xmlDoc = getXmlDocument(request.responseXML.Xml);
            
            if(xmlDoc.documentElement.getElementsByTagName("response")==null)
            {
				var responseElement = xmlDoc.documentElement.getElementsByTagName("response")[0];
				//Glog.write(responseElement.getAttribute("status"));
            }
            else
            {
				el("welcomemessage").style.display='none';
				el("offenderlistheader").style.display='block';
				el("offenderlistrecordcontainer").style.display='block';
				el("loadingstatus").style.display='block';
				el("legendToggle").style.display='block';
		
				nameSearchObject = new Object();
                nameSearchObject.xmlDoc = xmlDoc;
                
                var elements = xmlDoc.documentElement.getElementsByTagName("mappedoffender");
                nameSearchObject.mappedOffenders = new Array(elements.length);
                for (var i=0; i < elements.length; i++)
                {
                    var latLng = new GLatLng(parseFloat(elements[i].getAttribute("lat")),
                                        parseFloat(elements[i].getAttribute("lon")));                   
                    var offender = new Object();
                    offender.id = elements[i].getAttribute("id");
                    offender.latLng = latLng;
                    offender.xmlElement = elements[i];
                    offender.marker = null;
                    
                    //var result = offenderPopupXsl.transformToHtml(this.offender.xmlElement, hiddenOffenderDiv);
                    //offender.onClick = function() { this.openInfoWindowHtml(hiddenOffenderDiv.innerHTML); closeUnmappedOffender(); }                        
                    
                    //TODO: if result is false, like with safari, then do this
                    offender.onMouseOver = function() { var infoWindowHtml = this.offender.xmlElement.transformNode(offenderPopupXsl);
						unmappedInfoDiv.innerHTML = infoWindowHtml;
						unmappedInfoDiv.style.display = 'block';
						this.offender.marker.setImage("http://www.predatoraware.com/images/markeryellow.png");
					}
					
					offender.onMouseOut = function() { 
						unmappedInfoDiv.style.display = 'none';
						this.offender.marker.restoreImage();
					}
						
                    //offender.onClick = function() { var infoWindowHtml = this.offender.xmlElement.transformNode(offenderPopupXsl);  //xsltProcess(this.offender.xmlElement, offenderPopupXsl);
					//	this.openInfoWindowHtml(infoWindowHtml);
                    //closeUnmappedOffender(); }
                    
                    nameSearchObject.mappedOffenders[i] = offender;
                    offenderCount++;
                }
                
                elements = xmlDoc.documentElement.getElementsByTagName("unmappedoffender");
                nameSearchObject.unmappedOffenders = new Array(elements.length);
                nameSearchObject.unmappedListed = false;
                
                for (var i=0; i < elements.length; i++)
                {
                    var offender = new Object();
                    offender.id = elements[i].getAttribute("id");                        
                    offender.xmlElement = elements[i];                        
                    nameSearchObject.unmappedOffenders[i] = offender;
                    offenderCount++;
                }                   
                
                //remove visible markers
				for(var i=visibleMarkers.length - 1;i>=0;i--)
				{
					var visibleMarker = visibleMarkers[i];
					
					try
					{
						visibleMarkers.splice(i,1);
						visibleMarker.hide();							
						visibleMarker.offender.marker = null;
						try
						{					
							mappedOffendersElement.removeChild(visibleMarker.offender.xmlElement);
						}
						catch(e) {} // do nothing, since this marker is from the 'name search' and does not belong to the mappedOffendersElement
						visibleMarker.offender = null;
						availableMarkers.push(visibleMarker);
					}
					catch(e)
					{
						//Glog.write("Remove Marker: " + e.message);
					}						
				}					
				
				if(typeof(nameSearchObject.mappedOffenders) != "undefined")
				{
					for(var j=0;j < nameSearchObject.mappedOffenders.length;j++)
					{           
						var offender = nameSearchObject.mappedOffenders[j];
						
						if((offender.marker == null || typeof(offender.marker) == "undefined") )
						{								
							if(availableMarkers.length > 0)
							{
								try
								{
									var marker = availableMarkers.pop();								
									marker.offender = offender;
									offender.marker = marker;										
									visibleMarkers.push(marker);
									marker.setPoint(offender.latLng);
									//marker.setToolTip(marker.offender.id);
									//marker.topElement.setAttribute( "title" , marker.offender.id );
									marker.show();
									//marker.redraw(true);										
								}
								catch(e)
								{
									//Glog.write("NameSearchClick:" + e.message);
								}
							}
							else
							{
								try
								{
									var newMarker = new PdMarker(offender.latLng);
									newMarker.offender = offender;
									offender.marker = newMarker;
									var html = "<img src='http://www.predatoraware.com/images/ut/7.gif'>";
									//marker.setTooltip(html);
									visibleMarkers.push(newMarker);
									map.addOverlay(newMarker);
									//GEvent.bind(newMarker,"click",newMarker,newMarker.offender.onClick);										
									GEvent.bind(newMarker,"mouseover",newMarker,newMarker.offender.onMouseOver);
									GEvent.bind(newMarker,"mouseout",newMarker,newMarker.offender.onMouseOut);
									//if (newMarker.transparentIcon) {newMarker.topElement = newMarker.transparentIcon;}
									//if (newMarker.imageMap) {newMarker.topElement = newMarker.imageMap;}
									//if (newMarker.topElement != null && typeof(newMarker.topElement) != "undefined") { newMarker.topElement.setAttribute( "title" , newMarker.offender.id ); }										
								}
								catch(e)
								{
									//Glog.write("NameSearchClick(newMarker): " + e.message);
								}
							}
						}
					}
				}				
				
				//var result = offenderListXsl.transformToHtml(xmlDoc, listDiv);
				
				//TODO: if result is false, like for safari, do this instead
				var xsltHtml = xsltProcess(xmlDoc, offenderListXsl);
				listDiv.innerHTML = xsltHtml;
				
				map.setCenter(new GLatLng( 37.4419,-95.1419), 4);
				
				el("loadingstatus").style.display='none';
				el("offenderlistheader").innerHTML= offenderCount + " Registered Sex Offenders";
            }
        }
    }
    request.send(null);        
}

function getNamedOffendersDelay()
{
	var searchText = el("offenderName").value;
	
	if(searchText.length == 0)
		return;		
	
	setSearchDivs();    	

	setTimeout("getNamedOffenders()",10);
}

//]]>

function resizeMap() 
{
	var windowHeight = getWindowHeight();		
	if( windowHeight < 680 )
		windowHeight = 680; //min height
	
	var mapheight = windowHeight - 280;
	var innermapheight = mapheight - 36;
	var listheight = windowHeight - 180;
	var innerlistheight = listheight - 36;
	//var adtop = windowHeight - 105;
	
	var windowWidth = getWindowWidth();
	if( windowWidth < 1120 )
		windowWidth = 1120; //min width
		
	var width = windowWidth - 380;
	var innerwidth = width - 20;
	//var adleft = windowWidth / 2 - 364;		
	
	var olc = el("offenderlistcontainer");
	var olrc = el("offenderlistrecordcontainer");
	var mc = el("mapcontainer");
	var m = el("map");
	//var ads = el("ads");
	
	if(inReportView) //fixed widths and heights for map and list
	{
		olc.style.top = "900px";
		//olc.style.width = "728px";
		olc.style.height = "";
		//olrc.style.width = "708px";
		mc.style.left = "50px";
		mc.style.width = "728px";
		mc.style.height = "630px";
		m.style.width = "708px";
		m.style.height = "594px";
	}
	else
	{			
		olc.style.height = listheight + "px";
		olrc.style.height = innerlistheight + "px";
		mc.style.height = mapheight + "px";
		m.style.height = innermapheight + "px";
		
		mc.style.width = width + "px";
		m.style.width = innerwidth + "px";
		
		//ads.style.top = adtop + "px";
		//ads.style.left = "365px";		
	}
}

function checkEnterGeo(e,isGeo)
{ //e is event object passed from function invocation
	var characterCode; //literal character code will be stored in this variable

	if(e && e.which){ //if which property of event object is supported (NN4)
		e = e;
		characterCode = e.which; //character code is contained in NN4's which property
	}
	else
	{
		e = event
		characterCode = e.keyCode; //character code is contained in IE's keyCode property
	}

	if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
		if(isGeo)
			searchClick(); //submit the form
		else
			getNamedOffendersDelay();
		return false; 
	}
	else
	{
		return true; 
	}
}

function changeSearchType(isGeo)
{
	if(geoSearchType == isGeo)
		return;
		
	var ps = el("pagesearch");
	var ns = el("namesearch");
	geoSearchType=isGeo;
	
	if(isGeo)
	{
		ns.style.display='none';
		ps.style.display='block';			
	}
	else
	{
		ns.style.display='block';
		ps.style.display='none';			
	}
}
