/*
 * 
 * Microsoft Map JQuery Plugin
 * @requires http://www.ncdot.gov/_css/jquerymmap.css
 * @requires jQuery v1.3
 * @requires http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2
 * 
 * NCDOT 2009
 *
 */

/*
  Settings Explaination:
  1. writeObjID - the html element id to which the map will be written
  2. startCoords - the centerpoint of the map
  3. startPin - default centerpoint pin, also has a directions to/from option
  4. mapStyle - choose between "a","r","h", and "o"
  5. zoom - starting zoom level
  6. miniMap - a minimap, contains starting settings, that uses css to position itself
  7. miniMapIDClasses - the css associated with the minimap
  8. returnFunc - callback function - can return 2 parameters:
        a. the map object
        b. null, unless a georss feed is used, then returns array of objects
           for each of the georss entries containing:
            1.title
            2.id (the id used by virtual earth to identify a shape)
            3.latitude
            4.longitude
            5.description
  9.pins - an array of objects for additional pins
        a. latitude
        b. longitude
        c. maxZoom
        d. minZoom
        e. title
        f. description
        g. icon (the file path)
        h. directions (get directions from/to a point)
  10.tiles - an array of objects for tile layers (overlays)
        a. id
        b. path
        c. maxZoom
        d. minZoom
        e. zIndex (css addition, sometimes the tiles are interfered with)
  11.geoRss - a georss feed option, the directions option turns directions on for points
  12.cluster - uses the default virtual earth clustering algorithm

*/

