﻿// JScript File
var COMACMaxHeight = 0;
var COMactivePanelId = "WelcomeView";



function COMPageLoadHandler()
{
    // track async postbacks to show/hide progress image   
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(COMBeginRequestHandler);
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(COMEndRequestHandler);
}

function CloseDirections()
{
    try
    {
        minmaxvisible = false;
        document.getElementById('routingDiv').style.display="none";
        document.getElementById('drivingDirectionsDiv').innerHTML="";
        
        
    }
    catch(e)
    {
        alert(e.message);
    }
}

function MinimizeDirections()
{
    try
    {
        var w = COMGetMapWidth();
        if(w<640){w=640;}
        document.getElementById('routingDiv').style.height="75px";
        document.getElementById('routingDiv').style.width = w +"px";
    }
    catch(e)
    {
        alert(e.message);
    }
}

function MaximizeDirections()
{
    try
    {
        
        var h = COMGetMapHeight();
        var w = COMGetMapWidth();
        if(w<640){w=640;}
        document.getElementById('routingDiv').style.height=h +"px";
        document.getElementById('routingDiv').style.width = w +"px";
    }
    catch(e)
    {
        alert(e.message);
    }
}
var minmaxvisible = false;
function OnGotRoute(route)
{
    try
    {
        var w = COMGetMapWidth();
        var h = COMGetMapHeight();
        
        var  closelinks ="<a  href='javascript:MinimizeDirections();'>Minimize</a>&nbsp;&nbsp;<a href='javascript:MaximizeDirections();'>Maximize</a>&nbsp;&nbsp;<a  href='javascript:CloseDirections();'>Close</a><br><br>";
        
         var routeinfo = "<i><b>Total distance: ";
        routeinfo+=route.Itinerary.Distance+" ";
        routeinfo+=route.Itinerary.DistanceUnit+"</b></i><br><br>";
        var steps="";
        var len = route.Itinerary.Segments.length;
        for(var i = 0; i < len ;i++)
        {
            if(i>1 && i<len-1)
            {
                var sn = i-1;
                steps+="<b>"+sn+"</b>: ";
            }
            steps+=route.Itinerary.Segments[i].Instruction+" -- (";
            steps+=route.Itinerary.Segments[i].Distance+") ";
            steps+=route.Itinerary.DistanceUnit+"<br><br>";
        }
        routeinfo+=steps;
         document.getElementById('drivingDirectionsDiv').innerHTML=routeinfo; 
        document.getElementById('routingDiv').style.display="block";
        if(!minmaxvisible)
        {
            document.getElementById('drivingFromDiv').innerHTML +=closelinks;
        }
        
        
        
        document.getElementById('drivingDirectionsDiv').style.height = h-95+"px";
         document.getElementById('drivingDirectionsDiv').style.width = w - 20+"px";
        document.getElementById('drivingDirectionsDiv').style.overflow = "scroll";
        var routediv = document.getElementById('routingDiv');
        routediv.style.width = w + 'px';
        routediv.style.height = h + 'px';
        minmaxvisible = true;
    }
    catch(e)
    {
        alert(e.message);
    }
}
          
function GetRouteToPlace( from, to )
{
    try
    {
        MDNGetVEMap().GetRoute(from,to,null,null,OnGotRoute);
    }
    catch(e)
    {
        alert(e.message);
    }
}

function OpenDrivingDirections( lat, lon )
{
    try
    {
        document.getElementById('drivingFromDiv').innerHTML="Place or address to drive from <input id=\"drivingFrom\" maxlength=\"250\" style=\"width:250\" />&nbsp;&nbsp;"
        document.getElementById('drivingFromDiv').innerHTML+="<a href='javascript:GetRouteToPlace( document.getElementById(\"drivingFrom\").value, new VELatLong("+lat+","+lon+"));'>Get directions</a>&nbsp;&nbsp;";
        document.getElementById('drivingFromDiv').innerHTML+="<a href='javascript:CloseDirections();'>Cancel</a><br>"
        document.getElementById('drivingFromDiv').innerHTML+="<font size=\"1\">You may enter a place anywhere in the U.S.  For places and addresses in Old Bridge, add <i>,Old Bridge,NJ</i> at the end.</font><br><br>";
         document.getElementById('routingDiv').style.height="50px";
        document.getElementById('routingDiv').style.display="block";
        
    }
    catch(e)
    {
        alert(e.message);
    }
}



