﻿        var map;
        var startPos = new VELatLong(35, 0);
        var startZoom = 1;
        var mycontrol = null;
        var ShapeArray = new Array();
        var pinID = 0;

        var CityIDs = new Array();
        var CityNames = new Array();
        var CityParents = new Array();
        var CityLats = new Array();
        var CityLongs = new Array();
        
        var RegionIDs = new Array();
        var RegionNames = new Array();

        var zoomregion = true;
        var clickURL = "";

        function showMap() {
            if (pageloaded) {
                document.getElementById('GNrightCol').style.display = "none";
                document.getElementById('GNrightColAlt').style.display = "";
                document.getElementById('heroimg').style.display = "none";
                document.getElementById('heromap').style.display = "";
                GetMap();
            }
        }

        function hideMap() {
            initMap();
            document.getElementById('GNrightColAlt').style.display = "none";
            document.getElementById('GNrightCol').style.display = "";
            document.getElementById('heroimg').style.display = "";
            document.getElementById('heromap').style.display = "none";
        }
        
        function GetMap() {
            map = new VEMap('heromap');
            map.SetDashboardSize(VEDashboardSize.Tiny);
            map.LoadMap(startPos, startZoom ,'a' ,false);
            map.AttachEvent("onendzoom",fixDots);        
            map.AttachEvent("onchangeview",savePos);        
            
            map.AttachEvent("onmouseover", attachOfficeClick)
            map.AttachEvent("onmouseout", detachOfficeClick)
            map.AttachEvent("onclick", clickDot);
            
            initMap();
        }

        function attachOfficeClick(e) {
            clickURL = "";
            if (e.elementID != null) {
                for (var i = 0; i < ShapeArray.length; i++) {
                    var myid = ShapeArray[i].GetID();
                    if (myid == e.elementID.substring(0,myid.length)) {
                        var mydesc = ShapeArray[i].GetDescription();
                        var startlink = mydesc.indexOf("href=\"") + 6;
                        var endlink = mydesc.indexOf("\"",startlink);
                        var mylink = mydesc.substring(startlink,endlink);
                        
                        clickURL = mylink;
                    }
                }
            }
        }

        function detachOfficeClick(e) {
            if (e.elementID != null && clickURL != "") {
                clickURL = "";
            }
        }
        
        function clickDot(e) {
            if (clickURL != "") {
                location.href = clickURL;
            }
        }

        function initMap() {
            initArray();
            
            if (mycontrol != null) {
                map.DeleteControl(mycontrol);               
                mycontrol = null;            
            }            
            
            addRegions();
            map.SetCenterAndZoom(startPos, startZoom);
            fixDots();
        }

        function initArray() {
            for (var i = 0; i < ShapeArray.length; i++) {
                map.DeleteShape(ShapeArray[i]);
                ShapeArray[i] = null;
            }
            
            pinID = 0;
            ShapeArray = new Array();
        }

        function addCityPin(id) {
            var i = id;
            ShapeArray[pinID] = new VEShape(VEShapeType.Pushpin, new VELatLong(CityLats[i], CityLongs[i]));
            ShapeArray[pinID].SetDescription(document.getElementById('dCity' + CityIDs[i]).innerHTML.replace('<!--','').replace('-->',''));
            ShapeArray[pinID].SetTitle(CityNames[i]);
            var myicon = getPinHTML();
            ShapeArray[pinID].SetCustomIcon(myicon);
            map.AddShape(ShapeArray[pinID]);
            
            pinID++;
        }
        
        function getPinHTML() {
            var zoom = parseInt(map.GetZoomLevel());
            //var retval = '<img src=/images/ws/gn/Dot_' + (zoom + 6) + 'x' + (zoom + 6) + '.gif hspace=' + parseInt((9.5 - (zoom * .5))) + ' vspace=' + parseInt((9.5 - (zoom * .5))) + ' />';
            if (zoom > 2) {
                var retval = '<img src=/images/ws/gn/NewDot_7x7.gif hspace=9 vspace=9 />';
            } else {
                var retval = '<img src=/images/ws/gn/NewDot_7x7Global.gif hspace=9 vspace=9 />';
            }
            return retval;
        }
        
        function addRegions() {
            for (var i = 0; i < CityIDs.length; i++) {
                addCityPin(i);
            }
        }
        
        function showRegionById(regionid) {
            for (var i = 0; i < RegionIDs.length; i++) {
                if (RegionIDs[i] == regionid) {
                    showMap();
                    showRegion(i);
                    break;
                }
            }
        }

        function showRegion(regionindex) {
            //map.DeleteAllShapes();
            document.cookie = "region=" + regionindex;
            initArray();

            if (zoomregion) {
                var canzoom = canZoomOnceMore(regionindex);
                if (canzoom) {
                    map.AttachEvent("onchangeview",zoomOnceMore);  
                    map.DetachEvent("onendzoom",fixDots);  
                }
                map.SetCenterAndZoom(new VELatLong(avgLat(RegionIDs[regionindex]), avgLong(RegionIDs[regionindex])),2);
            }
            
            for (var i = 0; i < CityIDs.length; i++) {
                if (RegionIDs[regionindex] == CityParents[i]) {
                    addCityPin(i);
                }
            }
            
            addBacktoGlobal();
        }

        function canZoomOnceMore(regionindex) {
            var minlat = avgLat(RegionIDs[regionindex]);
            var maxlat = avgLat(RegionIDs[regionindex]);
            var minlong = avgLong(RegionIDs[regionindex]);
            var maxlong = avgLong(RegionIDs[regionindex]);
            
            for (var i = 0; i < CityIDs.length; i++) {
                if (CityParents[i] == RegionIDs[regionindex]) {
                    if (CityLats[i] < minlat) { minlat = CityLats[i]; }
                    if (CityLats[i] > minlat) { maxlat = CityLats[i]; }
                    if (CityLongs[i] < minlong) { minlong = CityLongs[i]; }
                    if (CityLongs[i] > maxlong) { maxlong = CityLongs[i]; }
                }
            }
            
            var latlen = maxlat - minlat;
            var longlen = maxlong - minlong;
            
            if (latlen <= 40 && longlen <= 113) {
                return true;
            } else {
                return false;
            }
        }
        
        function zoomOnceMore(e) {
            map.DetachEvent("onchangeview",zoomOnceMore);
            map.AttachEvent("onendzoom",fixDots);  
            map.ZoomIn();
        }
        
        function fixDots(e) {
            var myzoom = parseInt(map.GetZoomLevel());
            /*var pixelthreshhold = 3;
            var pixelmove = 1;
            
            for (var i = 0; i < ShapeArray.length; i++) {
                var mytitle = ShapeArray[i].GetTitle();
                for (var j = 0; j < CityIDs.length; j++) {
                    if (mytitle == CityNames[j]) {
                        var mypoints = new Array();
                        mypoints[0] = new VELatLong(CityLats[j], CityLongs[j]);
                        ShapeArray[i].SetPoints(mypoints);
                    }
                }
            }
            */
            for (var i = 0; i < ShapeArray.length; i++) {
                var mypinhtml = getPinHTML();
                ShapeArray[i].SetCustomIcon(mypinhtml);
                
                if (myzoom < 0) {
                    var myx = map.LatLongToPixel(ShapeArray[i].GetPoints()[0]).x;
                    var myy = map.LatLongToPixel(ShapeArray[i].GetPoints()[0]).y;
                    
                    for (var j = 0; j < ShapeArray.length; j++) {
                        if (j != i) {
                            var compx = map.LatLongToPixel(ShapeArray[j].GetPoints()[0]).x;
                            var compy = map.LatLongToPixel(ShapeArray[j].GetPoints()[0]).y;
                            
                            if (Math.abs(myx - compx) <= pixelthreshhold && Math.abs(myy - compy) <= pixelthreshhold) {
                                //alert(myx + ":" + myy + " : " + compx + ":" + compy);
                                
                                if (myx >= compx) {
                                    var newx = myx + pixelmove;
                                } else {
                                    var newx = myx - pixelmove;
                                }
                                if (myy >= compy) {
                                    var newy = myy + pixelmove;
                                } else {
                                    var newy = myy - pixelmove;
                                }
                                
                                var mypoints = new Array();
                                mypoints[0] = map.PixelToLatLong(new VEPixel(newx, newy));
                                ShapeArray[i].SetPoints(mypoints);
                            }
                        }
                    }
                }
            }
        }
        
        function savePos(e) {
            var z = map.GetZoomLevel();
            document.cookie = "zoom=" + z;
            var pos = map.GetCenter();
            document.cookie = "lat=" + pos.Latitude;
            document.cookie = "long=" + pos.Longitude;
        }
        
        function resetMapPosition() {
            var myzoom = get_cookie("zoom");
            var mylat = get_cookie("lat");
            var mylong = get_cookie("long");

            showMap();
            
            zoomregion = false;
            if (get_cookie("region") != null) {
                if (get_cookie("region") != "") {
                    showRegion(get_cookie("region"));
                }
            }
            
            if (myzoom != null) {
                map.SetCenterAndZoom(new VELatLong(mylat,mylong), parseInt(myzoom));
            }
            zoomregion = true;
        }
        
        function get_cookie(cookie_name) {
          var results = document.cookie.match ( cookie_name + '=(.*?)(;|$)' );

          if ( results )
            return ( unescape ( results[1] ) );
          else
            return null;
        }

        function addBacktoGlobal() {
            if (mycontrol == null) {
                control = document.createElement("div");                
                control.id = "myControl";               
                control.style.top ="2px";                
                control.style.left = "567px";                
                control.style.border = "1px solid black";               
                control.style.background = "White";   
                control.style.padding = "5px";            
                control.innerHTML = '<a href="javascript: ;" onclick="document.cookie = \'region=\'; initMap()">Back to Global View</a>'; 
                mycontrol = control;
                map.AddControl(control);        
            }
        }
        
        function avgLat(regionid) {
            var high = -1000;
            var low = 1000;
            for (var i = 0; i < CityIDs.length; i++) {
                if (regionid != -1) {
                    if (CityParents[i] == regionid) {
                        if (CityLats[i] > high) {
                            high = CityLats[i];
                        }
                        if (CityLats[i] < low) {
                            low = CityLats[i];
                        }
                    }
                } else {
                    if (CityLats[i] > high) {
                        high = CityLats[i];
                    }
                    if (CityLats[i] < low) {
                        low = CityLats[i];
                    }
                }
            }
            return (high + low) / 2;
        }
 
         function avgLong(regionid) {
            var high = -1000;
            var low = 1000;
            for (var i = 0; i < CityIDs.length; i++) {
                if (regionid != -1) {
                    if (CityParents[i] == regionid) {
                        if (CityLongs[i] > high) {
                            high = CityLongs[i];
                        }
                        if (CityLongs[i] < low) {
                            low = CityLongs[i];
                        }
                    }
                } else {
                    if (CityLongs[i] > high) {
                        high = CityLongs[i];
                    }
                    if (CityLongs[i] < low) {
                        low = CityLongs[i];
                    }
                }
            }
            
            return (high + low) / 2;
        }