(function(){jQuery.mmap=function(settings){var settings=jQuery.extend(true,{writeObjID:null,startCoords:{latitude:null,longitude:null},startPin:{on:false,maxZoom:null,minZoom:null,title:"Main Map",description:null,icon:null,directions:false},mapStyle:"r",zoom:{start:12,max:null,min:null,best:0},miniMap:{on:false,zoomOffset:7,style:"r",title:"Main Map Center",description:"Double click to refocus main map.",icon:null},miniMapIDClasses:{parentClass:"mmWrapper",headerClass:"mmHeader",linkCloseClass:"mmCloseOpen",bodyClass:"mmBody"},returnFunc:null,pins:new Array(),tiles:new Array(),geoRss:{file:null,directions:false},cluster:{on:false,image:null,zoom:12,offset:13}},settings);var uniqueID=Math.floor(0+Math.random()*1000000000);var startCenter=null;var mainMapObj=null;var miniMapObj=null;var miniMapID="miniMap_"+uniqueID;var miniMapRoadID="mmRoad_"+uniqueID;var miniMapHybridID="mmHybrid_"+uniqueID;var miniMapCloseID="mmClose_"+uniqueID;var VEZoomMinusID="MSVE_navAction_zoomMinusWrapper";var VEZoomPlusID="MSVE_navAction_zoomPlusWrapper";var VEbaseUrl="http://maps.live.com/default.aspx";var searchID="searchDiv_"+uniqueID;var hiddenID="hiddenField_"+uniqueID;var clusterID="clusterDiv"+uniqueID;var getDirectionsString='<span>'+'<strong>Get Directions:</strong> '+'<a style="text-decoration: underline;" href="#">To here</a> '+'- <a style="text-decoration: underline;" href="#">From here</a>'+'</span>\n';var toHereString='<span style="display:none;">'+'<strong>Get Directions:</strong> To here '+'- <a style="text-decoration: underline;" href="#">From here</a>'+'<div style="font-size:11px; color:Gray">Start address </div>'+'<div>'+'<input type="hidden" value="to">'+'<input type="text" size=25 maxlength=50 value="" /> '+'<input value="Go" type="submit">'+'</div>'+'</span>\n';var fromHereString='<span style="display:none;">'+'<strong>Get Directions:</strong> '+'<a style="text-decoration: underline;" href="#">To here</a> - From here'+'<div style="font-size:11px; color:Gray">End address </div>'+'<div>'+'<input type="hidden" value="from">'+'<input type="text" size=25 maxlength=50 value="" /> '+'<input value="Go" type="submit">'+'</div>'+'</span>\n';if(!settings.writeObjID||!document.getElementById(settings.writeObjID)){return;}if(settings.miniMap.on){var newDiv=document.createElement("div");newDiv.style.overflow="hidden";newDiv.style.position="relative";var mainMapElement=document.getElementById(settings.writeObjID);var mainMapParent=mainMapElement.parentNode;mainMapParent.appendChild(newDiv);var miniMapString='<div class="'+settings.miniMapIDClasses.parentClass+'">'+'<div class="'+settings.miniMapIDClasses.headerClass+'">'+'<a id="'+miniMapRoadID+'" href="#">Road</a>'+'<a id="'+miniMapHybridID+'" href="#">Hybrid</a>'+'<a id="'+miniMapCloseID+'" class="'+settings.miniMapIDClasses.linkCloseClass+'" href="#">Close</a>'+'</div>'+'<div style="position: relative;"><div id="'+miniMapID+'" class="'+settings.miniMapIDClasses.bodyClass+'"></div></div>'+'</div>';newDiv.innerHTML=miniMapString;newDiv.appendChild(mainMapElement);miniMapObj=new VEMap(miniMapID);miniMapObj.HideDashboard();}if(!settings.startCoords.latitude&&!settings.startCoords.longitude){return;}mainMapObj=new VEMap(settings.writeObjID);startCenter=new VELatLong(settings.startCoords.latitude,settings.startCoords.longitude);var options=new VEMapOptions();options.EnableBirdseye=false;mainMapObj.LoadMap(startCenter,settings.zoom.start,settings.mapStyle,false,null,null,null,options);if(settings.startPin.on){createShapeLayer(mainMapObj,new Array({center:startCenter,maxZoom:settings.startPin.maxZoom,minZoom:settings.startPin.minZoom,title:settings.startPin.title,description:settings.startPin.description,icon:settings.startPin.icon,directions:settings.startPin.directions}));}if(settings.geoRss.file){feedMap(mainMapObj,settings.geoRss.file,settings.cluster,settings.zoom,settings.returnFunc,getDirectionsString,toHereString,fromHereString,searchID,hiddenID,clusterID,settings.geoRss.directions);}if(settings.miniMap.on){var miniMapZoom=(parseInt(mainMapObj.GetZoomLevel())-settings.miniMap.zoomOffset);miniMapObj.LoadMap(startCenter,miniMapZoom,settings.miniMap.style);createShapeLayer(miniMapObj,new Array({center:startCenter,title:settings.miniMap.title,description:settings.miniMap.description,icon:settings.miniMap.icon}));miniMapEvents();}mapEvents();if(settings.tiles.length){mapTiles(mainMapObj,settings.tiles);}if(settings.pins.length){createShapeLayer(mainMapObj,settings.pins);}if(jQuery.isFunction(settings.returnFunc)&&!settings.geoRss.file){settings.returnFunc(mainMapObj,null);}function miniMapEvents(){jQuery('#'+miniMapRoadID).click(function(){miniMapObj.SetMapStyle('r');return false;});jQuery('#'+miniMapHybridID).click(function(){miniMapObj.SetMapStyle('h');return false;});jQuery('#'+miniMapCloseID).click(function(){if(jQuery('#'+miniMapID).css('display')=='none'){jQuery(this).html('Close');jQuery('#'+miniMapID).css('display','')}else{jQuery(this).html('Open');jQuery('#'+miniMapID).css('display','none');}return false;});miniMapObj.AttachEvent("onmousewheel",function(e){return true;});miniMapObj.AttachEvent("ondoubleclick",function(e){miniMapObj.SetCenter(startCenter);mainMapObj.SetCenterAndZoom(startCenter,settings.zoom.start);return true;});miniMapObj.AttachEvent("onclick",function(e){mainMapObj.SetCenterAndZoom(miniMapObj.GetCenter(),mainMapObj.GetZoomLevel());return true;});}function mapEvents(){var clusterLinkFired=false;function createDirLinks(e){if(!document.getElementById(searchID)){return;}var directionsTimeout=setTimeout(function(){jQuery('#'+searchID+' a').each(function(i,val){jQuery(val).click(function(){jQuery('#'+searchID+' span').each(function(subi,subval){jQuery(subval).css('display','none');});var itemText=jQuery(val).text();if((new RegExp('to','i')).test(itemText)){jQuery('#'+searchID+' span:eq(1)').css('display','');}if((new RegExp('from','i')).test(itemText)){jQuery('#'+searchID+' span:eq(2)').css('display','');}return false;});});jQuery("#"+searchID+" input[type='submit']").each(function(i,val){jQuery(val).click(function(){var routeOptions='0~1~0';var inputArray=new Array(document.getElementById(hiddenID).value);jQuery(this).parent().children('input').each(function(subi,subval){inputArray.push(this.value);});if(inputArray[1]=='to'){document.location.href=VEbaseUrl+'?rtp=adr.'+inputArray[2]+'~'+inputArray[0]+'&Rtop='+routeOptions;}else{document.location.href=VEbaseUrl+'?rtp='+inputArray[0]+'~adr.'+inputArray[2]+'&Rtop='+routeOptions;}return false;});});clearTimeout(directionsTimeout);},10);}function createClustLinks(e){if(!document.getElementById(clusterID)){return;}var clusterTimeout=setTimeout(function(){jQuery('#'+clusterID+' a').each(function(i,val){jQuery(val).click(function(){var shapeID=this.hash.split("#")[1];var shape=mainMapObj.GetShapeByID(shapeID);var shapeLL=returnCoords(shape);mainMapObj.SetCenterAndZoom(shapeLL.obj,settings.cluster.zoom);if(settings.geoRss.directions){var anotherTimeout=setTimeout(function(){createDirLinks(e);clearTimeout(anotherTimeout);},100);}var infoboxTimeout=setTimeout(function(){var offsetX=settings.cluster.offset;if(shape.IconId&&offsetX==13){var newImage=new Image();newImage.src=shape.IconId;offsetX=parseInt(newImage.width/2)+1;}clusterLinkFired=true;var resetClusterLinkFired=setTimeout(function(){clusterLinkFired=false;clearTimeout(resetClusterLinkFired);},200);mainMapObj.ShowInfoBox(shape,shapeLL.obj,new VEPixel(offsetX,0));clearTimeout(infoboxTimeout);},10);return false;});});clearTimeout(clusterTimeout);},10);}mainMapObj.AttachEvent("onmouseover",function(e){});mainMapObj.AttachEvent("onmousemove",function(e){if(settings.cluster.on){createClustLinks(e);}createDirLinks(e);if(clusterLinkFired){return true;}});mainMapObj.AttachEvent("ondoubleclick",function(e){if(settings.miniMap.on){miniMapObj.SetCenter(startCenter);}mainMapObj.SetCenter(startCenter);return true;});mainMapObj.AttachEvent("onclick",function(e){if(settings.miniMap.on&&(parseInt(mainMapObj.GetZoomLevel())-settings.miniMap.zoomOffset)>=0){miniMapObj.SetCenterAndZoom(mainMapObj.GetCenter(),(parseInt(mainMapObj.GetZoomLevel())-settings.miniMap.zoomOffset));}});if(settings.zoom.max||settings.zoom.min){var currentZoom=mainMapObj.GetZoomLevel();if(settings.zoom.max&&(currentZoom>=settings.zoom.max)){jQuery('#'+VEZoomPlusID).css("visibility","hidden");}if(settings.zoom.min&&(currentZoom<=settings.zoom.min)){jQuery('#'+VEZoomMinusID).css("visibility","hidden");}}mainMapObj.AttachEvent("onendzoom",function(e){if(settings.miniMap.on&&(parseInt(mainMapObj.GetZoomLevel())-settings.miniMap.zoomOffset)>=0){miniMapObj.SetCenterAndZoom(mainMapObj.GetCenter(),(parseInt(mainMapObj.GetZoomLevel())-settings.miniMap.zoomOffset));}if(settings.zoom.max||settings.zoom.min){jQuery('#'+VEZoomPlusID).css("visibility","visible");jQuery('#'+VEZoomMinusID).css("visibility","visible");var currentZoom=mainMapObj.GetZoomLevel();if(settings.zoom.max&&(currentZoom>=settings.zoom.max)){jQuery('#'+VEZoomPlusID).css("visibility","hidden");return true;}if(settings.zoom.min&&(currentZoom<=settings.zoom.min)){jQuery('#'+VEZoomMinusID).css("visibility","hidden");return true;}}});mainMapObj.AttachEvent("onmousewheel",function(e){if(settings.zoom.max||settings.zoom.min){if(e.mouseWheelChange){var currentZoom=mainMapObj.GetZoomLevel();var mousedirection=(e.mouseWheelChange<0)?"zoomout":"zoomin";if(settings.zoom.max&&(currentZoom>=settings.zoom.max)&&(mousedirection=="zoomin")){mainMapObj.SetZoomLevel(settings.zoom.max);return true;}if(settings.zoom.min&&(currentZoom<=settings.zoom.min)&&(mousedirection=="zoomout")){mainMapObj.SetZoomLevel(settings.zoom.min);return true;}}}});}function returnCoords(shape){var tempLL=shape.GetPoints();var tempLat=shape.Latitude;var tempLong=shape.Longitude;tempLL=new VELatLong(tempLat,tempLong);return{obj:tempLL,latitude:tempLat,longitude:tempLong};}function createShapeLayer(mapObj,pinsObj){var tempShapeLayer=new VEShapeLayer();jQuery(pinsObj).each(function(i,val){var tempCenter=(val.longitude&&val.latitude)?new VELatLong(val.latitude,val.longitude):val.center;var tempMapShape=new VEShape(VEShapeType.Pushpin,tempCenter);if(val.title&&val.title!=""){tempMapShape.SetTitle(val.title);}var tempDescription=(val.description)?val.description:"";if(val.directions&&tempCenter){var dirTitleString=(val.title&&val.title!="")?val.title:"";var dirCoordsString='pos.'+tempCenter.Latitude+'_'+tempCenter.Longitude+'_'+dirTitleString;tempDescription+='<div id="'+searchID+'" style="text-align: left; padding-top: 10px;">'+'<input id="'+hiddenID+'" type="hidden" value="'+dirCoordsString+'"/>'+getDirectionsString
+toHereString
+fromHereString
+'</div>';}if(tempDescription!=""){tempMapShape.SetDescription(tempDescription);}if(val.icon&&val.icon!=""){tempMapShape.SetCustomIcon(val.icon);}if(val.maxZoom){tempMapShape.SetMaxZoomLevel(val.maxZoom);}if(val.minZoom){tempMapShape.SetMinZoomLevel(val.minZoom);}tempShapeLayer.AddShape(tempMapShape);});mapObj.AddShapeLayer(tempShapeLayer);}function mapTiles(mapObj,tileObj){jQuery(tileObj).each(function(i,val){var tileSourceSpec=new VETileSourceSpecification(val.id,val.path);tileSourceSpec.NumServers=(val.numServers)?val.numServers:1;if(val.minZoom){tileSourceSpec.MinZoomLevel=val.minZoom;}if(val.maxZoom){tileSourceSpec.MaxZoomLevel=val.maxZoom;}if(typeof val.zIndex=="number"){tileSourceSpec.ZIndex=val.zIndex};mapObj.AddTileLayer(tileSourceSpec,true);});}function feedMap(mapObj,xmlFile,clusterOptions,zoomOptions,returnFunc,getString,toString,fromString,searchDivID,hiddenInputID,clusterDivID,directions){function feedMapCallback(returnData){var numShapes=returnData.GetShapeCount();var feedObj=new Array();for(var i=0;i<numShapes;i++){var tempShape=returnData.GetShapeByIndex(i);var tempDescription=tempShape.GetDescription();var tempTitle=jQuery.trim(tempShape.GetTitle());var tempLL=returnCoords(tempShape);var tempObj={title:tempTitle,id:tempShape.GetID(),latitude:tempLL.latitude,longitude:tempLL.longitude,description:'"'+tempDescription.replace(/"/g,'\\"')+'"'};feedObj.push(tempObj);var tempCoordsValue='pos.'+tempLL.latitude+'_'+tempLL.longitude+'_'+tempTitle;var newDescription=tempDescription;if(directions){newDescription+='<div id="'+searchDivID+'" style="text-align: left; padding-top: 10px;">'+'<input id="'+hiddenInputID+'" type="hidden" value="'+tempCoordsValue+'"/>'+getString
+toString
+fromString
+'</div>';}tempShape.SetDescription(newDescription);if(tempShape.IconId){tempShape.SetCustomIcon('<img src="'+tempShape.IconId+'"/>');}}if(jQuery.isFunction(returnFunc)){returnFunc(mapObj,feedObj);}}function clusterCallback(returnData){for(var i=0;i<returnData.length;i++){var cluster=returnData[i];var clusterShape=cluster.GetClusterShape();var maxlocations=5;var title="There are "+cluster.Shapes.length+" locations near here.<br /><hr />";var description='<div id="'+clusterDivID+'" style="border: solid 1px lightgrey;padding:5px;">'+'<ul style="text-align: left;">';var tempMax=(cluster.Shapes.length>=maxlocations)?maxlocations:cluster.Shapes.length;for(var s=0;s<tempMax;s++){var shape=cluster.Shapes[s];description+='<li style="padding-bottom: 3px;">'+'<a style="text-decoration: underline;" href="#'+shape.GetID()+'">'+shape.Title+'</a>'+'</li>';}description+='</ul>';if(cluster.Shapes.length>=maxlocations){description+="First 5 locations displayed.<br/>Please zoom in for more detail.<br/>";}description+='</div>';clusterShape.SetTitle(title);clusterShape.SetDescription(description);}}var clusterLayer=new VEShapeLayer();if(clusterOptions.on){var pointclusterOptions=new VEClusteringOptions();pointclusterOptions.Callback=clusterCallback;if(clusterOptions.image){var image=new VECustomIconSpecification();image.Image=clusterOptions.image;pointclusterOptions.Icon=image;}clusterLayer.SetClusteringConfiguration(VEClusteringType.Grid,pointclusterOptions);}var geoRssLayerSpec=new VEShapeSourceSpecification(VEDataType.GeoRSS,xmlFile,clusterLayer);mainMapObj.ImportShapeLayerData(geoRssLayerSpec,feedMapCallback,zoomOptions.best);}};})();