//// this is used when in VE mode to repostion the map programatically
//// called by an indentify feature hyperlink click (zoom-to)
function ZoomToPlace(lat, lon, zl, shapeID)
{
    try
    {
        MDNGetVEMap().SetCenterAndZoom(new VELatLong(lat, lon), zl);
        MDNGetVEMap().ShowInfoBox(MDNGetVEMap().GetShapeByID(shapeID));
    }
    catch(e)
    {
        alert(e.message);
    }
}
function ClearSearchResults()
{
    if(searchLayer != null)
    {
        MDNGetVEMap().DeleteShapeLayer(searchLayer);
        
    }
    if(document.getElementById('SearchResultsGrid') != null){
    
    
        document.getElementById('SearchResultsGrid').style.display="none";
    
    }
    if(document.getElementById('PlacesSearchResults') != null)
    {
        document.getElementById('PlacesSearchResults').innerHTML = "";
        document.getElementById('SearchResultsNote').innerHTML = "Please enter a search above to get search results."
        searchLayer = null;
    }
    
}
//// find places near Old Bridge
var moreIndex;
var searchLayer;
function FindPlaces(n)      
{
    
    moreIndex = n;
    var FindPlacesCallback = function(a,b,c,d,e) 
            {
                try
                {
                    var results="<p align=\"left\">";
                    if (b != null && b.length > 0)         
                    {            
                        document.getElementById('SearchResultsNote').innerHTML = "<br/><a href='javascript:ClearSearchResults();'>Clear Results</a>"
                        for (x=0; x<b.length; x++)            
                        {       
                            var currentPoint="";        
                            var lat=b[x].LatLong.Latitude;
                            var lon=b[x].LatLong.Longitude;
			                currentPoint+="<br>";
                            currentPoint+="<a href='javascript:ZoomToPlace("+lat+","+lon+",19,\""+b[x].shape.GetID()+"\");'>";
                            currentPoint+=b[x].Name+"</a><br>";
			                if (b[x].Description != null)
				                currentPoint += b[x].Description + "\n";
			                if (b[x].Phone != null)
				                currentPoint += b[x].Phone + "\n";
			                currentPoint+="<br>";
			                currentPoint+="<a href='javascript:OpenDrivingDirections("+lat+","+lon+");'>";
                            currentPoint+="<font size='1'>Get Driving Directions</font></a><br>";
			                currentPoint+="<br>";
			                
			                results += currentPoint;
			                //b[x].shape.SetTitle(b[x].Name)
            			    

                        }            
                    }
                    else
                    {
                        results+="<p align=\"center\">No Search Results</p>";
                    }
                    
                   
                    results+="</p>";
                    
                    if (moreIndex)
                    results += "<a href='#' onclick='javascript:FindPlaces(moreIndex-10);'>Previous</a>&nbsp;&nbsp;&nbsp;";
                    else
                        results += "Previous&nbsp;&nbsp;&nbsp;";
                        
                    if (d)
                        results += "<a href='#' onclick='javascript:FindPlaces(moreIndex+10);'>Next</a>";
                    else
                        results += "Next";
                    
                    document.getElementById('PlacesSearchResults').innerHTML=results;  
                    COMactivePanelId="SearchResultsView";
                   
                    COMToggleContentPanel();  
                            
                }
                catch(e)
                {
                    alert(e.message);
                }
                    
                
                    
                
            };
    try
    {
        var st = document.getElementById('searchTypeId');
        var psr = document.getElementById('PlacesSearchResults');
        if (psr) psr.innerHTML="";
        if (st.value == "tab0")
        {
            try
            {       
                var tb = document.getElementById('SearchTextBox');   
                
		        MDNGetVEMap().Clear();
		        MDNGetVEMap().SetZoomLevel('12');
		        if(searchLayer == null)
		        {
		            searchLayer = new VEShapeLayer();
		            searchLayer.SetTitle("SearchLayer");
		            MDNGetVEMap().AddShapeLayer(searchLayer);
		        }else
		        {
		            searchLayer.DeleteAllShapes();
		        }
		        if(document.getElementById('SearchResultsGrid') != null){
    
    
                document.getElementById('SearchResultsGrid').style.display="none";
    
                }
		        
		        // TODO: currently, with no 'where' set, if you are zoomed in to a map extent you have less of a chance of getting a result.
		        MDNGetVEMap().Find(tb.value, null, null, searchLayer, n, 20, true, true, true, true, FindPlacesCallback);
            }         
            catch(e)         
            {            
                alert(e.message);         
            }
            return false;
        }
        return true;
    }
    catch(e)
    {
        alert(e.message);
    }
}


      
//// this is used when in VE mode to repostion the map programatically
//// called by an indentify feature hyperlink click (zoom-to)
function COMZoomToFeature(lat, lon, zl)
{
    MDNGetVEMap().SetCenterAndZoom(new VELatLong(lat, lon), zl);
}

