var MultimapAPI = 
  {
    objMap : null,
    objRoute : null,
    objRouteFinder : null,
    intInitialZoomLevel : 10,
    strRouteContainer : null,
    
    
    init : function(strApiKey, strElement, intInitialZoomLevel, blnShowZoom) {
      if(!MMIsSupportedBrowser()) {
        alert("Your browser currently does not support the multimap api.");
        return false;
      }
      if(strApiKey.length == 0) {
        alert("Multimap could not initalise as no api key was specified.");
        return false;
      }
      if(strElement.length == 0) {
        alert("Multimap could not initalise as no element to bind map to was specified.");
        return false;
      } 
      
      this.intInitialZoomLevel = intInitialZoomLevel;
      this.objMap = MMFactory.createViewer(document.getElementById(strElement));
     
      if(blnShowZoom) {
        var objTopRight = new MMBox(10, 10, undefined, undefined); 
        var objPanZoomWidget = new MMPanZoomWidget(objTopRight);
        this.objMap.addWidget(objPanZoomWidget);
      }
    },
    
    addMarker : function(strText, objPosition) {
      MultimapAPI.objMap.removeAllOverlays();
      var mapPosition;
      if (!objPosition) {
        mapPosition = MultimapAPI.objMap.getCurrentPosition();
      } else {
        mapPosition = objPosition;
      } 
      MultimapAPI.objMap.createMarker(objPosition, { zIndex: 0, 'text' : strText });
    },
    
    showRoute : function(objFromAddress, objToAddress, strContainer) {

      if(!strContainer) {
        alert("You must supply a container to render the route.");
        return false;
      }
      
      this.objRouteFinder = MMFactory.createRouteRequester(this.resultsLoaded, this.objMap);
       
      var arrLocations = new Array();      
      arrLocations.push(new MMLocation(objFromAddress));
      arrLocations.push(new MMLocation(objToAddress));
      
      this.strRouteContainer = strContainer;
      this.objRoute = new MMRoute(arrLocations);
      this.objRouteFinder.request(this.objRoute);       
    },  
    
    resultsLoaded : function() {
      MultimapAPI.objMap.goToPosition(MultimapAPI.objMap.getAutoScaleLocation(MultimapAPI.objRoute.bounds));  
      MultimapAPI.renderStages(MultimapAPI.strRouteContainer)
      var totalPolyLines = MultimapAPI.objRoute.polyLine.length;      
      for(var i = 0, totalPolyLines; i < totalPolyLines; ++i ) {
        MultimapAPI.objMap.addOverlay(MultimapAPI.objRoute.polyLine[i]);
      }
    },
    
    renderStages : function(strContainer) {
      var objStages = MultimapAPI.objRoute.stages;
      var objContainer = document.getElementById(strContainer);
      var strHtml = "";
      
      if(objContainer) {
        strHtml += "<p>Distance: <strong>" + MultimapAPI.objRoute.distance.miles + " mile(s), about ";
        if(MultimapAPI.objRoute.duration.days > 0) { strHtml += MultimapAPI.objRoute.duration.days + ' day(s) '; }
        if(MultimapAPI.objRoute.duration.hours > 0) { strHtml += MultimapAPI.objRoute.duration.hours + ' hour(s) '; }
        if(MultimapAPI.objRoute.duration.minutes > 0) { strHtml += MultimapAPI.objRoute.duration.minutes + ' minute(s) '; }
        strHtml += "</strong></p>";
        
        for (var stageCount = 0; stageCount < objStages.length; stageCount++) {
          var objSteps = objStages[stageCount].steps;
        
          strHtml += "<dl>";
          for (var stepCount = 0; stepCount < objSteps.length; stepCount++) {
          
            var strInstruction = "";
            strInstruction += objSteps[stepCount].instruction + " ";
            if((objSteps[stepCount].road_name) && (objSteps[stepCount].road_number)) {
              strInstruction += objSteps[stepCount].road_name + " (" + objSteps[stepCount].road_number + ")";
            } else if(objSteps[stepCount].road_name) {
              strInstruction += objSteps[stepCount].road_name;
            } else if(objSteps[stepCount].road_number) {
              strInstruction += objSteps[stepCount].road_number;
            }
            
            var intDistance = 0; 
            if (objSteps[stepCount].distance.miles > 0) { intDistance += objSteps[stepCount].distance.miles + ' mile(s) '; }
            
            strHtml += "<dt>";
            if(intDistance == 0) { 
              strHtml += "Finish"; 
            } else if(stepCount == 0) {
              strHtml += "Start";               
            } else { 
              strHtml += stepCount + ". for " + parseFloat(intDistance).toString() + " mile(s)";
            }
            strHtml += "</dt>";

            strHtml += "<dd>";            
            strHtml += strInstruction;
            strHtml += "</dd>";
            
            var objMarker = MultimapAPI.objMap.createMarker(objSteps[stepCount].start_point, { zIndex: stepCount, 'text' : stepCount + 1 });
            objMarker.setInfoBoxContent("<p>" + strInstruction + "</p>");
          }
          strHtml += "</dl>";
        }
        
        objContainer.innerHTML = strHtml;
      }
    },
    
    goToPositionByAddress : function(objAddress, blnAddMarker) {  
      MultimapAPI.objMap.goToPosition(new MMLocation(objAddress), this.intInitialZoomLevel);
    }
    
  };

