var container;
var map;

var bEnableMoveSearch = false;

var glocCurrent = new GLatLng(latHome, longHome);

var progress; // = $('progress');
var progressbar; //= $('progressbar');
var progressstatus; //= $('progressstatus');
var progressmessage; //= $('progressmessage');

var sMapMode = 'availability';

    // Defaults
    var fLongitude = "-4.33";
    var fLatitude = "54.27";
    var zoomLevel = 5;
    var searchZoomLevel = 11;
    var anonZoomLevel = 12;
    var sensitivityX = 300;
    var sensitivityY = 150;
    var sightseeing = false;
    var animate = false;
    var CurrentLat;
    var CurrentLong;
    var currLoc = "";
    var spanLat;
    var spanLong;
    var searchBounds;
    var t;
    var t2;
    var strUrl = "";
    var searchXML;
    var searchID = 0;
    var clearMap = false;
    var busyCount = 0;
    var mapMarkers = [];
    var expanded = '';
//    var searchSkills = [];
    var searchSectors = [];
    var searchSIC = [];
    var searchBT = [];
    var msgNames = [];
    
    // Images for markers, 0 - workers, 1 - employers, 2 - RMS engineer
    var pinImages = new Array();
    pinImages[0] = new Array("/images/markers/worker_red.png", "/images/markers/worker_red.png", "/images/markers/worker_red.png", "/images/markers/worker_red.png", "/images/markers/worker_red.png");
    //pinImages[1] = new Array("/images/markers/employer_high.png", "/images/markers/employer_medium.png", "/images/markers/employer_low.png", "/images/markers/home_marker.png", "/images/markers/worker_green.png");
    //pinImages[2] = new Array("/images/markers/engineer_red.png", "/images/markers/engineer_yellow.png", "/images/markers/engineer_blue.png", "/images/markers/home_marker.png", "/images/markers/worker_green.png");
    var priorityHigh = 0;
    var priorityLow = 2;
    var priorityCluster = -1;
    var markerVisited = 4;
    var locStore;
    var locCombo;
    var keyStore;
    var keyCombo;
 
    var iSelectorZoomLevel = null;
    var iSelectorPoint = null;