// get map area width
function COMGetMapWidth()
{
    var c = document.getElementById('InfoCell');
    return MDNGetClientWidth() - parseInt(c.style.width);
    //return MDNGetClientWidth() - c.offsetWidth);
}

// get map area height
function COMGetMapHeight()
{
    var mh = 1;
    var ch = 0;

    var h = document.getElementById('headerDIV');
    if (h && h.style && h.style.height)
    {
        mh += parseInt(h.style.height);
    }
    
    ch = mh;
    
    var sb = document.getElementById('searchBarDiv');
    //if (sb && sb.style && sb.style.height)
    if (sb)
    {
        ch += sb.offsetHeight;
    }

    var cd = document.getElementById('contentDiv');    
    if (cd)
    {
        cd.style.height = (MDNGetClientHeight() - ch) + "px";
    }
    
    COMToggleContentPanel();
    
    var logo = document.getElementById('MDNSLogo');
    if (logo)
    {
        logo.style.top = (MDNGetClientHeight() - 40) + "px";
    }

    COMACMaxHeight = (MDNGetClientHeight() - ch - 30);
    
    return MDNGetClientHeight() - mh;
}

var COMTabdescs = new Array("Enter a place type or name", "Enter an address", "Enter a parcel id");

function COMSelectSearchTab(tabid)
{
    var st = document.getElementById('searchTypeId');
    var tb = document.getElementById('SearchTextBox');
    
    var tabs = new Array(
        document.getElementById('tab0'),
        document.getElementById('tab1'),
        document.getElementById('tab2'));
    
    ClearSearchResults();
    if(tabid == 'tab0')
    {
        document.getElementById('SearchResultsNote').style.display="block";
    }
    else
    {
        document.getElementById('SearchResultsNote').style.display="none";
    }
    if (st) st.value = tabid;
    
    for (var ii=0; ii<tabs.length; ii++)
    {
        if (tabs[ii].id == tabid)
        {
            tabs[ii].className = "TabHeaderSel";
            tb.value = COMTabdescs[ii];      
        }
        else
        {
            tabs[ii].className = "TabHeader";
        }
    }
    tb.focus();
}

function COMClearSearchTextBox()
{
    var tb = document.getElementById('SearchTextBox');
    
    if (tb)
    {
        for (ii in COMTabdescs)
        {
            if (COMTabdescs[ii] == tb.value) 
            {
     
                tb.value = "";
                return;
            }
        }
    }
}

// AutoComplete stuff 

var selIdx = -1;
var acTimer;
var cancelHide = false;
var cancelAC = false;

function COMSearchKeyDown(ev)
{
    if (acTimer) 
    {
        clearTimeout(acTimer);
        acTimer = null;
    }

    // just in case, clear out
    cancelAC = false;

	ev = (ev) ? ev : ((event) ? event : null);

	var acd = document.getElementById("AutoCompleteDiv");

	var k = ev.keyCode ? ev.keyCode : ev.rawEvent.keyCode;

	if (k === 27)
	{
		acd.style.display = "none";
		
		return false;
	}
	else if (k == 38) // up
	{
		if (selIdx > 0)
		{
			selIdx--;
			COMHighlightACOption();
		}
		
		return false;
	}
	else if (k == 40) //down
	{
		if (selIdx < acd.childNodes.length-1)
		{
			selIdx++;
			COMHighlightACOption();
		}
		
		return false;
	}
	else if (k == 13) // enter
	{
        if (FindPlaces(0)) // if we're on the places tab, find places--returns TRUE if we should handle enter otherwise
        {        
            // if we fail don't have ac list, we have submitted what is in the text box
            // cancel an AC 
	        if (!GrabAutoCompleteVal()) cancelAC = true;
        }
	    return false;
	}
	else
	{
	    acTimer = window.setTimeout("COMDoAutoCompleteCallback()", 500);
	}
	
	return true;
}

