﻿Type.registerNamespace("GIRO.Hastinfo.Web.Mapping");

GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap = function(element) {
   GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.initializeBase(this, [element]);
      
   this._buffer=0.0025;
   this._destinationIconUrl=null;
   this._destinationId=null;
   this._destinationLatLong=null;
   this._locationManagerID=null;
   this._originIconUrl=null;
   this._originId=null;
   this._originLatLong=null;
   this._MergeNearPushpinDetails=null;
   this._NearPushpinDetailsPixelRadius=null;
   this._pushpinIcons=new Object();
   this._selectDestinationOnLoad;
   this._selectOriginOnLoad;
   
   this._onneedpushpinscomplete$delegate=null;
   this._vePushpinOnMouseOverCallback$delegate=null;
}  

GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.prototype = {
   initialize : function() {
      GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.callBaseMethod(this, "initialize");
      if(this._onneedpushpinscomplete$delegate==null)this._onneedpushpinscomplete$delegate=Function.createDelegate(this,this._VELocationManager_NeedPushpinsComplete);
      if(this._MergeNearPushpinDetails)
         {
         this._vePushpinOnMouseOverCallback$delegate=Function.createDelegate(this,this._vePushpinOnMouseOverCallback);
         VEPushpin.ShowDetailOnMouseOver=false;
         VEPushpin.OnMouseOverCallback=this._vePushpinOnMouseOverCallback$delegate;
         }
   },
   
   dispose : function() {
      if(this._ondeleteallpushpins$delegate!=null) 
         {
         this.remove_deleteallpushpins(this._ondeleteallpushpins$delegate);
         delete this._ondeleteallpushpins$delegate;
         }      
      if(this._onneedpushpinscomplete$delegate!=null)
         delete this._onneedpushpinscomplete$delegate;
      if(this._vePushpinOnMouseOverCallback$delegate!=null)
         delete this._vePushpinOnMouseOverCallback$delegate;
      GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.callBaseMethod(this, 'dispose');
   },
   
   get_DestinationIconUrl:function(){return(this._destinationIconUrl);},
   set_DestinationIconUrl:function(value){this._destinationIconUrl=value;},
   get_DestinationId:function(){return(this._destinationId);},
   set_DestinationId:function(value){this._destinationId=value;},
   get_LocationManagerID:function(){return(this._locationManagerID);},
   set_LocationManagerID:function(value){this._locationManagerID=value;},
   get_MergeNearPushpinDetails:function(){return(this._MergeNearPushpinDetails);},
   set_MergeNearPushpinDetails:function(value){this._MergeNearPushpinDetails=value;},
   get_NearPushpinDetailsPixelRadius:function(){return(this._NearPushpinDetailsPixelRadius);},
   set_NearPushpinDetailsPixelRadius:function(value){this._NearPushpinDetailsPixelRadius=value;},
   get_OriginIconUrl:function(){return(this._originIconUrl);},
   set_OriginIconUrl:function(value){this._originIconUrl=value;},
   get_OriginId:function(){return(this._originId);},
   set_OriginId:function(value){this._originId=value;},
   get_SelectDestinationOnLoad:function(){return(this._selectDestinationOnLoad);},
   set_SelectDestinationOnLoad:function(value){this._selectDestinationOnLoad=value;},
   get_SelectOriginOnLoad:function(){return(this._selectOriginOnLoad);},
   set_SelectOriginOnLoad:function(value){this._selectOriginOnLoad=value;},
      
   _cleanOrphanLocation : function() {
      if(this.get_OriginId()!=null&&!this._pushpinExist(this.get_OriginId()))this.SetOrigin(null,false);
      if(this.get_DestinationId()!=null&&!this._pushpinExist(this.get_DestinationId()))this.SetDestination(null,false);
   },
   
   _clearDestination : function() {
      if (this.get_DestinationId()==null)return;
         
      this._popPushpinIcon("Destination");
      this.set_DestinationId(null);
   },
   
   _clearOrigin : function() {
      if (this.get_OriginId()==null)return;
         
      this._popPushpinIcon("Origin");
      this.set_OriginId(null);
   },
   
   _needPushpin : function(originId, destinationId, zoomOnPlan) {
      if((originId==null||originId.length==0)&&(destinationId==null||destinationId.length==0))return;
      
      var locationManager=$find(this.get_LocationManagerID());
      if(locationManager!=null)locationManager.NeedPushpins(originId,destinationId,zoomOnPlan,this._onneedpushpinscomplete$delegate);
   },
   
   ondeleteallpushpinscomplete : function(e) {
      var baseArguments=new Array();baseArguments.push(e);
      GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.callBaseMethod(this,"ondeleteallpushpinscomplete",baseArguments);
      
      this._needPushpin(this.get_OriginId(),this.get_DestinationId(),false);
   },
    
   _pushpinExist : function(id) {
      return(this.get_PushpinIcon(id)!=null);
   },
   
   _popPushpinIcon : function(context) {
      if(this._pushpinIcons[context]!=null)
         {
         var pushpinIcon=this.get_PushpinIcon(this._pushpinIcons[context].pushpinId);
         if (pushpinIcon != null)
            {
            pushpinIcon.onload=this._pushpinIcons[context].onload;
            pushpinIcon.style.width=this._pushpinIcons[context].width;
            pushpinIcon.style.height=this._pushpinIcons[context].height;
            pushpinIcon.src=this._pushpinIcons[context].iconUrl;
            pushpinIcon.parentNode.style.zIndex=this._pushpinIcons[context].zIndex;
            }
         this._pushpinIcons[context]=null;
         }
   },

   _pushPushpinIcon : function(context, id, iconUrl) {
      var pushpinIcon=this.get_PushpinIcon(id);
      this._pushpinIcons[context]=new Object();
      this._pushpinIcons[context].pushpinId=id; 
      this._pushpinIcons[context].onload=pushpinIcon.onload; 
      this._pushpinIcons[context].width=pushpinIcon.style.width;
      this._pushpinIcons[context].height=pushpinIcon.style.height;    
      this._pushpinIcons[context].iconUrl=pushpinIcon.src;
      this._pushpinIcons[context].zIndex=pushpinIcon.parentNode.style.zIndex;
      pushpinIcon.parentNode.style.zIndex=999;
      pushpinIcon.onload=null;
      pushpinIcon.style.width="";
      pushpinIcon.style.height="";
      pushpinIcon.src=iconUrl;
   },   

   SetDestination : function(id, zoomOn) {
      if(id==null||id.length==0)
         {
         this._clearDestination();
         return;
         }
      
      this.set_DestinationId(id);
      if(this._pushpinExist(id))
         {
         this._swapPushpinIcon("Destination","Origin",id,this.get_DestinationIconUrl());
         if(zoomOn)this.ZoomOnPlan();
         return;
         }
      this._needPushpin(null,id,zoomOn);
   },
   
   SetOrigin : function(id, zoomOn) {
      if(id==null||id.length==0)
         {
         this._clearOrigin();
         return;
         }
      
      this.set_OriginId(id);
      if(this._pushpinExist(id))
         {
         this._swapPushpinIcon("Origin","Destination",id,this.get_OriginIconUrl());
         if(zoomOn)this.ZoomOnPlan();         
         return;
         }
      this._needPushpin(id,null,zoomOn);       
   },
   
   _swapPushpinIcon : function(newContext, oldContext, id, iconUrl) {
      this._popPushpinIcon(newContext);
      if(this._pushpinIcons[oldContext]!=null&&this._pushpinIcons[oldContext].pushpinId==id)
         this._popPushpinIcon(oldContext);
      this._pushPushpinIcon(newContext,id,iconUrl);      
   },
   
   update : function(e) {      
      var baseArguments=new Array();baseArguments.push(e);
      GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.callBaseMethod(this,"update",baseArguments);
      
      if (this.get_SelectOriginOnLoad())
         this.SetOrigin(this.get_OriginId(), false);
      if (this.get_SelectDestinationOnLoad())
         this.SetDestination(this.get_DestinationId(), false);
   },
        
   _VELocationManager_NeedPushpinsComplete : function(sender, e) {
      if(e.OriginPushpin!=null)
         {
         if(!this._pushpinExist(e.OriginPushpin.Id))this._addPushpin(e.OriginPushpin);
         this.SetOrigin(e.OriginPushpin.Id,false);
         } 
      if(e.DestinationPushpin!=null)
         {
         if(!this._pushpinExist(e.DestinationPushpin.Id))this._addPushpin(e.DestinationPushpin);
         this.SetDestination(e.DestinationPushpin.Id,false);
         }
     this._cleanOrphanLocation();
     if(e.ZoomOnPlan)this.ZoomOnPlan();
   },
   
   _vePushpinOnMouseOverCallback : function(x, y, title, details) {
      var pushpin=null,pushpinContent="",nearPushpinContent="",nbNearPushpins=0;
      for(i in this._Map.pushpins)
         {
         var curPushpin=this._Map.pushpins[i];
         var pushpinX=this._Map.vemapcontrol.GetX(curPushpin.LatLong.Longitude)+this._Map.GetLeft();
         var pushpinY=this._Map.vemapcontrol.GetY(curPushpin.LatLong.Latitude)+this._Map.GetTop();
         if (pushpin==null&&pushpinX==x&&pushpinY==y)
            {
            pushpin=curPushpin;
            pushpinContent=VEPushpin.GetEroContent(pushpin.Title,pushpin.Details,pushpin.TitleStyle,pushpin.DetailsStyle);
            continue;
            }
         if (pushpinX>=x-this._NearPushpinDetailsPixelRadius&&pushpinX<=x+this._NearPushpinDetailsPixelRadius&&pushpinY>=y-this._NearPushpinDetailsPixelRadius&&pushpinY<=y+this._NearPushpinDetailsPixelRadius)
            {
            nearPushpinContent+=VEPushpin.GetEroContent(curPushpin.Title,curPushpin.Details,curPushpin.TitleStyle,curPushpin.DetailsStyle);
            nbNearPushpins++;
            }
         }
      var detailsContainer="<div class='PushpinDetailContainer";
      if(nbNearPushpins>0)
         for(j=0;j<4&&j<nbNearPushpins;j++)
            detailsContainer+=" PushpinDetailContainer"+(j+2);
      detailsContainer+="'>";
      detailsContainer+=pushpinContent;
      detailsContainer+=nearPushpinContent;
      detailsContainer+="</div>";
      window.ero.setContent(detailsContainer);
      window.ero.dockToElement($get(pushpin.ID));
    },
    
   ZoomOnPlan : function() {
      var originLatLong=this.GetPushpinLatLong(this.get_OriginId());
      var destinationLatLong=this.GetPushpinLatLong(this.get_DestinationId());
      if(originLatLong==null&&destinationLatLong==null)return;
      
      var maxX=null;var maxY=null;var minX=null;var minY=null;
      if(originLatLong!=null)
         {      
         maxX=minX=originLatLong.Longitude;
         maxY=minY=originLatLong.Latitude;
         }
      if(destinationLatLong!=null)
         {
         if(maxX==null||destinationLatLong.Longitude>maxX)maxX=destinationLatLong.Longitude;
         if(minX==null||destinationLatLong.Longitude<minX)minX=destinationLatLong.Longitude;
         if(maxY==null||destinationLatLong.Latitude>maxY)maxY=destinationLatLong.Latitude;
         if(minY==null||destinationLatLong.Latitude<minY)minY=destinationLatLong.Latitude;
         }
         
      if(this._buffer!=0.0)
         {
         maxY+=this._buffer;
         minY-=this._buffer;
         maxX+=this._buffer;
         minX-=this._buffer;
         }

      this.ZoomOn(minX,maxY,maxX,minY);
   }
}   

GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap.registerClass("GIRO.Hastinfo.Web.Mapping.VELocationSelectionMap", GIRO.Web.Mapping.VirtualEarth.VEMap);
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();