    var routeExec = new MQExec(routeServerName,mqServerPath,mqServerPort,proxyServerName,proxyServerPath,proxyServerPort);
    var searchExec = new MQExec(spatServerName,mqServerPath,mqServerPort,proxyServerName,proxyServerPath,proxyServerPort);
    
    var origStateOptions = new stateOptions(); 
    var destStateOptions = new stateOptions();  

    var origAddress = null;
    var destAddress = null;
    var origGaCollection = null;
    var destGaCollection = null;
    var geoOrig = null;
    var geoDest = null;
    var origErrorDivNeedsReset = false;
    var origFormDivNeedsReset = false;
    
    var ORIG_LEGEND = document.createElement("legend");
    ORIG_LEGEND.appendChild(document.createTextNode("Where are you now?"));
    ORIG_LEGEND.appendChild(document.createElement("p"));
    var DEST_LEGEND = document.createElement("legend");
    DEST_LEGEND.appendChild(document.createTextNode("Where are you going?"));
    DEST_LEGEND.appendChild(document.createElement("p"));
       
    function geocodeAddressesFromForm()
    {
        origGaCollection = new MQLocationCollection();
        geoOrig = geocodeAddress(origAddress, origGaCollection);        
        
        destGaCollection = new MQLocationCollection();
        geoDest = geocodeAddress(destAddress, destGaCollection);
        mapTripPath();       
    }     
    
    function validateOriginAndDestination()
    { 
        // See if origin is valid/complete
        if ( geoOrig == "LOCATION_NOT_FOUND" ||  geoOrig == "LOCATION_NOT_EXACT")
        {
            document.getElementById("origErrorMessage").innerHTML = UNKNOWN_LOCATION;
            origErrorDivNeedsReset = true;
            return false;
        }
        else if ( geoOrig == "LOCATION_AMBIGUOUS" )
        {
            showSelectFromMultipleGeocodeResults("tripOrigin", origAddress, origGaCollection, "orig");
            origFormDivNeedsReset = true;
            return false;
        }
        
        // See if we need to adjust previous changes to origin UI
        if ( origErrorDivNeedsReset )
        {
            document.getElementById("origErrorMessage").innerHTML = '';
            origErrorDivNeedsReset = false;
        } 
        else if ( origFormDivNeedsReset )
        {
            var origDiv = document.getElementById("tripOrigin");
            removeAllChildren(origDiv);
            
            var fieldset = document.createElement("fieldset");
            fieldset.className = "tripOrigin";
            
            fieldset.appendChild(ORIG_LEGEND);
            
            fieldset.appendChild(document.createTextNode(geoOrig.getStreet()));
            fieldset.appendChild(document.createElement("br")); 
            fieldset.appendChild(document.createTextNode(geoOrig.getCity() + ", " + geoOrig.getState() + "   " + geoOrig.getPostalCode()));
            fieldset.appendChild(document.createElement("br")); 
            fieldset.appendChild(document.createTextNode(geoOrig.getCountry()));
           
            origDiv.appendChild(fieldset);
            
            origFormDivNeedsReset = false;
        }

        // See if destination is valid/complete        
        if ( geoDest == "LOCATION_NOT_FOUND" ||  geoDest == "LOCATION_NOT_EXACT")
        {
            document.getElementById("destErrorMessage").innerHTML = UNKNOWN_LOCATION;
            return false;
        }
        else if ( geoDest == "LOCATION_AMBIGUOUS" )
        {
            showSelectFromMultipleGeocodeResults("tripDestination", destAddress, destGaCollection, "dest");
            return false;
        }
    }

    function mapTripPath()  
    {        
        if( validateOriginAndDestination() == false )
        {
            return false;
        }
        
        var headerDiv = document.getElementById('tripMapHeader');
        removeAllChildren(headerDiv);
        fromSpan = document.createElement("span");       
        fromSpan.appendChild(document.createTextNode("From: "));                
        addressToString(geoOrig, fromSpan);
        headerDiv.appendChild(fromSpan);
        headerDiv.appendChild(document.createElement("br"));
        toSpan = document.createElement("span");       
        toSpan.appendChild(document.createTextNode("To: "));                
        addressToString(geoDest, toSpan);
        headerDiv.appendChild(toSpan);
        
        var newSearchLink = document.createElement('a');
        newSearchLink.href = newSearchUrl;
        newSearchLink.id = "locatorResultsNewSearchLink";
        var newSearchImg = document.createElement('img');
        newSearchImg.src = newSearchButtonUrl;
        newSearchImg.id = "locatorResultsNewTripImg";
        newSearchLink.appendChild(newSearchImg);
  
        headerDiv.appendChild(newSearchLink);
        
        myMap = startMap('tripMap');
        
        myPoiEvents = new poiEvents(myMap);
        
        //Build Session Object
        var session = new MQSession();

        //Build object to store Route Results
        var routeRes = new MQRouteResults();

        //Build Waypoints Location Collection
        var wayPoints = new MQLocationCollection();

        //Build bounding box for Route
        var myBB = new MQA.RectLL(new MQLatLng(),new MQLatLng());

        //Add origin and destination to waypoints
        wayPoints.add(geoOrig);
        wayPoints.add(geoDest);

        //Build Route Options
        var routeOpt = new MQRouteOptions();
        //Set Maximum Shapoints per Maneuver
        routeOpt.setMaxShapePointsPerManeuver(MAX_SHAPE_POINTS);

        //Create Session and Store Session Id
        var sessId = routeExec.createSessionEx(session);

        //Perform Route
        routeExec.doRoute(wayPoints, routeOpt, routeRes, sessId, myBB);

        //Add Route Highlight to Map
        myMap.addRouteHighlight(myBB,"http://map.access.mapquest.com",sessId,true);
            
        var trekRtColl = routeRes.getTrekRoutes();
        var maneuverColl = trekRtColl.get(0).getManeuvers();
        var maneuversDiv = document.createElement("div");
        maneuversDiv.className = "tripManeuversDiv";
     
        var mHeaderDiv = document.createElement("div");
        mHeaderDiv.className = "roundCorner";
        mHeaderDiv.style.background="#000000";
        
        var mHeaderContentDiv = document.createElement("div");
        mHeaderContentDiv.className = "roundCornerContent";
                        
        var mHeaderLeft = document.createElement("div");
        mHeaderLeft.className = "locFirstColumn white";               
        mHeaderLeft.appendChild(document.createTextNode("Driving Directions"));
        
        var mHeaderMiddle = document.createElement("div");
        mHeaderMiddle.className = "locMiddleColumnDirections white";
        mHeaderMiddle.appendChild(document.createTextNode("Distance")); 
               
        var mHeaderRight = document.createElement("div");
        mHeaderRight.className = "locLastColumn white";    
        mHeaderRight.appendChild(document.createTextNode("Time"));

        mHeaderContentDiv.appendChild(mHeaderLeft);
        mHeaderContentDiv.appendChild(mHeaderMiddle);   
        mHeaderContentDiv.appendChild(mHeaderRight);
        
        mHeaderDiv.appendChild(mHeaderContentDiv);
        
        maneuversDiv.appendChild(mHeaderDiv); 

        var maneuversPrintList = document.createElement("ul");   
        maneuversPrintList.className = "tripManeuversPrintList";     
        var maneuversPrintHeader = document.createElement("li");

        maneuversPrintHeader.innerHTML = mHeaderDiv.innerHTML;
        maneuversPrintList.appendChild(maneuversPrintHeader);
        
        for (i=0; i < maneuverColl.getSize(); i++)
        {
            var mManeuverDiv = document.createElement("div");
	        mManeuverDiv.className = "roundCorner";
	        mManeuverDiv.style.background="#999999";
	        
	        var mManeuverContentDiv = document.createElement("div");
	        mManeuverContentDiv.className = "roundCornerContent";
	        
	        var mManeuverLeft = document.createElement("div");
	        mManeuverLeft.className = "locFirstColumn";               
	        mManeuverLeft.appendChild(document.createTextNode( (i+1) + ". " + maneuverColl.get(i).getNarrative()));
	        
	        var mManeuverMiddle = document.createElement("div");
	        mManeuverMiddle.className = "locMiddleColumnDirections";
	        mManeuverMiddle.appendChild(document.createTextNode(Math.round(maneuverColl.get(i).getDistance()*100)/100 + " mi")); 
	               
	        var mManeuverRight = document.createElement("div");
	        mManeuverRight.className = "locLastColumn";    
	        mManeuverRight.appendChild(document.createTextNode(formatTimeFromSeconds(maneuverColl.get(i).getTime())));
	
	        mManeuverContentDiv.appendChild(mManeuverLeft);
	        mManeuverContentDiv.appendChild(mManeuverMiddle);   
	        mManeuverContentDiv.appendChild(mManeuverRight);

			mManeuverDiv.appendChild(mManeuverContentDiv);
			
	        maneuversDiv.appendChild(mManeuverDiv);    
	        
	        var maneuversPrintRow = document.createElement("li"); 
	        maneuversPrintRow.className = "tripManeuversPrintList";
            maneuversPrintRow.innerHTML = mManeuverDiv.innerHTML;
            maneuversPrintList.appendChild(maneuversPrintRow);                      
        }
        
        var mFooterDiv = document.createElement("div");
        mFooterDiv.className = "roundCorner";
        mFooterDiv.style.background="#000000";      
       
        var mFooterContentDiv = document.createElement("div");
        mFooterContentDiv.className = "roundCornerContent";
        
        var mFooterLeft = document.createElement("div");
        mFooterLeft.className = "locFirstColumnNumber white bold";               
        mFooterLeft.appendChild(document.createTextNode("Total: "));
        
        var mFooterMiddle = document.createElement("div");
        mFooterMiddle.className = "totalDistanceColumn white bold";
        mFooterMiddle.appendChild(document.createTextNode(Math.round(routeRes.getDistance()*100)/100 + " mi "));
        
        var mFooterRight = document.createElement("div");
        mFooterRight.className = "totalTimeColumn white bold";
        mFooterRight.appendChild(document.createTextNode(formatTimeFromSeconds(routeRes.getTime())));

        mFooterContentDiv.appendChild(mFooterLeft);
        mFooterContentDiv.appendChild(mFooterMiddle);   
        mFooterContentDiv.appendChild(mFooterRight);
        
        mFooterDiv.appendChild(mFooterContentDiv);
        
        maneuversDiv.appendChild(mFooterDiv); 
        
        var maneuversPrintFooter = document.createElement("li");
        maneuversPrintFooter.className = "tripManeuversPrintList"; 
        maneuversPrintFooter.innerHTML = mFooterDiv.innerHTML;
        maneuversPrintList.appendChild(maneuversPrintFooter);

        var tripDirections = document.createElement("div");
        tripDirections.id = "tripDirections";
        tripDirections.appendChild(maneuversDiv);
        tripDirections.appendChild(maneuversPrintList);

        //Build start/end poi markers
        var startPoi = new MQA.Poi(geoOrig.getMQLatLng());          
        startPoi.setKey("start");
        startPoi.setInfoTitleHTML("Start");
        startDiv = document.createElement("div");
        addressToString(geoOrig, startDiv);
        startPoi.setInfoContentHTML(startDiv.innerHTML);
        //Add Poi to Map
        myMap.addPoi(startPoi);

        var endPoi = new MQA.Poi(geoDest.getMQLatLng());
        endPoi.setKey("end");
        endPoi.setInfoTitleHTML("End");
        endDiv = document.createElement("div");
        addressToString(geoDest, endDiv);
        endPoi.setInfoContentHTML(endDiv.innerHTML);
        myMap.addPoi(endPoi);

        //Retrieve Route Shapepoints from Route Results
        var searchLatLngs = routeRes.getShapePoints();
        
        if (searchLatLngs)
        {
            if (searchLatLngs.getSize() >= 2)
            {
                //Build search critera for corridor search
                var criteria = new MQCorridorSearchCriteria();
                //Set Shapepoints
                criteria.setShapePoints(searchLatLngs);
                //Set distance from route
                var searchRadius = 1.0;
                var corridorWidthSel = document.getElementById("corridorWidthSel");
                if ( corridorWidthSel != null ){ searchRadius = corridorWidthSel.options[corridorWidthSel.selectedIndex].value; }
                if ( searchRadius == null || searchRadius == 0 ) { searchRadius = 1.0; }
                criteria.setCorridorWidth(searchRadius, new MQDistanceUnits(MQCONSTANT.MQDISTANCEUNITS_MILES));
                //Set the corridor search generalization
                criteria.setCorridorBufferWidth(searchRadius/8, new MQDistanceUnits(MQCONSTANT.MQDISTANCEUNITS_MILES));
                //Set the flag for using the generalization
                criteria.setCorrExactLinks(false);
                //Set the maximum number of results
                criteria.setMaxMatches(1000);

                //Create Database Query Collection and Add Database Query to Collection
                var dbLayerQueryCollection = new MQDBLayerQueryCollection();
                var dbLayerQuery = new MQDBLayerQuery();
                dbLayerQuery.setDBLayerName(MQDB);
                dbLayerQueryCollection.add(dbLayerQuery);

                var searchFeatures = new MQFeatureCollection();
                var dtCollection = new MQDTCollection();
                var searchRes = new MQFeatureCollection();
                
                //Perform Search
                searchExec.search(criteria, searchRes, "", dbLayerQueryCollection,  searchFeatures, dtCollection);
                    
                //If get results from search create collection of location ids from result keys
                var results;
                if(searchRes.getSize() > 0 )
                {
                    var recordset = new MQRecordSet();
                    var ids = new MQStringCollection();
                    for(var i=0; i < searchRes.getSize(); i++)
                    {
                        ids.add(searchRes.getAt(i).getKey());
                    }

                    //Retrieve record set for each id in the results
                    var fields = new MQStringCollection();
    
                    //Create Database Query Collection and Add Database Query to Collection
                    var dbLayerQueryCollection = new MQDBLayerQueryCollection();
                    var dbLayerQuery = new MQDBLayerQuery();
                    dbLayerQuery.setDBLayerName(MQDB);
                    dbLayerQueryCollection.add(dbLayerQuery);
    
                    searchExec.getRecordInfo(fields, dbLayerQuery, recordset, ids);
                    results = getResultsAsArray(recordset, searchRes, false);
                }
        
                var locationsDivList = buildStoreLocationsDivList(results, myPoiEvents);        
                var sonicLocations = document.createElement("div");
                sonicLocations.id = "sonicLocations";
                sonicLocations.appendChild(locationsDivList);
                sonicLocations.style.display = "none";       

        
                //Best-Fit the map to the results
                myMap.bestFit();
        
                var sonicLocationsDivTab = document.createElement("div");
                sonicLocationsDivTab.id = "sonicLocationsDivTab";
                sonicLocationsDivTab.onclick = showTab;
                sonicLocationsDivTab.appendChild(document.createTextNode(""));
        
                var drivingDirectionsDivTab = document.createElement("div");
                drivingDirectionsDivTab.id = "drivingDirectionsDivTab";
                drivingDirectionsDivTab.onclick = showTab;
                drivingDirectionsDivTab.appendChild(document.createTextNode(""));
                
                var tripResultTabs = document.createElement("div");
                tripResultTabs.id = "tripResultTabs";
                tripResultTabs.appendChild(drivingDirectionsDivTab);
                tripResultTabs.appendChild(sonicLocationsDivTab);
        
                var parent = document.getElementById('mapDataContainer');
                removeAllChildren(parent);
                parent.appendChild(tripResultTabs);
                parent.appendChild(sonicLocations);
                parent.appendChild(tripDirections);   
                
                roundCorners();      
            }
            else
            {
                var parent = document.getElementById('mapDataContainer');
                removeAllChildren(parent);
                var noTrip = document.createElement("div");
                noTrip.id = "noTrip";
                noTrip.style.align="center";
                noTrip.style.padding="20px";
                var noTripMsg = document.createElement("h2");
                noTripMsg.appendChild(document.createTextNode("Your trip's origin and destination appear to be the same location."));
                
                var noTripTJ = document.createElement("p");
                noTripTJ.appendChild(document.createTextNode("TJ: \"Remember... No matter where you go, there you are.\""));
                var noTripPete = document.createElement("p");
                noTripPete.appendChild(document.createTextNode("Pete: \"What a short strange trip its been.\""));
                noTrip.appendChild(noTripMsg);
                noTrip.appendChild(document.createElement("p"));
                noTrip.appendChild(noTripTJ);
                noTrip.appendChild(noTripPete);

				parent.appendChild(document.createElement("br"));
                parent.appendChild(noTrip);
                parent.appendChild(document.createElement("br"));
                parent.appendChild(document.createElement("br"));
                parent.appendChild(document.createElement("br"));
                parent.appendChild(document.createElement("br"));
            }
        }
    }
    
    function showTab(e)
    {
        var divId = this.id;
        
        if ( divId == "sonicLocationsDivTab" )
        {
            document.getElementById("sonicLocations").style.display="";
            document.getElementById("tripDirections").style.display="none";
        }
        else if ( divId == "drivingDirectionsDivTab" )
        {
            document.getElementById("sonicLocations").style.display="none";
            document.getElementById("tripDirections").style.display="";
        }
    }    
    
    function resetAddress(idx, origOrDest)
    {
         if ( origOrDest == "orig" )
        {
            geoOrig = origGaCollection.getAt(idx);
            origAddress.setStreet(geoOrig.getStreet());
            origAddress.setCity(geoOrig.getCity());
            origAddress.setState(geoOrig.getState());
            origAddress.setPostalCode(geoOrig.getPostalCode());       
            origAddress.setCountry(geoOrig.getCountry());
        }
        else
        {
            geoDest = destGaCollection.getAt(idx);
            destAddress.setStreet(geoDest.getStreet());
            destAddress.setCity(geoDest.getCity());
            destAddress.setState(geoDest.getState());
            destAddress.setPostalCode(geoDest.getPostalCode());       
            destAddress.setCountry(geoDest.getCountry());
        }
        mapTripPath();
    }        

    function showSelectFromMultipleGeocodeResults(parentDiv, address, gaCollection, origOrDest)
    {
        var ol = document.createElement("ol");
        ol.className = 'ambiguousMapResults';
        for (var i=0; i < gaCollection.getSize(); i++)
        {
            var addr = gaCollection.getAt(i);
            var li = document.createElement("li");
            var a = document.createElement("a");
            var href = "javascript:resetAddress(";
            href  += "\"" + i + "\", ";
            href  += "\"" + origOrDest + "\");";
            a.href = href;
            
            if ( origOrDest == "orig" )
            {
                //a.appendChild(document.createTextNode("Set the starting address to: "));
            }
            else
            {
                //a.appendChild(document.createTextNode("Set the destination address to: "));
            }
            //var addrDiv = document.createElement("div");
            //addrDiv.className = "addressMultiLine";
            addressToString(addr, a);
            li.appendChild(a);
            li.appendChild(document.createElement("p"));
            ol.appendChild(li);
        }
                    
                    
        var fieldset = document.createElement("fieldset");                      
        if ( origOrDest == "orig" )
        {
            fieldset.className = "tripOrigin";     
            fieldset.appendChild(ORIG_LEGEND);            
        }
        else
        {
            fieldset.className = "tripDestination";
            fieldset.appendChild(DEST_LEGEND);       
         }
        
        var ManeuverDiv = document.createElement("div");
        headerDiv.className = "error";
        headerDiv.style.width = "250px";
        var h2 = document.createElement("h2");
        h2.appendChild(document.createTextNode("Multiple Locations Found:"));
        headerDiv.appendChild(h2);
        headerDiv.appendChild(document.createTextNode("Cannot find an exact match for " + address.getStreet() + ", " + address.getCity() + ", " + address.getState() + ". But similar addresses were found. Select one of these addresses or start a new search."));

        fieldset.appendChild(headerDiv);
        fieldset.appendChild(ol);

        var parent = document.getElementById(parentDiv);
        removeAllChildren(parent);
        parent.appendChild(fieldset);        
    }

   /*
    *  geocodes the origin of the search, and call search function
    */
    function getResultsForForm() {
        // clear out any error messages from previous attempts
        var origErr = document.getElementById("origErrorMessage"); 
        origErr.innerHTML ="";
        
        var destErr = document.getElementById("destErrorMessage"); 
        destErr.innerHTML ="";
            
        //geocode the origin address
        origAddress = new MQAddress();
        origAddress.setStreet(document.getElementById("origStreet1").value);
        origAddress.setCity(document.getElementById("origCity").value);
        var stateSel  = document.getElementById("origStateList");
        origAddress.setState(stateSel.options[stateSel.selectedIndex].value);
        origAddress.setPostalCode(document.getElementById("origPostalcode").value);
        var countrySel = document.getElementById("origCountryList");
        origAddress.setCountry(countrySel.options[countrySel.selectedIndex].value);

        //geocode the destination address
        destAddress = new MQAddress();
        destAddress.setStreet(document.getElementById("destStreet1").value);
        destAddress.setCity(document.getElementById("destCity").value);
        var stateSel  = document.getElementById("destStateList");
        destAddress.setState(stateSel.options[stateSel.selectedIndex].value);
        destAddress.setPostalCode(document.getElementById("destPostalcode").value);
        var countrySel = document.getElementById("destCountryList");
        destAddress.setCountry(countrySel.options[countrySel.selectedIndex].value);
                
        geocodeAddressesFromForm();
    }
        
    function getDirections()
    {
        var qs = new Querystring();

        if ( qs.length() > 0 )
        {
	        var ostr = unescape(qs.get('ostr'));
	        var oci = unescape(qs.get('oci'));
	        var osta = unescape(qs.get('osta'));
	        var oz = unescape(qs.get('oz'));
	        var oco = unescape(qs.get('oco', "US"));
	        
	        var dstr = unescape(qs.get('dstr'));
	        var dci = unescape(qs.get('dci'));
	        var dsta = unescape(qs.get('dsta'));
	        var dz = unescape(qs.get('dz'));
	        var dco = unescape(qs.get('dco', "US"));
	        
	        origAddress = new MQAddress();
	        if ( ostr != null ) { origAddress.setStreet(ostr); }
	        if ( oci != null ) { origAddress.setCity(oci); }
	        if ( osta != null ) { origAddress.setState(osta); }
	        if ( oz != null ) { origAddress.setPostalCode(oz); }
	        if ( oco != null ) { origAddress.setCountry(oco); }   
	        
	        destAddress = new MQAddress();
	        if ( dstr != null ) { destAddress.setStreet(dstr); }
	        if ( dci != null ) { destAddress.setCity(dci); }
	        if ( dsta != null ) { destAddress.setState(dsta); }
	        if ( dz != null ) { destAddress.setPostalCode(dz); }
	        if ( dco != null ) { destAddress.setCountry(dco); }      
	        
	        if ( ((oci != null && osta != null) || oz != null ) &&
	             ((dci != null && dsta != null) || dz != null )    )
	        {
                var parent = document.getElementById('mapDataContainer');
                removeAllChildren(parent);
	        	geocodeAddressesFromForm();
	        }
	        else
	        {
	        	window.location.replace(newTripSearchUrl);
	        	alert("We're sorry.  We couldn't map those inputs.  Please manually enter your search critera.");
	        }
        }
        else
        {
        	origStateOptions.stateListSwitch('origStateList', 'US'); 
        	destStateOptions.stateListSwitch('destStateList', 'US'); 
        }
     }