function COMDoAutoCompleteCallback()
{
    var stb = document.getElementById("SearchTextBox")
    var stid = document.getElementById('searchTypeId');
    if (stb.value.length > 3)
    {
        CallbackMethods.AutoCompleteCallback(stid.value,stb.value,COMAutoCompleteCallbackHandler);
    }
	else COMHideAutoComplete();
}

function COMAutoCompleteCallbackHandler(state)
{

    if (state.RedirectUrl && state.RedirectUrl.length>0)
    {
        window.location = state.RedirectUrl;
    }

    if (!cancelAC && state.Html && state.Html != "")
    {
        selIdx = -1;
        var acd = document.getElementById("AutoCompleteDiv");
        var stb = document.getElementById("SearchTextBox");
        var sbc = document.getElementById("SearchBoxTable");
        acd.style.left = sbc.offsetLeft + "px";
	    acd.style.width = stb.style.width;
        acd.innerHTML = state.Html;
        acd.scrollTop = 0;

        //alert(acd.childNodes.length + ' ' + acd.childNodes[0].offsetHeight + ' ' + COMACMaxHeight);
        if (acd.childNodes.length * 25 > COMACMaxHeight) 
        {
            acd.style.height = COMACMaxHeight + "px";
        }
        else 
        {   
            acd.style.height = "";
        }
        
   	    acd.style.display = "block";
    }
    else
    {
        COMHideAutoComplete();
        
        if (state.Error)
        {
            alert(state.Error);
        }

    }
}

function COMHideAutoComplete()
{
    // clear out
    cancelAC = false;

    if (!cancelHide)
    {
	    var acd = document.getElementById("AutoCompleteDiv");
	    acd.style.display = "none";
   	    acd.innerHTML = "";
   	    selIdx = -1;
   	}
   	else cancelHide = false;
}

function COMHighlightACOption()
{
	var acd = document.getElementById("AutoCompleteDiv");
	var children = acd.childNodes;

	for (var i = 0; i < children.length; i++) 
	{
		var child = children[i];
		if (selIdx == i)
		{
			child.className = "AutoCompleteMenuItemSelect"
			
			if (child.offsetTop < acd.scrollTop) 
			    acd.scrollTop = child.offsetTop;
			else if (child.offsetTop + child.offsetHeight > acd.scrollTop + acd.offsetHeight) 
			    acd.scrollTop += (child.offsetTop + child.offsetHeight) - (acd.scrollTop + acd.offsetHeight);
	    }
		else if (child.className != "AutoCompleteMenuItem")
			child.className = "AutoCompleteMenuItem"		
	}
}

function COMMouserOverACOption(idx)
{
	selIdx = idx;
	COMHighlightACOption();
}

// Progress Image Stuff
function COMBeginRequestHandler(sender, args)
{
     var d = document.getElementById("ProgressImageDiv");
     if (d) d.style.display = "inline";
}

function COMEndRequestHandler(sender, args)
{
     var d = document.getElementById("ProgressImageDiv");
     if (d) d.style.display = "none";
}

function COMBufferSizeCheck()
{
    var tb = document.getElementById("ExportBufferTextBox"); 
    var defval = 150;
    
    if (tb)
    {
        if (isNaN (tb.value))
        {
            alert ("Buffer must be number");
            tb.value = defval;
        }
 
        var val = parseInt(tb.value);
        
        if (val <= 0 || val > 1000)
        {
            alert ("Buffer must be greater than zero and less than 1000");
            tb.value = defval;       
        }
 
    }
}

// js for details ddl