var boundaryOverlay;
    
    function pageonload(){

        progress = $('progress');
        progressbar = $('progressbar');
        progressstatus = $('progressstatus');
        progressmessage = $('progressmessage');
        
        if ($("advanced")) {
            //getCurrencyOpts();
            //new Form.Element.Observer('txtSectorSearch', 1, doSectorSearchKeyDown);
            //new Form.Element.Observer('txtSICSearch', 1, doSICSearchKeyDown);
            new Form.Element.Observer('txtBTSearch', 1, doBTSearchKeyDown);
        }
        
        if (GBrowserIsCompatible()) {

            container = $('map');
            map = new GMap2(container);

            var iZoomLevel = 0;
            
            if(getCookie("Lat") != "" && getCookie("Long") != ""){
//                CurrentLat = parseFloat(getCookie("Lat"));
//                CurrentLong = parseFloat(getCookie("Long"));
                CurrentLat = parseFloat(latHome);
                CurrentLong = parseFloat(longHome);
            } else {
                CurrentLat = parseFloat(latHome);
                CurrentLong = parseFloat(longHome);
            }
            glocCurrent = new GLatLng(CurrentLat, CurrentLong);
            
            if(getCookie("Zoom") != ""){
                iZoomLevel = getCookie("Zoom");
            }else if(iMemberID > 0){
                iZoomLevel = searchZoomLevel + 2;
            }  else {
                iZoomLevel = anonZoomLevel + 2;
            }
            map.setCenter(glocCurrent, anonZoomLevel);

            reCentre();
            map.setMapType(G_PHYSICAL_MAP); 
            map.addMapType(G_PHYSICAL_MAP);
            
            // Add the zoom controls to the map
            map.addControl(new GLargeMapControl());
            
            // Add the may type control
            map.addControl(new GHierarchicalMapTypeControl());
            
            // Add the map mode control
           // map.addControl(new MapModeControl());
            
            // Set the options for the drag zoom control
            var optionsSelector = { 
              buttonStartingStyle: {background: '#FFF', paddingTop: '4px', paddingLeft: '4px', border:'1px solid black'},
              buttonHTML: '<img title="Drag Zoom In" src="http://static.zubed.com/images/icons/shape_group.png">',
              buttonStyle: {width:'20px', height:'20px'},
              buttonZoomingStyle: {background:'yellow',width:'75px', height:'100%'},
              backButtonEnabled: false, 
              overlayRemoveTime: 500,
              restrictedRectangleMap: false            
              } 

      
            if (iMemberID > 0) {       
                // Add the DragZoom control
                map.addControl(new DragZoomControl({}, 
                               optionsSelector, 
                               {
                                    dragend:function(nw,ne,se,sw,nwpx,nepx,sepx,swpx){
                                        
                                        map.setZoom(iSelectorZoomLevel);
                                        map.setCenter(iSelectorPoint);
                                        selectPoints(nw,ne,se,sw,nwpx,nepx,sepx,swpx);
                                        return false;
                                    },
                                    dragstart:function(x,y){
                                        iSelectorZoomLevel = map.getZoom();
                                        iSelectorPoint = map.getCenter();
                                    }
                               }), new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(25,290)));
//                $('gzoom-map-cover').style.left = '0px';
//                $('gzoom-map-cover').style.top = '0px';
            } else {
            
            }           
  
           
    
            GEvent.addListener(map, "moveend", function() { 
                clearTimeout(t);
                t=setTimeout("fnMapMovedEnd()",1000);  
            }); 
            
            GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
                //spitOut("zoomend " + oldLevel + " " + newLevel);
                if ((iMemberID > 0) || (newLevel <= anonZoomLevel)) {
                    zoomLevel = newLevel;
                } else {
                    if (newLevel > anonZoomLevel) {
                        map.setZoom(anonZoomLevel);
                        zoomLevel = anonZoomLevel;
                    }
                }
                saveView();
                fnGetSpan(newLevel);
            }); 
	   
	        var request = getRequestObject();
	        
	        if(typeof request['k'] != 'undefined') 
	        {
	            comboKeywords.setValue(request['k']);
	        }
	        
	        if(typeof request['l'] != 'undefined') 
	        {
                comboLocations.setValue(request['l']);
	        }
	        
	        if((typeof request['k'] != 'undefined') ||(typeof request['l'] != 'undefined'))
	        {
	            doSearch();
	        } else {
	            restoreState();
	        }
        } else {
            displayError("Browser cannot handle Google Maps");
        }
        
        page_resize();
     
     if (iMemberID <=0 ) {
     Landingmarker();
     }
     
    }
       
    function reCentre() {
        //spitOut("reCentre :" + CurrentLat + " " + CurrentLong + " " + zoomLevel);
        map.checkResize();
        map.setCenter(new GLatLng(CurrentLat,CurrentLong), zoomLevel);
        clearTimeout(t);
    }

    function searchChanged() {
        clearMap = true;
        return false;
    }

    // Creates a marker at the given point with the given number label
	function createMarker(point, priority, options) {

	    var icon = new GIcon();
	    //var i = options.membertype - 1;
	    var i = 0;

//	    if (options.RMSengineer == 1) {i = 2;}
	    options.priority = priority;
        icon.image = getMarkerImage(sMapMode, options);
        icon.shadow = "/images/markers/mm_20_shadow.png";
        icon.iconSize = new GSize(17, 23);
        icon.shadowSize = new GSize(32, 23);
        icon.iconAnchor = new GPoint(6, 20);
        icon.infoWindowAnchor = new GPoint(5, 1);
        
	    var marker = new GMarker(point,{icon:icon,zIndexProcess:priorityOrder});
	    
        GEvent.addListener(marker,"click", function() {
            displayMarker(marker);
        }); 
        
        marker.name = options.name; 
        marker.markerParent = options.parent;
        marker.selected = false;
        marker.imageIndex = i;
        marker.priority = options.priority;
        marker.tier = 3;
        marker.expanded = false;
        marker.selected = false;
        marker.link = options.number;
        marker.member = options.member;
        marker.selectedon = options.selectedon;
        marker.rank = options.rank;
        
        mapMarkers.push(marker);

	    return marker;
	}


    // Creates a marker at the given point with the given number label
	function createClusterMarker(point, number, name, tier, parent, toMap) {
        //spitOut("createClusterMarker");
	    
	    var icon = new GIcon();
        icon.image = "/images/overlay.aspx?a=" + name + "&n=" + number;
        icon.shadow = "";
        icon.iconSize = new GSize(50, 30);
        icon.link = name;
        icon.shadowSize = new GSize(74, 25);
        icon.iconAnchor = new GPoint(6, 20);
        icon.infoWindowAnchor = new GPoint(5, 1);
        
	    var marker = new GMarker(point, {icon:icon,zIndexProcess:priorityOrder});
    	
        if (tier==1) {
            GEvent.addListener(marker,"click", function() {
                                                    expanded = this.name;
                                                    saveExpanded();
                                                    plotClustersT2(this.name);
                                                }); 
        } else {
         GEvent.addListener(marker,"click", function() { 
                                                    var point = this.getPoint();
                                                    CurrentLat = parseFloat(point.lat());
                                                    CurrentLong = parseFloat(point.lng());
                                                    expanded = this.name;
                                                    saveExpanded();
                                                    getMarkers(this.name, CurrentLat, CurrentLong);
                                           }); 
        }                                            
        marker.name = name;
        marker.markerParent = parent;
        marker.priority = priorityCluster;
        marker.tier = tier;		 
        marker.expanded = (toMap==true)?false:true;
        marker.link = name;
        marker.link_number = number;
        marker.selected = false;
        mapMarkers.push(marker);
	    return marker;
	}
	
	function priorityOrder(marker, b) {
	    return GOverlay.getZIndex(marker.getPoint().lat()) + ((marker.priority+5)*-1)*1000000;
	}
	
    function get_points(pcode, Lat, Long) { 
        /*  
            Dev:    Steve Brockton
            Date:   2007-08-29
            Desc:   Perform a search.  New implementation of search - AJAXed by 70% ;-)
        */

        showProgress("Searching...", "Retrieving data");
        
        if (clearMap == true) {
            clearAllMarkers();
            clearMap = false;
        }
        //calculate zoom level for search
        if (pcode.length > 0) {
            //doing a location search, default to 10 mile radius
            var searchRadius = 10;
            if ($('advanced')) {
                searchRadius = $F('drpRadius');
            }
            searchBounds = getSearchBounds(searchRadius);
            //bit of a fudge - Google's zoom level is a bit bigger than the actual radius, so add one
            zoomLevel = map.getBoundsZoomLevel(searchBounds) + 1;
        } else {
            //no location or searching due to map move
//            if (iMemberID <= 0) zoomLevel = anonZoomLevel;
//            else if (zoomLevel < searchZoomLevel) zoomLevel = searchZoomLevel;
            if (zoomLevel < searchZoomLevel) zoomLevel = searchZoomLevel;
        }
        //now get the span for the required zoom level
        fnGetSpan(zoomLevel);
        var searchSW = new GLatLng(Lat - spanLat, Long - spanLong);
        var searchNE = new GLatLng(Lat + spanLat, Long + spanLong);
        searchBounds = new GLatLngBounds(searchSW, searchNE);
        
        var searchObj = getSearchParams(pcode, Lat, Long,  searchSW.lat(), searchSW.lng(), searchNE.lat(), searchNE.lng())

        var oSearch = new Search();    
        oSearch.getClusters(searchObj, function(response) {
        
            if (response.error) {
                displayError("There was a problem with your request. Please try again.");
                $('progress').style.display = 'none';
            } else {

                updateProgress(0, "Plotting...");

                var theXMLstring = response.result;

                searchXML = GXml.parse(theXMLstring);
                var ctr_home = searchXML.getElementsByTagName("centre");
                if ((ctr_home) && (ctr_home.length > 0)) {
                    var sID = parseInt(ctr_home[0].getAttribute("id"));
                    if (sID == searchID) {
                        var places = searchXML.getElementsByTagName("Place");
                        
                        if (places.length > 0)
                        {
                            disambiguate(places);
                        }
                        CurrentLat = parseFloat(ctr_home[0].getAttribute("lat"));
                        CurrentLong = parseFloat(ctr_home[0].getAttribute("lng"));
                        var memberCount = parseInt(ctr_home[0].getAttribute("MemberCount"));
                        reCentre();
                        if (memberCount==0) displayError("No members found, please revise your search criteria");
                        plotClustersT1(memberCount);
                    }
                }
            }
        });
    
    }

    

    function plotClustersT1(memberCount) {
         
        T1Clusters = searchXML.documentElement.getElementsByTagName("Tier1");
        var T2Clusters = searchXML.documentElement.getElementsByTagName("Tier2");

        var plotAll = false;

        if ((T2Clusters.length > 0) && (T2Clusters.length < 30)) {plotAll = true}

        setTimeout("plotNextT1(0, " + plotAll + ", " + memberCount + ")", 0);

    }


    function plotNextT1(i, plotAll, memberCount) {


        if ((T1Clusters) && (i < T1Clusters.length)) {
            var clusterName = T1Clusters[i].getAttribute("Name");
            //setTimeout("updateProgress(" + i+ ", " + T1Clusters.length + ", 'Plot: " + clusterName + "')", 10);
            setTimeout("updateProgress(" + (i / T1Clusters.length) + ", 'Plot: " + clusterName + "')", 10);
            var markerCount = T1Clusters[i].getAttribute("Count");
            var expandThis = ((plotAll==true) || (memberCount<=100) || (clusterName == expanded));
            var marker = getExistingMarker(clusterName);
            
            if (!marker) {
                var point = new GLatLng(parseFloat(T1Clusters[i].getAttribute("Latitude")),parseFloat(T1Clusters[i].getAttribute("Longitude")));
                plotCluster(point, markerCount, clusterName, 1, "", !expandThis);
            } else {
                if (expandThis==true) {
                    map.removeOverlay(marker);
                } else {
                    //clearMarkersForParent(clusterName);
                    //marker.expanded = false;
                    if (marker.expanded==false) updateMarkerCount(marker, markerCount);
                }
            }            
            
            //if ((expandThis==true) && ( (!marker) || ((marker) && (marker.expanded!=true)) ) ) {
            if ((expandThis==true) || ((marker) && (marker.expanded==true)) ) {
                setTimeout("plotClustersT2('" + clusterName + "', " + memberCount + ")", 10);
            }
            
            i+=1
            setTimeout("plotNextT1(" + i + ", " + plotAll + ", " + memberCount + ")", 0);
        } else {
            //setTimeout("updateProgress(1, 1, 'Finished')", 200);
            setTimeout("updateProgress(1, 'Finished')", 10);
            T1Clusters = null;
        }    
    }
    

    function plotClustersT2(T1Name, memberCount) {


        var T1Cluster = SelectSingleNode(searchXML, "root/Points/Tier1[@Name='" + T1Name + "']");
        if (!T1Cluster) {spitOut("not found"); return;}
        var T2Clusters = T1Cluster.getElementsByTagName("Tier2");
        var plotMarkers = false;
        if ((memberCount > 0) && (memberCount <= 100)) {plotMarkers = true}
        
        //remove parent from map
        for (var i=0, len=mapMarkers.length;i<len;i++) {
           if (mapMarkers[i].name==T1Name)  {

              map.removeOverlay(mapMarkers[i]);
              mapMarkers[i].expanded = true;
              break;
           }
        }
        
        //plot all the T2s for this T1
        for (var i = 0, len=T2Clusters.length; i < len; i++) {
            var clusterName = T2Clusters[i].getAttribute("Name");
            var markerCount = T2Clusters[i].getAttribute("Count");
            //var expandThis = ((plotMarkers==true) || (markerCount<=3) || (clusterName == expanded));
            var expandThis = ((plotMarkers==true) || (markerCount<=3));
            var marker = getExistingMarker(clusterName);
            point = new GLatLng(parseFloat(T2Clusters[i].getAttribute("Latitude")),parseFloat(T2Clusters[i].getAttribute("Longitude")));

            if (!marker) {
                var point = new GLatLng(parseFloat(T2Clusters[i].getAttribute("Latitude")),parseFloat(T2Clusters[i].getAttribute("Longitude")));
                plotCluster(point, markerCount, clusterName, 2, T1Name, !expandThis);
            } else {
                if (expandThis==true) {
                    map.removeOverlay(marker);
                } else {
                    //clearMarkersForParent(clusterName);
                    //marker.expanded = false;
                    if (marker.expanded==false) updateMarkerCount(marker, markerCount);
                }
            }            
            
            if ((expandThis==true) || ((marker) && (marker.expanded==true)) ) {
                var pins = T2Clusters[i].getElementsByTagName("marker")
                if (pins.length>0) {
                    //we have the pin info already, use it
                    for (var j = 0; j < pins.length; j++) {
                        plotMarker(pins[j], clusterName);
                    }
                } else {
                    //go get the pins for this cluster
                    getMarkers(clusterName, point.lat(), point.lng());
                }
            }
        }
    }
    


    function plotCluster(point, number, name, tier, parent, toMap) {
    

        var marker = createClusterMarker(point, number, name, tier, parent, toMap);
        if (toMap == true) {
            map.addOverlay(marker);
            clearMarkersForParent(name);
        }
        return true;
    }


    function getMarkers(clusterName, Lat, Long){

        setTimeout("updateProgressMessage('Searching...', 'Expanding: " + clusterName + "', '" + clusterName + "')", 100);
        
        var searchObj = getSearchParams(clusterName, Lat, Long)
        var oSearch = new Search();    
        oSearch.expandCluster(searchObj, function(response) {
 
                var markerXML = GXml.parse(response.result);
                plotMarkers(markerXML);

        });
    }

    function plotMarkers(markerXML){

        var cluster = SelectSingleNode(markerXML, "root/cluster");
        if (!cluster) {return;}
        var markers = markerXML.getElementsByTagName("marker");

        expanded = cluster.getAttribute("name");
        setTimeout("updateProgress(0, 'Expanding: " + expanded + "', '" + expanded + "')", 100);
        for (var i=0;i<mapMarkers.length;i++) {
           if (mapMarkers[i].name==expanded)  {
              map.removeOverlay(mapMarkers[i]);
              mapMarkers[i].expanded = true;
                break;
            }
        }

        
        for (var i = 0; i < markers.length; i++) {
            plotMarker(markers[i], expanded);
        }
        //setTimeout("updateProgress(0, 1, 'Finished')", 200);
        setTimeout("updateProgress(1, 'Finished', '" + expanded + "')", 500);

    }


    function plotMarker(marker, parent) {
        //if (!pointIsInBounds(point)) return;
        
        //spitOut("plotMarker()");
        var members = marker.getElementsByTagName("member");
        var pointCompanyIDs = []
        var pointBranchIDs = []
        
        var maxRank = 0;
        var tempMaxRank = 0;
        var pinPriority = 0;
        
        for (var j = 0; j < members.length; j++) {
            pointBranchIDs[pointBranchIDs.length] = members[j].getAttribute("BranchID");
            pointCompanyIDs[pointCompanyIDs.length] = members[j].getAttribute("CompanyID");
            
//            if (parseInt(members[j].getAttribute("BranchStatus")) > pinPriority) {
//                pinPriority = parseInt(members[j].getAttribute("BranchStatus"));
//            }
            
            tempMaxRank = Number(members[j].getAttribute("Rank"));
            
            if(tempMaxRank > maxRank){
                maxRank = tempMaxRank;
            }
            
        }
        pinPriority = parseInt(marker.getAttribute("priority"));        
        point = new GLatLng(parseFloat(marker.getAttribute("Latitude")),parseFloat(marker.getAttribute("Longitude")));

        var exists = false;
        for (var i=0;i<mapMarkers.length;i++) {
           if ((mapMarkers[i].name==name) && (mapMarkers[i].getPoint().toString() == point.toString() ))  {
              //spitOut("exists");
              exists = true;
              break;
           }
        }
        var number = pointBranchIDs.uniq().toString();
        var member = pointCompanyIDs.uniq().toString();
        if (exists != true) {
        
            markeroptions = {};
            markeroptions.number = number;
            markeroptions.name = name;
            //markeroptions.membertype = MemberType;
            //markeroptions.pinRMS = pinRMS;
            markeroptions.parent = parent;
            markeroptions.member = member;
            //markeroptions.selectedon = maxSelectedOn;
            markeroptions.rank = maxRank;
            
            map.addOverlay(createMarker(point, pinPriority, markeroptions));
        } else {
            mapMarkers[i].link = number;
            mapMarkers[i].member = member;
        }
    }


    function pointIsInBounds(point) {
        var bounds = map.getBounds();
        return bounds.contains(point);
    }


    function getExistingMarker(markerName) {
        for (var i=0;i<mapMarkers.length;i++) {
            if (mapMarkers[i].name==markerName) {
                return mapMarkers[i];
            }
        }
        return null;
    }

    function updateMarkerCount(marker, newCount) {
        if (marker.expanded == false) {
            //cluster marker visible so refresh the count on the cluster
            map.removeOverlay(marker);
            map.addOverlay(marker);
            marker.setImage("/images/overlay.aspx?a=" + marker.name + "&n=" + newCount);
        }
    }

    
    function SelectSingleNode(xmlDoc, elementPath){
        if(window.ActiveXObject)
        {
            return xmlDoc.selectSingleNode(elementPath);
        }
        else
        {
           var xpe = new XPathEvaluator();
           var nsResolver = xpe.createNSResolver( xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
           var results = xpe.evaluate(elementPath,xmlDoc,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
           return results.singleNodeValue; 
        }
    }
    
    function selectPoints(nw,ne,se,sw,nwpx,nepx,sepx,swpx) {
        //spitOut("selectPoints");
        clearTimeout(t);
        saveView();
        var bounds = new GLatLngBounds(sw, ne);

        // For each marker on the map...
     	for (var i = 0; i < mapMarkers.length; i++) {
		    
                if(mapMarkers[i].name != ""){
                   
                    if((bounds.contains(mapMarkers[i].getPoint())) && (mapMarkers[i].expanded == false)){
			            
			            mapMarkers[i].selected = true;
			            mapMarkers[i].setImage("/images/overlay.aspx?a=" + mapMarkers[i].name + "&n=" + mapMarkers[i].link_number + "&m=1");
			         } else if (mapMarkers[i].expanded == false) {
			            mapMarkers[i].selected = false;
			            mapMarkers[i].setImage("/images/overlay.aspx?a=" + mapMarkers[i].name + "&n=" + mapMarkers[i].link_number);
			         }
		     
                // ... if the marker is a member pin
                } else {

                    // ... 
                    if(bounds.contains(mapMarkers[i].getPoint())){
                         mapMarkers[i].selected = true;
                        mapMarkers[i].setImage(pinImages[mapMarkers[i].imageIndex][4]);
                    } else {
                        mapMarkers[i].selected = false;
                        mapMarkers[i].setImage(pinImages[mapMarkers[i].imageIndex][mapMarkers[i].priority]);
                    }
                
                }
        }
        var oLatLong = map.getCenter();
        
        oSearchParams = getSearchParams('', oLatLong.lat(), oLatLong.lng(),  sw.lat(), sw.lng(), ne.lat(), ne.lng());

        var JSONstring = JSON.stringify(oSearchParams);
        //URI encode as well so as not to lose the pluses in C++
        var escapedJSON = encodeURIComponent(JSONstring);
        setCookie("previoussearch", escapedJSON);

        
        var sURL = '';
        
        if(iSearchMemberType == 1){
            sURL = 'http://' + document.domain + '/m/cvviewer/default.aspx?k=' + encodeURIComponent(getSearchKeywords());
        } else {
            sURL = 'http://' + document.domain + '/m/companyviewer/default.aspx?k=' + encodeURIComponent(getSearchKeywords());
        }
        var newwindow = window.open(sURL, 'SearchResults', 'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=800,height=400');
        newwindow.focus();
}        
              
    function fnMapMovedEnd(){


        if (bEnableMoveSearch== true){
            var center =  map.getCenter();

                var oldCenter = new GLatLng(CurrentLat, CurrentLong);
                var pOld = map.fromLatLngToDivPixel(oldCenter);
                var pNew = map.fromLatLngToDivPixel(center);

                //only requery if the map has moved more than 200 pixels horizontally or 100 vertically
                if ((Math.abs(pOld.x - pNew.x) > sensitivityX) || (Math.abs(pOld.y - pNew.y) > sensitivityY)) {  
                
                    CurrentLat = center.lat();
                    CurrentLong = center.lng();
                    //alert("fnMapMovedEnd Lat:" + CurrentLat + "  Long:" + CurrentLong);
                    fnSubmitLatLong(center.lat() , center.lng());
                    clearMarkers();
                }
                saveView();
                clearTimeout(t);
        }
    } 


    function fnGetSpan(zoomLevel) {
        //spitOut("fnGetSpan:" + zoomLevel);
        var projection = map.getCurrentMapType().getProjection()
        //get centre pixel at requested zoom level
        var px = projection.fromLatLngToPixel(map.getCenter(),zoomLevel);
        //get container width
//        var mapW = parseInt(container.style.width) + sensitivityX;
//        var mapH = parseInt(container.style.height) + sensitivityY;
        var mapW = parseInt(container.offsetWidth) + sensitivityX;
        var mapH = parseInt(container.offsetHeight) + sensitivityY;
        //get corner pixels
        var pSW = new GPoint(px.x - mapW/2, px.y + mapH/2);
        var pNE = new GPoint(px.x + mapW/2, px.y - mapH/2);
        //convert corners to lat & long
        var lSW = projection.fromPixelToLatLng(pSW, zoomLevel, true);
        var lNE = projection.fromPixelToLatLng(pNE, zoomLevel, true);


	    spanLat = (lNE.lat() - lSW.lat())/2;
        spanLong = (lNE.lng() - lSW.lng())/2;
    }
    function fnGetBounds(zoomLevel) {
        //spitOut("fnGetBounds:" + zoomLevel);
        var projection = map.getCurrentMapType().getProjection()
        //get centre pixel at requested zoom level
        var px = projection.fromLatLngToPixel(map.getCenter(),zoomLevel);
        //get container width
//        var mapW = parseInt(container.style.width) + sensitivityX;
//        var mapH = parseInt(container.style.height) + sensitivityY;
        var mapW = parseInt(container.offsetWidth) + sensitivityX;
        var mapH = parseInt(container.offsetHeight) + sensitivityY;
        //get corner pixels
        var pSW = new GPoint(px.x - mapW/2, px.y + mapH/2);
        var pNE = new GPoint(px.x + mapW/2, px.y - mapH/2);
        //convert corners to lat & long
        var lSW = projection.fromPixelToLatLng(pSW, zoomLevel, true);
        var lNE = projection.fromPixelToLatLng(pNE, zoomLevel, true);
        return new GLatLngBounds(lSW, lNE);
    }
    

    function getSearchBounds(radius) {
        /*  
            Dev:    Steve Brockton
            Date:   2007-09-18
            Desc:   get the bounds required for a search radius
        */
        var centre = map.getCenter();
        var point;
        var point = getPointBearingDist(centre, 180, radius);
        var minLat = point.lat();
        var point = getPointBearingDist(centre, 0, radius);
        var maxLat = point.lat();
        var point = getPointBearingDist(centre, 270, radius);
        var minLng = point.lng();
        var point = getPointBearingDist(centre, 90, radius);
        var maxLng = point.lng();
        return new GLatLngBounds(new GLatLng(minLat, minLng), new GLatLng(maxLat, maxLng))
    }
    
    function clearMarkers() {
        //spitOut("clearMarkers Start:" + mapMarkers.length);
    
        //var bounds = map.getBounds();
        var bounds = fnGetBounds(zoomLevel);
        var keepMarkers = [];
        var keepParents = new Array();

        //Get parents of all markers in bounds
        for (var i = 0; i < mapMarkers.length; i++) {
            //if ((bounds.contains(mapMarkers[i].getPoint())) && (mapMarkers[i].markerParent > "")) {
            if (bounds.contains(mapMarkers[i].getPoint())) {
                if(mapMarkers[i].markerParent > "") keepParents[mapMarkers[i].markerParent] = 1
                else keepParents[mapMarkers[i].name] = 1;
            }
        }
        
        //Push the markers associated with the parents to the keep array
        for (var i = 0; i < mapMarkers.length; i++) {
            if ((keepParents[mapMarkers[i].markerParent] == 1) || ((mapMarkers[i].markerParent == "") && (keepParents[mapMarkers[i].name] == 1))) {
                keepMarkers.push(mapMarkers[i]);
            } else {
                map.removeOverlay(mapMarkers[i]);
            }
        }

        mapMarkers = keepMarkers;
        //spitOut("clearMarkers End:" + mapMarkers.length);
    }

    function clearMarkersForParent(parent) {

        var keepMarkers = [];
        var children = [];
        for (var i = 0; i < mapMarkers.length; i++) {

            if (mapMarkers[i].markerParent != parent) {
                keepMarkers.push(mapMarkers[i]);
            } else {

                map.removeOverlay(mapMarkers[i]);
                //check whether this marker is potentially a parent
                if (mapMarkers[i].name>"") children.push(mapMarkers[i].name);
            }
        }        
        mapMarkers = keepMarkers;
        
        //delete children (recursive call)
        for (var i = 0; i < children.length; i++) {
            clearMarkersForParent(children[i]);
        }
    }

	 function clearAllMarkers() {
        //spitOut("clearAllMarkers()");
        map.clearOverlays();
        mapMarkers = [];
    }

    function fnSubmitLatLong(Lat,Long){

        var searchWords = getSearchKeywords();
        get_points('', Lat, Long);
    }

    
    function doSearch(){
        
        var center =  map.getCenter();
        map.clearOverlays();
        mapMarkers = [];
        
        //var searchWords = getSearchKeywords();
        var pcode = getSearchLocation();
        clearAdvancedSearch();

        if ((pcode.length > 0)) {
            if ($("advanced")) {
                if (pcode.length > 0) $("txtLocation").value = pcode;
            }
            //bEnableMoveSearch = true;
            sightseeing = false;
            get_points(pcode, center.lat(),center.lng());
//            if (iMemberType > 0) { 
//                var oMember = new Member();
//                oMember.storeSearchCriteria(pcode, searchWords);
//            }
            cacheSearchLocal(pcode, '');
        } else {
            bEnableMoveSearch = false;
            displayError("Select location and/or keywords");
//           $('search-location').focus();
        }
        
        return false;
    }

    function cacheSearchLocal(pcode, keyword) {

//        var searchWords = getSearchKeywords();
//        var pcode = getSearchLocation();
//        var locCombo = storeLocations;
//        var locKeywords = storeKeywords;
//        var bFound = false;
//        
//        if (pcode.length > 0) {
//            var iLength = Ext.personalization.locations.length;
//            for(var i = 0; i < iLength; i++){
//                
//                if(Ext.personalization.locations[i][1] == pcode){
//                    bFound = true;
//                    break;
//                }    
//            }

//            if(bFound == false){
//                var locID = iLength;     
//           
//                comboLocations.doQuery('', true)  //necessary to remove filter and so see all of store
//                storeLocations.insert(0, new Ext.data.Record({id:locID, location:pcode}));
//                comboLocations.setValue(pcode);
//                comboLocations.collapse();
//            }
//        
//           if (iLength > 10) {
//                //remove oldest entry
//                storeLocations.remove(storeLocations.getAt(storeLocations.getCount() - 1));
//            }
//        }
//        
//        bFound = false;
//        if (keyword.length > 0){
//              var iLength = Ext.personalization.keywords.length;
//              
//              for(var i = 0; i < iLength; i++){
//                
//                if(Ext.personalization.keywords[i][1] == keyword){
//                    bFound = true;
//                    break;
//                }    
//            }

//            if(bFound == false){
//                var keyID = iLength;     
//           
//                comboKeywords.doQuery('', true)  //necessary to remove filter and so see all of store
//                storeKeywords.insert(0, new Ext.data.Record({id:locID, keyword:keyword}));
//                comboKeywords.setValue(keyword);
//                comboKeywords.collapse();
//            }
//        
//            if (iLength > 10) {
//                //remove oldest entry
//                storeKeywords.remove(storeKeywords.getAt(storeKeywords.getCount() - 1));
//            }
//        }

//        //$('submitSearch').focus();
    }

    function getValueForID(theArray, theID) {
        for (var i = 0; i < theArray.length; i++) {
            if (theArray[i][0]==theID) return theArray[i][1];
        }
        return "";
    }
    
    function getIDForValue(theArray, theValue) {
        for (var i = 0; i < theArray.length; i++) {
            if (theArray[i][1]==theValue) return theArray[i][0];
        }
        return -1;
    }

    function saveState(spcode, sLat, sLong, sPC, sMemberType, sWhereClause, sZoom) {
        resetState();

        var now = new Date();
        fixDate(now);
        now.setTime(now.getTime() + (10 * 60 * 1000));  // 10 mins
        //setCookie("Name", userName, now, "/");
        setCookie("pcode", spcode, now, "/");
        setCookie("Lat", sLat, now, "/");
        setCookie("Long", sLong, now, "/");
        setCookie("PC", sPC, now, "/");
        setCookie("MemberType", sMemberType, now, "/");
        setCookie("WhereClause", sWhereClause, now, "/");
        setCookie("Zoom", sZoom, now, "/");
        setCookie("Exp", expanded, now, "/");


    }
    
    function saveView() {

            //spitOut("saveView");
            var now = new Date();
            fixDate(now);
            now.setTime(now.getTime() + (10 * 60 * 1000));  // 10 mins
            var sCentre = map.getCenter();
            //setCookie("Name", userName, now, "/");
            setCookie("Lat", sCentre.lat(), now, "/");
            setCookie("Long", sCentre.lng(), now, "/");
            setCookie("Zoom", zoomLevel, now, "/");    

    }
    
    function saveExpanded() {
            var now = new Date();
            fixDate(now);
            now.setTime(now.getTime() + (10 * 60 * 1000));  // 10 mins
            setCookie("Exp", expanded, now, "/");    
    }

    function restoreState() {
//console.log(' restoring state');
//        if(iMemberID > 0)
//        {
//        
//            var spcode = getCookie("pcode");
//            var sLat = getCookie("Lat");
//            var sLong = getCookie("Long");
//            var sPC = getCookie("PC");
//            var sMemberType = getCookie("MemberType");
//            var sWhereClause = getCookie("WhereClause");
//            var sZoom = getCookie("Zoom");
//            
//            expanded = getCookie("Exp");

//            //spitOut("restoreState " + sname + ";" + spcode + ";" + sLat + ";" + sLong + ";" + sPC + ";" + sMemberType + ";" + sWhereClause + ";" + sZoom + ";" + expanded);
//            if ((((spcode) && (spcode > "") && (spcode != "null")) || ((sLat) && (sLat > "") && (sLat != "null")))) {
//                currLat = sLat;
//                currLong = sLong;
//                zoomLevel = parseInt(sZoom);


//                if ((sWhereClause > "") && (sWhereClause != "null")) {
//                    $('search-keywords').value = sWhereClause;
//                }
//                if ((spcode > "") && (spcode != "null")) {
//                    $('search-location').value = spcode;
//                    doSearch();
//                } else {
//                    fnSubmitLatLong(currLat, currLong);
//                }
//                //map.setZoom(zoomLevel);
//                //spitOut("restored zoom " + zoomLevel + " map:" + map.getZoom());
//            }
//        }

    }


    function resetState() {
        //spitOut("resetState");
        deleteCookie("pcode", "/");
        deleteCookie("Lat", "/");
        deleteCookie("Long", "/");
        deleteCookie("PC", "/");
        deleteCookie("MemberType", "/");
        deleteCookie("WhereClause", "/");
        deleteCookie("Zoom", "/");
        deleteCookie("Exp", "/");
    }


   

    // date - any instance of the Date object
    // * hand all instances of the Date object to this function for "repairs"
    function fixDate(date) {
      var base = new Date(0);
      var skew = base.getTime();
      if (skew > 0)
        date.setTime(date.getTime() - skew);
    }

 
    function displayError(sMessage)
    {
        /*
        $("OnMapError").style.display = "block";
        $("OnMapError").innerHTML = sMessage;
        window.setTimeout('$("OnMapError").style.display = "none";', 5000);
        */
        Ext.MessageBox.show({Title:'Error', msg:sMessage, modal:false});
        window.setTimeout('Ext.MessageBox.hide();', 5000);
    }
    
    function showProgress(sTitle, sMessage) {
        progress.style.display = "block";
        progressstatus.style.width = "1px";
        progressmessage.innerHTML = sMessage;
    }
    
    function updateProgress(percent, sMessage, clusterName) {
        progress.style.display = "block";

        if ((clusterName) && (!msgNames.contains(clusterName))) msgNames.push(clusterName);

        var iPercent = parseFloat(progressbar.style.width) /100 ;

        if ((percent>=0) || (percent<=1)) {
            
            progressstatus.style.width = ((100 * percent) * iPercent) + "px";
            progressmessage.innerHTML = sMessage;

        }
        if (percent>=1) {
            //check for outstanding messages before hiding
            if (clusterName) msgNames = msgNames.without(clusterName);
            if (msgNames.length==0) window.setTimeout('progress.style.display = "none";', 500);
        }
    }
    
    function updateProgressMessage(sTitle, sMessage, clusterName)
    {
        if (progress.style.display == "none") showProgress(sTitle, sMessage);
        else progressmessage.innerHTML = sMessage;
        if ((clusterName) && (!msgNames.contains(clusterName))) msgNames.push(clusterName);
    }
    
     function disambiguate(places) 
     {
        if(places.length > 1){
             var placeDiv = document.getElementById("places");
             var sReturnedHTML = ''
             var x = places.length;
             if(x>5){x = 5;}
             
             for (var i = 0; i < x; i++) {
                var distance = String(Math.round(parseFloat(places[i].getAttribute("Distance"))*10)/10);
                var lat = parseFloat(places[i].getAttribute("Lat"));
                var lng = parseFloat(places[i].getAttribute("Long"));
                
                sReturnedHTML += '<div class="place">'
                sReturnedHTML += '  <a href="#" onclick="return showLocation(' + lat + ',' + lng + ',\'' + places[i].getAttribute("PlaceName") + '\'' + ');" title="'+ places[i].getAttribute("Country")  + '"><img src="http://static.zubed.com/images/flags/' + places[i].getAttribute("CountryCode") + '.gif" alt="'+ places[i].getAttribute("Country")  + '" /> ' + places[i].getAttribute("PlaceName") + " (" + parseInt(distance) + " miles away)</a>";
                sReturnedHTML += '</div>';
             }
             
            $('places-content').innerHTML = sReturnedHTML;
            $('places').style.display = 'block';
       } else {
            $('places').style.display = 'none';
       }
    }
    
    function showLocation(lat, lng, place)
    {
        map.panTo(new GLatLng(lat, lng));
        if($('txtLocation')) {
            $('txtLocation').value = place;
        }
        return false;
    }
    
    
//    function MapModeControl() {}
//    MapModeControl.prototype = new GControl();
//    MapModeControl.prototype.initialize = function(map) {
//        var container = document.createElement("div");
//        
//        var buttonAvailability = document.createElement("div");
//        buttonAvailability.id = 'button-availability'
//        this.setButtonStyle_(buttonAvailability);
//        container.appendChild(buttonAvailability);
//        buttonAvailability.appendChild(document.createTextNode("Availability"));
//        GEvent.addDomListener(buttonAvailability, 'click', function(e) {
//             doChangeMapMode('availability');
//        });
//        
//        var buttonSelected = document.createElement("div");
//        this.setButtonStyle_(buttonSelected);
//        buttonSelected.id="button-selected";
//        container.appendChild(buttonSelected);
//        buttonSelected.appendChild(document.createTextNode("Viewed"));
//        GEvent.addDomListener(buttonSelected, 'click', function(e) {
//            doChangeMapMode('selected');
//        })

//        var buttonRanking = document.createElement("div");
//            buttonRanking.id="button-rank";
//            this.setButtonStyle_(buttonRanking);
//            container.appendChild(buttonRanking);
//            buttonRanking.appendChild(document.createTextNode("Ranking"));
//            GEvent.addDomListener(buttonRanking, 'click', function(e) {
//                 doChangeMapMode('rank');
//        });
//        
//       
//    
//        map.getContainer().appendChild(container);
//        
//         $('button-' + sMapMode).style.fontWeight = 'bold';
//        $('button-' + sMapMode).style.border = "2px solid black";
//        
//        
//        return container;
//    }

//    MapModeControl.prototype.getDefaultPosition = function() {
//        return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10, 20));
//    }


//MapModeControl.prototype.setButtonStyle_ = function(button) {
//  button.style.float = "left";
//  button.style.textDecoration = "none";
//  button.style.color = "#000000";
//  button.style.backgroundColor = "white";
//  button.style.font = "12px Arial";
//  button.style.fontWeight = "normal";
//  button.style.border = "1px solid black";
//  button.style.padding = "2px";
//  button.style.marginBottom = "3px";
//  button.style.textAlign = "center";
//  button.style.width = "6em";
//  button.style.cursor = "pointer";

//}

function doChangeMapMode(sMode,e)
{
    sMapMode = sMode;
    var iLength = mapMarkers.length;
    $('legend-availability').style.display = 'none';
    $('legend-rank').style.display = 'none';
    $('legend-selected').style.display = 'none';
    
    $('button-availability').style.fontWeight = 'normal';
    $('button-rank').style.fontWeight = 'normal';
    $('button-selected').style.fontWeight = 'normal';
    $('button-availability').style.border = "1px solid black";
    $('button-rank').style.border = "1px solid black";
    $('button-selected').style.border = "1px solid black";
    
    
    $('legend-' + sMode).style.display = 'block';
    $('button-' + sMode).style.fontWeight = 'bold';
    $('button-' + sMode).style.border = "2px solid black";
    iMaxRank = 0;
    iMinRank = 0;
    for (var i = 0; i < iLength; i++) {
        

        if(mapMarkers[i].tier == 3){
            mapMarkers[i].setImage(getMarkerImage(sMapMode,mapMarkers[i]));
        }
    }
}

var iMaxRank = 0;
var iMinRank = 0;
function getMarkerImage(sMode, oMarker)
{
    var sImage = '/images/markers/marker_default.png';
    iMaxRank = Math.max(iMaxRank, oMarker.rank);
    iMinRank = Math.min(iMaxRank, oMarker.rank);
    
    if(sMode == 'availability'){
        var i;
        if (oMarker.membertype) i=oMarker.membertype - 1;
        //else i=oMarker.imageIndex;
        else i=0;

        //if (oMarker.priority){
            sImage = pinImages[i][oMarker.priority]; 
        //}
    } else if(sMode == 'rank'){
        var iRank = oMarker.rank;
        
        if(iRank > 200){
            sImage = '/images/markers/marker_rank_1.png';
        } else if(iRank > 175){
            sImage = '/images/markers/marker_rank_2.png';
        } else if(iRank > 150){
            sImage = '/images/markers/marker_rank_3.png';
        } else if(iRank > 125){
            sImage = '/images/markers/marker_rank_4.png';
        } else if(iRank > 100){
            sImage = '/images/markers/marker_rank_5.png';
        } else if(iRank > 75){
            sImage = '/images/markers/marker_rank_6.png';
        } else if(iRank > 50){
            sImage = '/images/markers/marker_rank_7.png';
        } else if(iRank > 25){
            sImage = '/images/markers/marker_rank_8.png';
        } else {
            sImage = '/images/markers/marker_rank_9.png';
        }
    } else if(sMode == 'selected'){
        if(oMarker.selectedon){
            var dNow = new Date();
            var one_day=1000*60*60*24;
            
            var datediff = Math.ceil(dNow.getTime()-oMarker.selectedon.getTime());
            var iDaysAgo = datediff / one_day;
            
            if(iDaysAgo < 1){
                sImage = '/images/markers/marker_activity_day0.png';
            } else if (iDaysAgo <= 7){
                sImage = '/images/markers/marker_activity_day5.png'
            } else if (iDaysAgo <= 30){         
                sImage = '/images/markers/marker_activity_day30.png';
            } else{
                sImage = '/images/markers/marker_activity_day99.png';
            }
        }
    }
    return sImage;
}




function displayMarker(oMarker)
{
    /*  Dev:    James Pearson
        Date:   2007-08-22
        Desc:   Shows the information for a marker 
        Upd:    Steve Brockton
        Date:   2008-02-22
        Desc:   Converted to display company branch details 
        */
        
        // Update the markers selected date
        oMarker.selectedon = new Date();
        // Prepare to loop through all the members on the pin, with a limit of 5 members.
        var sReturnedHTML = ''
        var x = 1;

        sReturnedHTML += '<div class="bubble" style="width: 200px;">';
        sReturnedHTML += '   <p>1 Company found</p>';
        
        sReturnedHTML += '       <ul>';
        
        var sName = '';
        // Loop through each branch on the pin.
        for (var i = 0; i < x; i++){
        
            sReturnedHTML += '  <li>';
            
            //sReturnedHTML += '      <div style="width: 50px; height: 10px; border: 1px solid black; float: left">111</div>';
            sReturnedHTML += '      <div>';
       
            sReturnedHTML += '          <a href="../registration" onclick="return displaySummary(1);" title="View summary">Register for details</a>';
            sReturnedHTML += '      </div>';
            sReturnedHTML += '  </li>';
        }
        sReturnedHTML += '</div>';
        
            displaySummary(1);
         
        oMarker.setImage(getMarkerImage(sMapMode, oMarker)); 
        // Show the generated marker information
        oMarker.openInfoWindowHtml(sReturnedHTML); 
}
 

function displaySummary(iBranchID){
    /*  Dev:    James Pearson
        Date:   2007-08-22
        Desc:   Displays a scrubbed or unscrubbed summary of a person 
        Upd:    Steve Brockton
        Date:   2008-02-22
        Desc:   Display details of a branch
    */
        
    if (iBranchID==0) return;
    var msg = 'Register for details';
    // Get the summary box.
    var divBranch = $('branchDetails');
    
    // Display the members basic details, scrubbing is done server side.
    //console.log(oDetails)
    $('branch-description').innerHTML = msg;
    //$('branch-email').innerHTML = oDetails.email;
    $('branch-phone1').innerHTML = msg;
    $('branch-phone2').innerHTML = msg;
    $('branch-employeecount').innerHTML = msg;
    $('branch-turnover').innerHTML = msg;

//    var iNoteLength = oDetails.notes.length;
    $('branch-notes').innerHTML = msg;
    $('branch-diary').innerHTML = msg;
    $('branch-contacts').innerHTML = msg;


    doCloseSideBar('branchDetails,Legend');
    // If the contract details box is not currently displayed...
    if(divBranch.style.display == "none"){
          // ... display it.
          window.setTimeout('Effect.BlindDown($("branchDetails"));', 500);
          //window.setTimeout('doToggleSection("contractor");', 750);
    } else {
        //if it is collapsed
        if($('branchDetails-content').style.display == "none"){
          // ... expand it.
          doToggleSection('branchDetails');
        }
    }
    
    // Once the data is displayed, record that the member was selected.
    //window.setTimeout('doRecordMemberSelection(\''+ iBranchID + '\');', 1000);
    
  
}

function updateStatus(iBranchID, iStatusID)
{
    var apiCompanyBranch = new CompanyBranchAPI();
    
   console.log( apiCompanyBranch.updateStatus(iBranchID, iStatusID));
    
}
function displayDiary(iCompanyID, iBranchID)
{
    var apiCalendarEvent = new CalendarEventAPI();
    var oEvents = apiCalendarEvent.readByBranchID(-1,iBranchID);
       
    var t = new Ext.Template(
            '<div name="event{iD}">',
                '{time}<br/>',
                '{title}<br/>{description}',
                '',
            '</div><hr/>');
            
    var sEvents = '';
    
    for(var i = 0; i < oEvents.length; i++){
        var oEvent = oEvents[i];
        
        var start = new Date();
        var end = new Date();
        
        start.setISO8601(oEvent.startDate);
        end.setISO8601(oEvent.endDate);
        oEvent.time = start.format('d/m/Y H:i') + ' - ' + end.format('H:i');
        
        sEvents += t.applyTemplate(oEvent);
        
    }
    if(sEvents == ''){
        sEvents  = 'There are no notes for this company<br/>';
    }
    
    sEvents += '<a href="#" class="linkAdd" onclick="calendarevent_create('+ iCompanyID + ',' + iBranchID + '); return false;">Add an appointment</a>';
    $('branch-diary').innerHTML = sEvents;
}


function displayContacts(iCompanyID, iBranchID)
{
    var apiCompanyContact = new CompanyContactAPI();

    var oContacts = apiCompanyContact.readByBranchID(iCompanyID, iBranchID);
      
    var t = new Ext.Template(
            '<div name="contact{id}">',
                '<strong>{firstName} {lastName}</strong> ({jobTitle})<br/>',
                '<span class="linkPhone1">{phone1}</span><br/>',
                '<span class="linkPhone2">{phone2}</span>',
            '</div><hr/>');
            
            var sContacts = '';
    for(var i = 0; i < oContacts.length; i++){
        var oContact = oContacts[i];
        
        sContacts += t.applyTemplate(oContact);
        
    
    }
    if(sContacts == ''){
        sContacts  = 'There are no contacts at this branch<br/>';
    }
     sContacts += '<a href="#" class="linkAdd" onclick="contact_create('+ iCompanyID + ',' + iBranchID + '); return false;">Add a contact</a>';
    $('branch-contacts').innerHTML = sContacts;
}

function displayNotes(iCompanyID, iBranchID)
{
    var apiNote = new NoteAPI();
    var oNotes = apiNote.readByBranchID(iBranchID);
       
    var t2 = new Ext.Template(
            '<div name="note{id}">',
                '<p>{content}</p>',
                '{formattedDate}',
                '',
            '</div><hr/>');
            
    var sNotes = '';
    for(var i = 0; i < oNotes.length; i++){
        var oNote = oNotes[i];
        
          var updated = new Date();
        
            updated.setISO8601(oNote.updatedOn);
           oNote.formattedDate = updated.format('d/m/Y H:i');
        
        sNotes += t2.applyTemplate(oNote);
        
    
    }
    if(sNotes == ''){
        sNotes  = 'There are no notes for this branch<br/>';
    }
    
    sNotes += '<a href="#" class="linkAdd" onclick="note_create('+ iCompanyID + ',' + iBranchID + '); return false;">Add a note</a>';
    $('branch-notes').innerHTML = sNotes;
}

function doRecordMemberSelection(iSelectedMemberID)
{
    /*  Dev:    James Pearson
        Date:   2007-08-24
        Desc:   Displays a scrubbed or unscrubbed summary of a person */
        
    // Create a new member object for API access
    var oBranch = new Member();
    
    // Record the selection of a member by the user (iMemberID).
    var oDetails = oBranch.storeMemberSelection(iMemberID,iSelectedMemberID);
}


function selectBranchTab(sSelectedTab)
{
    oTabContacts = $('branch-contacts-tab');
    oTabNotes = $('branch-notes-tab');
    oTabDiary = $('branch-diary-tab');
    
    oContentContacts  = $('branch-contacts');
    oContentNotes   = $('branch-notes');
    oContentDiary = $('branch-diary');
    
    oTabContacts.removeClassName('tabselected');
    oTabNotes.removeClassName('tabselected');
    oTabDiary.removeClassName('tabselected');
    
    oContentContacts.style.display = 'none';
    oContentNotes.style.display = 'none';
    oContentDiary.style.display = 'none';
    
    switch(sSelectedTab)
    {
        case 'contacts':
            oTabContacts.addClassName('tabselected')
            oContentContacts.style.display = 'block';
            break;
        case 'notes':
            oTabNotes.addClassName('tabselected')
            oContentNotes.style.display = 'block';
            break;
        case 'diary':
            oTabDiary.addClassName('tabselected')
            oContentDiary.style.display = 'block';
            break;
              
    }
}

function displaySummaryRequirement(memberID, requirementID){
    /*  Dev:    Steve Brockton
        Date:   2007-09-07
        Desc:   Displays the summary information for a requirement */
        
    // Create a new member object to access the API
    var oRequirement = new Requirement(); 
    
    // Get the requirement details as a javascript object.
    var oDetails = oRequirement.getSummaryInfo(iMemberID, requirementID, memberID);

/*    
    // Get the summary box.
    var divContractor = $('contractor');
    
    // Display the members basic details, scrubbing is done server side.
    $('contractor-title').innerHTML = oDetails.displayname + ' <small>(<a href="#" onclick="viewcv(' + oDetails.id + '); return false;">view cv</a>)</small>' ;
    $('contractor-email').innerHTML = oDetails.email;
    $('contractor-phone').innerHTML = oDetails.phone;
    
    if(typeof oRequirement != 'undefined'){  
        $('contractor-availability').innerHTML = oDetails.availability;
        $('contractor-rate').innerHTML = oDetails.rate;
    } else {
        $('contractor-availability').innerHTML = 'Unknown';
        $('contractor-rate').innerHTML = 'Unknown';
    }
    
    if(oDetails.cvsummary){
        $('cvsummary').innerHTML = oDetails.cvsummary;
    }
    
    
    var iNoteLength = oDetails.notes.length;
    $('contractor-notes').innerHTML = '';
    if(iNoteLength > 0){
        var t = new Ext.Template(
            '<div name="note{id}">',
                '<p>{text}</p>',
                '<span>{dateformatted}</span>',
            '</div>'
        );
        var oDate = new Date;
        
        for(var i = 0; i < iNoteLength; i++){
            oDate.setISO8601(oDetails.notes[i].date);
            oDetails.notes[i].dateformatted = oDate;
            
            t.append('contractor-notes', oDetails.notes[i]);        
        }
        new Insertion.Top('contractor-notes', "<h3>Notes</h3>");
    } 

    doCloseSideBar('contractor');
    // If the contract details box is not currently displayed...
    if(divContractor.style.display == "none"){
          // ... display it.
          window.setTimeout('Effect.BlindDown($("contractor"));', 1000);
    }
    
    // Once the data is displayed, record that the member was selected.
    window.setTimeout('doRecordMemberSelection(\''+ iDisplayMemberID + '\');', 1000);
*/
}

function advancedSearch() {
    /*  
        Dev:    Steve Brockton
        Date:   2007-08-29
        Desc:   Perform an advanced search.
    */
    
    clearMap = true;
    //var searchWords = $F("txtKeywords");
    var searchLoc = $F("txtLocation");
//    $("search-location").value = searchLoc;
    //$("search-keywords").value = searchWords;
    //bEnableMoveSearch = true;
    get_points(searchLoc, CurrentLat, CurrentLong);
//    if (iMemberType > 0) { 
//        var oMember = new Member();
//        oMember.storeSearchCriteria(searchLoc, searchWords);
//    }
    cacheSearchLocal(searchLoc, '');
    
}

function clearAdvancedSearch() {
    if ($("advanced")) {
        $('txtLocation').value = '';
//        $('txtSICSearch').value = '';
//        $('SIC-searchintro').style.display = 'none';
//        $('SIC-search').innerHTML = '';
//        $('SIC-selected').innerHTML = '';
//        $('SIC-search-more').innerHTML = '';
//        searchSIC = [];
        $('txtBTSearch').value = '';
        $('BT-searchintro').style.display = 'none';
        $('BT-search').innerHTML = '';
        $('BT-selected').innerHTML = '';
        $('BT-search-more').innerHTML = '';
        searchBT = [];
    }
}
 
function getSearchParams(location, CentreLat, CentreLong, SWLat, SWLong, NELat, NELong) {    
    //increment search identifier
    searchID += 1;
    
    //create default parameter object
    var searchParams = new Object;
    searchParams.searchID = searchID;
    searchParams.CentreLat = CentreLat;
    searchParams.CentreLong = CentreLong;
    searchParams.SWLat = SWLat;
    searchParams.SWLong = SWLong;
    searchParams.NELat = NELat;
    searchParams.NELong = NELong;
    searchParams.location = location;
    searchParams.name = '';                
    searchParams.SICcodes = [];              
    searchParams.Sectors = [];              
    searchParams.BusinessTypeIDs = [];              
    searchParams.StatusID = 2;
    
    if ($("advanced")) {
        // Fill in advanced search options (override default values)
        searchParams.SICcodes = searchSIC;
        searchParams.BusinessTypeIDs = searchBT;
    }
    
    return searchParams;
}

/*
function getCurrencyOpts() {
    var oSearch = new Search();
    oSearch.getCurrencies(function(response) {
        if (response.result) {
            aCurrencies = eval("(" + response.result + ")");
            for (var i = 0; i < aCurrencies.length; i++) {
                var optCurrency = new Option(aCurrencies[i].CurrencyDesc, aCurrencies[i].CurrencyID)
                $("drpCurrency").options[i] = optCurrency;
                if (aCurrencies[i].CurrencyID == "GBP") $("drpCurrency").options[i].selected = "selected";
            }
        }
    });
}
*/

//function doSkillAdd(iSkillID, sSkill)
//{
//    $('skills-search' + iSkillID).remove();
//    $('txtSkillSearch').value = '';
//    $('txtSkillSearch').focus();
//    //UNCOMMENT if we go back to advanced search using member skill table
//    $('skills-selected').innerHTML += '<li id="skill'+ iSkillID + '"><a href="#" onclick="return doSkillRemove(' + iSkillID + ');" title="Remove this skill"><img src="http://static.zubed.com/images/icons/delete.gif"/> ' +  sSkill + '</a></li>';
//    searchSkills.push(iSkillID);
////    var sToken ='';
////    if ($F('txtKeywords').length>0) sToken = ' AND '
////    $('txtKeywords').value += sToken + '"' + sSkill + '"'
//    return false;
//}

//function doSkillRemove(iSkillID)
//{
//    $('skill' + iSkillID).remove();
//    searchSkills = searchSkills.without(iSkillID);
//    return false;
//}            

function doSectorAdd(iSectorID, sSector)
{
    $('sector-search' + iSectorID).remove();
    $('txtSectorSearch').value = '';
    $('txtSectorSearch').focus();
    $('sectors-selected').innerHTML += '<li id="sector'+ iSectorID + '"><a href="#" onclick="return doSectorRemove(' + iSectorID + ');" title="Remove this sector"><img src="http://static.zubed.com/images/icons/delete.gif"/> ' +  sSector + '</a></li>';
    searchSectors.push(iSectorID);
    return false;
}

function doSectorRemove(iSectorID)
{
    $('sector' + iSectorID).remove();
    searchSectors = searchSectors.without(iSectorID);
    return false;
}            


function doSICAdd(iSICID, sSICCode)
{
    //$('SIC-search' + iSICID).remove();
    
    var listElements = $$('li.SIC-search' + iSICID);
    for (var i = 0; i < listElements.length; i++) {
        listElements[i].remove();        
    }
    
    $('txtSICSearch').value = '';
    $('txtSICSearch').focus();
    $('SIC-selected').innerHTML += '<li id="sic'+ iSICID + '"><a href="#" onclick="return doSICRemove(' + iSICID + ');" title="Remove this SIC Code"><img src="http://static.zubed.com/images/icons/delete.gif"/> ' +  sSICCode + '</a></li>';
    searchSIC.push(iSICID);
    return false;
}

function doSICRemove(iSICID)
{
    $('sic' + iSICID).remove();
    searchSIC = searchSIC.without(iSICID);
    return false;
}            

function doBTAdd(iBTID, sBT)
{
    $('BT-search' + iBTID).remove();
    $('txtBTSearch').value = '';
    $('txtBTSearch').focus();
    $('BT-selected').innerHTML += '<li id="BT'+ iBTID + '"><a href="#" onclick="return doBTRemove(' + iBTID + ');" title="Remove this BT"><img src="http://static.zubed.com/images/icons/delete.gif"/> ' +  sBT + '</a></li>';
    searchBT.push(iBTID);
    return false;
}

function doBTRemove(iBTID)
{
    $('BT' + iBTID).remove();
    searchBT = searchBT.without(iBTID);
    return false;
}            
    

function getPointBearingDist(startPoint, bearing, distance){
    /*  
        Dev:    Steve Brockton
        Date:   2007-09-18
        Desc:   Calculate a point X miles away on a given bearing
    */
    //Convert everything to radians ('cos the world is round)
    var destLat = 0;
    var destLng = 0;
    var Lat = startPoint.lat() * (Math.PI/180);
    var Lng = startPoint.lng() * (Math.PI/180);
    var course = bearing * (Math.PI/180);
    var dist = (Math.PI/(180*60))* distance;
    
    destLat = Math.asin((Math.sin(Lat)*Math.cos(dist))
                + (Math.cos(Lat)*Math.sin(dist))*Math.cos(course));

    if (Math.cos(destLat)==0) {
        destLng = Lng;  //pole
    } else {
        destLng = ((Lng+Math.asin(Math.sin(course)*Math.sin(dist)/Math.cos(destLat))+Math.PI)
                      % (2*Math.PI)) - Math.PI;
    }
    //back to degrees ('cos maps are flat)
    destLat = destLat * (180/Math.PI);
    destLng = destLng * (180/Math.PI);

    return new GLatLng(destLat, destLng);
}

function mod(divisee,base) {
	return Math.round(divisee - (Math.floor(divisee/base)*base));
}

function addBoundaries(){
    if ($('chkBoundary').checked==true) {
        if (boundaryOverlay) map.removeOverlay(boundaryOverlay);
        if ($('chkArea').checked==true) boundaryOverlay = calculateBoundary(3); 
        if ($('chkRegion').checked==true) boundaryOverlay = calculateBoundary(4);
        map.addOverlay(boundaryOverlay);
    } else {
        if (boundaryOverlay) map.removeOverlay(boundaryOverlay);
    }
}

function calculateBoundary(level) {
    var oBoundary = new MapBoundaryAPI();
    var oCoords = oBoundary.getByAreaLevel('GB',level);
    var boundaries = new Array(0);
    for(i=0; i<oCoords.length; i++) {
        if (oCoords[i].encodedPoints.length==0) continue;
        boundaries.push({
          color: "#000000",
          weight: 2,
          opacity: 0.8,
          points: oCoords[i].encodedPoints,
          levels: oCoords[i].encodedLevels,
          zoomFactor: 2, 
          numLevels: 18
        });
    }

    return new GPolygon.fromEncoded({
        polylines: boundaries,
        fill: true,
        color: "#0000ff",
        opacity: 0.2,
        outline: true
    });
}
function Landingmarker() {

        var bubblebody = '';
        
        

        bubblebody += '<div id="demobubble" style="width: 450px;">';
        bubblebody += '<p><span class="header">Welcome to Zubedsales.com</span></p>';
        bubblebody += '<p>Zubed Sales is a search and CRM tool that dramatically ';
        bubblebody += 'reduces the time and effort required to locate sales opportunities with UK businesses.';
        bubblebody += 'The tool enables the user to record client and contact data within the Zubed CRM system,';
        bubblebody += ' and access this data from any web browser in any country globally.';
        bubblebody += '<p>To try a demo search just enter a postcode and business type i.e. "Dentist" into the search box, click the <img src="http://static.zubed.com/images/icons/add.gif" /><b>dentists</b> line and run search </p>'
        bubblebody += '<p><a href="#" onclick="presentation_popup();">Click here</a> to view Zubed Sales presentation.</p>';
        bubblebody += '<br></div >';
        
        map.setCenter(new GLatLng("53.00", "-1.13"), 7);
        
        map.openInfoWindowHtml(new GLatLng("52.27", "-1.53"),bubblebody);
 

}