function COMToggleDetailsDDL()
{
    document.detachEvent("onclick", COMHideDetailsDDL);

    var dh = document.getElementById("DetailsList");
    var ddl = document.getElementById("DropPanel");
    ddl.style.left = dh.offsetLeft + "px";
    ddl.style.display = "block";
    
    window.setTimeout("document.attachEvent('onclick', COMHideDetailsDDL);", 100);
}

function COMHideDetailsDDL()
{
   var ddl = document.getElementById("DropPanel");
    
   if (ddl) ddl.style.display = "none";
 
   document.detachEvent("onclick", COMHideDetailsDDL);
}

var COMactivePropertyDetailId = "ZoningView";
var COMdetailTitles = new Array('Zoning','Property',"Add'l Property Info",'Sales & Taxes','Exemptions','City Information');
function COMShowPropertyDetail()
{
   var ddl = document.getElementById('DropPanel');
   if (ddl) ddl.style.display = 'none';
   var active = document.getElementById(COMactivePropertyDetailId);
   if (!active) return;
   var views = new Array(document.getElementById("ZoningView"),
       document.getElementById("PropertyView"),
       document.getElementById("AddlPropView"),
       document.getElementById("SalesTaxesView"),
       document.getElementById("ExemptionsView"),
       document.getElementById("CityInfoView"));
   for (var ii=0; ii<views.length; ii++)
   {
       if (views[ii] == active)
       {
           active.style.display = "block";
           document.getElementById("DetailTitle").innerHTML = COMdetailTitles[ii];
       }
       else views[ii].style.display = "none";
   }
}

function COMToggleContentPanel() 
{
    var contentDiv = document.getElementById("contentDiv");
    var activePanel = document.getElementById(COMactivePanelId);
    
    var AboutHeader = document.getElementById("AboutHeader");
    var AboutView = document.getElementById("AboutView");
    var WelcomeHeader = document.getElementById("WelcomeHeader");
    var WelcomeView = document.getElementById("WelcomeView");
    
    if (activePanel && AboutView == activePanel) {activePanel.style.display = "block";AboutHeader.style.fontWeight="bold";findinprogress = false;} 
    else {AboutView.style.display = "none";AboutHeader.style.fontWeight="normal";}
    if (activePanel && WelcomeView == activePanel) {activePanel.style.display = "block";WelcomeHeader.style.fontWeight="bold";findinprogress = false;} 
    else {WelcomeView.style.display = "none";WelcomeHeader.style.fontWeight="normal";} 
    
    var SearchResultsHeader = document.getElementById("SearchResultsHeader");
    var SearchResultsView = document.getElementById("SearchResultsView");
    if (activePanel && SearchResultsView == activePanel) {activePanel.style.display = "block";SearchResultsHeader.style.fontWeight="bold";findinprogress = false;} 
    else {SearchResultsView.style.display = "none";SearchResultsHeader.style.fontWeight="normal";} 
    
    var PropertyDetailsHeader = document.getElementById("PropertyDetailsHeader");
    var PropertyDetailsView = document.getElementById("PropertyDetailsView");
    if (activePanel && PropertyDetailsView == activePanel) {activePanel.style.display = "block";PropertyDetailsHeader.style.fontWeight="bold";findinprogress = false;} 
    else {PropertyDetailsView.style.display = "none";PropertyDetailsHeader.style.fontWeight="normal";} 
    
    var LayersHeader = document.getElementById("LayersHeader");
    var LayersView = document.getElementById("LayersView");
    if (activePanel && LayersView == activePanel) {activePanel.style.display = "block";LayersHeader.style.fontWeight="bold";findinprogress = false;} 
    else {LayersView.style.display = "none";LayersHeader.style.fontWeight="normal";} 
    
    var ExportHeader = document.getElementById("ExportHeader");
    var ExportView = document.getElementById("ExportView");
    if (activePanel && ExportView == activePanel) {activePanel.style.display = "block";ExportHeader.style.fontWeight="bold";findinprogress = false;} 
    else {ExportView.style.display = "none";ExportHeader.style.fontWeight="normal";} 
    if (activePanel) {activePanel.style.height = (parseInt(contentDiv.style.height)  - WelcomeHeader.offsetHeight - AboutHeader.offsetHeight - SearchResultsHeader.offsetHeight - PropertyDetailsHeader.offsetHeight - LayersHeader.offsetHeight - ExportHeader.offsetHeight) + 'px';}
}