﻿function addToFavorites(sHotelID, sUrl, sTitle)
{
    $('favoritesWrapper').setHTML("<center><img src='"+_sBASE_PATH + "images/loading.gif'></center>");
    var ajaxCall = new Ajax(_sBASE_PATH + "handlers/AddFavoriteMotelHandler.ashx", {
        method: 'get',
        evalScripts: false,
        evalResponse: false,
        data:"HotelID=" + sHotelID,
        onComplete: function(){
            if($('favoritesWrapper')){
                $('favoritesWrapper').setHTML(ajaxCall.response.text);
            }
        }
    }).request();
}

function removeFromFavorites(sUrl, sTitle)
{

}

function reloadFavorites()
{
    var ajaxCall = new Ajax(_sBASE_PATH + "handlers/GetFavoriteMotelHandler.ashx", {
        method: 'get',
        evalScripts: false,
        evalResponse: false,
        onComplete: function(){
            if($('favoritesWrapper')){
                $('favoritesWrapper').setHTML(ajaxCall.response.text);
            }
        }
    }).request();
}



//************************************************************************************************
//****  Base Mappings
//************************************************************************************************
var IMappedItems = new Class({
	options: {
		map: null,
		loadListing: true,
		listingTarget: null,
		countTarget: null,
		markerBaseUrl: null,
		listingBaseUrl: null,
		updateOnMove: true,
		baseUrl: null,
		loadingText: 'Loading...',
		mapMoveRefreshTimeout: 500,
		markerIconUrl: 'Marker.png',
		markerFlashInterval: 0,
		markerFlashCount: 10
	},
	
    initialize: function(options) {
        this.setOptions(options);
        this.globalMarkers = new Hash();
        this.globalMarkersHidden = new Hash();
        this.hideAll = false;
        this.markerFlashInterval = this.options.markerFlashInterval;
        this.markerFlashCount = this.options.markerFlashCount;
        this.globalTimeoutID = 0;
    },
    
	reload: function() {
	    clearTimeout(this.globalTimeoutID); //clear previous timeouts
		this.loadMarkers();
		if(this.options.loadListing){
		    this.loadListings();
		}
	},
	
	loadMarkers: function() {
	
        if(this.options.map.getZoom() > 12)
        {
            var gmBounds = this.options.map.getBounds();

            this.globalMarkers.each(function(value, key) {
                if(!gmBounds.contains(value.getPoint()))
                {   
                    this.options.map.removeOverlay(value);
                    this.globalMarkers.remove(key);
                }
            }.bind(this));
             
            var bounds = this.options.map.getBounds();
            var southWest = bounds.getSouthWest();
            var northEast = bounds.getNorthEast();

            var markerFullUrl = this.options.markerBaseUrl + "sNELatitude="+northEast.lat()+"&sNELongitude="+northEast.lng()+"&sSWLatitude="+southWest.lat()+"&sSWLongitude="+southWest.lng();

            var httpMarkerRequest = GXmlHttp.create();

            //grab the xml for the markers
            httpMarkerRequest.open("GET", markerFullUrl, true);
            httpMarkerRequest.onreadystatechange = function() {
                if (httpMarkerRequest.readyState == 4) 
                {
                    if(httpMarkerRequest.status == 200){
                        this.handleMarkers(httpMarkerRequest.responseXML);
                    }
                    else{
                        if(this.options.loadListing){
                            this.options.listingTarget.setHTML("There was an error while retrieving the markers.");
                            this.options.listingTarget.setHTML(httpMarkerRequest.responseText);
                        }
                    }
                }
            }.bind(this);
            httpMarkerRequest.send(null);
        }
        else
        {
            //this.options.listingTarget.setHTML("These are not available at this level.  Please zoom in to view them.");
            
            this.globalMarkers.each(function(value, key){
                this.options.map.removeOverlay(value);
                this.globalMarkers.remove(key);
            }.bind(this));
        }
	},
	
	loadListings: function() {
	    if(_gmMap.getZoom() > 12)
        {
            var bounds = this.options.map.getBounds();
            var southWest = bounds.getSouthWest();
            var northEast = bounds.getNorthEast();

            var markerFullUrl = this.options.listingBaseUrl + "sNELatitude="+northEast.lat()+"&sNELongitude="+northEast.lng()+"&sSWLatitude="+southWest.lat()+"&sSWLongitude="+southWest.lng();

            var httpListingsRequest = GXmlHttp.create();
            
            this.options.listingTarget.setHTML(" <img src='"+ this.options.baseUrl +"images/loading.gif' alt='loading' align='absmiddle' /> " + this.options.loadingText);
           
            //grab the xml for the markers
            httpListingsRequest.open("GET", markerFullUrl, true);
            httpListingsRequest.onreadystatechange = function() 
            {
                if (httpListingsRequest.readyState == 4) 
                {
                    if(httpListingsRequest.status == 200){
                        this.options.listingTarget.setHTML(httpListingsRequest.responseText);
                    }
                    else{
                        this.options.listingTarget.setHTML("There was an error while retrieving the markers.");
                        this.options.listingTarget.setHTML(httpListingsRequest.responseText);
                    }
                    this.fireEvent('onListingsLoaded');
                }
            }.bind(this);
            httpListingsRequest.send(null);
        }
        else
        {
            this.options.listingTarget.setHTML("These are not available at this level.  Please zoom in to view them.");
        }
	},
	
    createMarker: function(oPoint, oIcon, hMeta) { // Creates a marker at the given point with the given number label
        var oOptions = new Object();
        oOptions.title = hMeta.get("Title");
        oOptions.icon = oIcon;

        var oMarker = new GMarker(oPoint, oOptions); 
        oMarker.id = hMeta.get("ID");
        oMarker.metaData = hMeta;

        GEvent.addListener(oMarker, "click", function() {
            oInfoTabs = new function() {
                if(hMeta){
                    var sMarkerHTML = "<b>" + hMeta.get("Name") + "</b>";
                    sMarkerHTML += "<br /><br />";
                    //sMarkerHTML += "<div style='font-size:9px;'><a href='javascript:addToTrip('"+hMeta.get("ID")+"');'>Add To Trip</a> | <a href=''>Add Favorite</a></div>";
                    //sMarkerHTML += "<div style='font-size:9px;'><a href='javascript:addToTrip('"+hMeta.get("ID")+"');'>Add To Trip</a> | <a href=''>Add Favorite</a></div>";
                    //sMarkerHTML += "<div style='font-size:9px;'><a href='http://"+hMeta.get("Url")+".mymotels.com'>Hotel Website</a></div>";
                    // Our info window content
                    var oInfoTabs = [
                      new GInfoWindowTab("Information", sMarkerHTML)
                    ];
                }
                else{
                    // Our info window content
                    var oInfoTabs = [
                      new GInfoWindowTab("Information", "Information not yet available.")
                    ];
                }
                
                return oInfoTabs;
            }

            oMarker.openInfoWindowTabsHtml(oInfoTabs);
        });
        return oMarker;
    },
    
    hideAllMarkers: function() {           
        this.globalMarkers.each(function(value, key){
            value.hide();
        });
        
        this.hideAll = true;
        
        //zero out the hidden markers
        this.globalMarkersHidden = new Hash();
        
        this.fireEvent('onMarkersUpdated');
    },
    
    showAllMarkers: function() {           
        this.globalMarkers.each(function(value, key){
            value.show();
        });
        
        this.hideAll = false;
        
        //zero out the hidden markers
        this.globalMarkersHidden = new Hash();
        
        this.fireEvent('onMarkersUpdated');
    },
    
    hideMarkers: function(markerList) {           
        markerList.each(function(element){
            if(element.checked) {
                this.globalMarkers.get(element.value).hide();
                element.checked = false;
                
                //remove from global hidden list
                if(!this.globalMarkersHidden.hasKey(element.value)) {
                    //add to hidden global hidden list
                    this.globalMarkersHidden.set(element.value, this.globalMarkers.get(element.value));
                }
            }
        }.bind(this));
        
        this.fireEvent('onMarkersUpdated');
    },
    
    showMarkers: function(markerList) {           
        markerList.each(function(element){
            if(element.checked) {
                this.globalMarkers.get(element.value).show();
                element.checked = false;
                
                //remove from global hidden list
                if(this.globalMarkersHidden.hasKey(element.value)) {
                    this.globalMarkersHidden.remove(element.value);
                }
            }
        }.bind(this));
        
        this.fireEvent('onMarkersUpdated');
    },
    
    setMarkerVisibility: function(sMarkerID, sLatitude, sLongitude, bVisibility) { 
        if(sMarkerID != null)
        {
            //alert(this.globalMarkers.hasKey(sMarkerID));
            if(this.globalMarkers.hasKey(sMarkerID)) //only add new markers
            {
                var oMarker = this.globalMarkers.get(sMarkerID);

                if(oMarker)
                {
                    if(bVisibility && oMarker.isHidden()){
                        oMarker.show();
                        
                        //remove from global hidden list
                        if(this.globalMarkersHidden.hasKey(sMarkerID)) {
                            this.globalMarkersHidden.remove(sMarkerID);
                        }
                    }
                    
                    if(!bVisibility && !oMarker.isHidden()){
                        oMarker.hide();
                        
                        //add to hidden global hidden list
                        this.globalMarkersHidden.set(sMarkerID, this.globalMarkers.get(sMarkerID));
                    }
                }
            }
        }
    },
    
    locateMarker: function(sMarkerID, sLatitude, sLongitude) {            
        if(sMarkerID != null)
        {
            if(this.globalMarkers.hasKey(sMarkerID)) //only add new markers
            {
                var oMarker = this.globalMarkers.get(sMarkerID);
                
                //alert(oMarker);
                if(oMarker && !oMarker.isHidden()){
                    //gllPoint = oMarker.getPoint();
                    if(!this.globalFlashMarker) { //only flash if no other is flashing
                        this.globalFlashMarker = oMarker;
                        
                        this.markerFlashCount = this.options.markerFlashCount;
                        window.setTimeout(function(){this.flashMarker()}.bind(this), 200);
                    }
                }
            }
        }
    },
    
    panToMarker: function(sLatitude, sLongitude) {            
        if(sMarkerID != null)
        {
            if(this.globalMarkers.hasKey(sMarkerID)) //only add new markers
            {
                var oMarker = this.globalMarkers.get(sMarkerID);
                
                //alert(oMarker);
                if(oMarker){
                    gllPoint = oMarker.getPoint();
                    _gmMap.setCenter(gllPoint, 13);
                }
            }
        }
    },
    
    panTo: function(sLatitude, sLongitude) {
        _gmMap.setCenter(new GLatLng(parseFloat(sLatitude), parseFloat(sLongitude)), 13);
    },
    
    flashMarker: function() {
        //alert("flashing");
        if(this.markerFlashCount-- % 2 == 1) {
            this.globalFlashMarker.hide();
        } 
        else {
            this.globalFlashMarker.show();
        }
        
        if (this.markerFlashInterval == 0) {
            this.markerFlashInterval = window.setInterval(function(){this.flashMarker()}.bind(this), 200);  //flash marker - 200ms interval
        } 
        else {
            if(this.markerFlashCount < 0) {
              window.clearInterval(this.markerFlashInterval);
              this.markerFlashInterval = 0;
              this.globalFlashMarker = null;
            }
        } 
    },
    getMarkerMeta: function(sMarkerID) {            
        if(sMarkerID != null)
        {
            if(this.globalMarkers.hasKey(sMarkerID)) //only add new markers
            {
                var oMarker = this.globalMarkers.get(sMarkerID);
                
                if(oMarker) {
                    return oMarker.metaData;
                }
            }
        }
        
        return null;
    }
});

IMappedItems.implement(new Events, new Options);

//************************************************************************************************
//****  Mapped Lodgings
//************************************************************************************************
var MappedLodgings = IMappedItems.extend({
	options: {
		loadingText: 'Loading Lodgings',
		markerIconUrl: 'LodgingMarker.png'
	},

	initialize: function(options) {
		this.setOptions(options);
		this.parent();

		this.markerIcons = [];
		this.markerIcons[0] = new GIcon(G_DEFAULT_ICON, this.options.baseUrl + "images/mapmarkers/" + this.options.markerIconUrl);

		this.loadMarkers();
		
		if(this.options.loadListing) {
		    this.loadListings();
		}
		
		if(this.options.updateOnMove){
            GEvent.addListener(this.options.map ,"moveend", function(){
                clearTimeout(this.globalTimeoutID); //clear previous timeouts
                this.globalTimeoutID = setTimeout(function(){this.reload()}.bind(this), this.options.mapMoveRefreshTimeout); //wait for map to be done scrolling - user end.
            }.bind(this));
        }
	},
	
	handleMarkers: function(results) {
	    if(results){
            var markers = results.documentElement.getElementsByTagName("Lodging");

            //get the viewing area of the map...to be used later
            var bounds = this.options.map.getBounds();

            for (var i = 0; i < markers.length; i++) 
            {
                // obtain the attribues of each marker
                var lat = parseFloat(markers[i].getElementsByTagName("Latitude")[0].firstChild.nodeValue);
                var lng = parseFloat(markers[i].getElementsByTagName("Longitude")[0].firstChild.nodeValue);
                
                //create point from lat/lng
                var gllPoint = new GLatLng(lat,lng);
                
                //get the meta data - create a hash object to hold the information
                var hMeta = new Hash();
                hMeta.set("ID", markers[i].getElementsByTagName("LodgingID")[0].firstChild.nodeValue);
                hMeta.set("Name", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Title", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Source", markers[i].getElementsByTagName("Source")[0].firstChild.nodeValue);
                hMeta.set("Url", markers[i].getElementsByTagName("Url")[0].firstChild.nodeValue);
                
                hMeta.set("Latitude", lat);
                hMeta.set("Longitude", lng);
                
                if(!this.globalMarkers.hasKey(hMeta.get("ID"))) //only add new markers
                {
                    var oMarker = this.createMarker(gllPoint, this.markerIcons[0], hMeta);
                    this.globalMarkers.set(hMeta.get("ID"), oMarker);
                    this.options.map.addOverlay(oMarker);
                    
                    if(this.hideAll || this.globalMarkersHidden.hasKey(hMeta.get("ID"))) //check hidden status
                    {
                        oMarker.hide();
                    }
                }
            }
            if(this.options.countTarget && this.options.countTarget != null){
                this.options.countTarget.setHTML('[' + markers.length + ']');
            }
        }
	},
	
    createMarker: function(oPoint, oIcon, hMeta) { // Creates a marker at the given point with the given number label
        var oOptions = new Object();
        oOptions.title = hMeta.get("Title");
        oOptions.icon = oIcon;

        var oMarker = new GMarker(oPoint, oOptions); 
        oMarker.id = hMeta.get("ID");
        oMarker.metaData = hMeta;

        GEvent.addListener(oMarker, "click", function() {
            oInfoTabs = new function() {
                if(hMeta){
                    var sMarkerHTML = "<b>" + hMeta.get("Name") + "</b>";
                    sMarkerHTML += "<br /><br />";
                    //sMarkerHTML += "<div style='font-size:9px;'><a href='javascript:addToTrip('"+hMeta.get("ID")+"');'>Add To Trip</a> | <a href=''>Add Favorite</a></div>";
                    //sMarkerHTML += "<div style='font-size:9px;'><a href='javascript:addToTrip('"+hMeta.get("ID")+"');'>Add To Trip</a> | <a href=''>Add Favorite</a></div>";
                    
                    sMarkerHTML += "<div style='font-size:9px;'><a href='http://"+hMeta.get("Url")+".mymotels.com'>Hotel Website</a></div>";
                    // Our info window content
                    var oInfoTabs = [
                      new GInfoWindowTab("Information", sMarkerHTML)
                    ];
                }
                else{
                    // Our info window content
                    var oInfoTabs = [
                      new GInfoWindowTab("Information", "Information not yet available.")
                    ];
                }
                
                return oInfoTabs;
            }

            oMarker.openInfoWindowTabsHtml(oInfoTabs);
        });
        return oMarker;
    }
});

MappedLodgings.implement(new Events, new Options);

//************************************************************************************************
//****  Mapped Attractions
//************************************************************************************************
var MappedAttractions = IMappedItems.extend({
	options: {
		loadingText: 'Loading Attractions',
		markerIconUrl: 'AttractionMarker.png'
	},

	initialize: function(options) {
		this.setOptions(options);
		this.parent();

		this.markerIcons = [];
		this.markerIcons[0] = new GIcon(G_DEFAULT_ICON, this.options.baseUrl + "images/mapmarkers/" + this.options.markerIconUrl);

		//if (this.options.initialize) this.options.initialize.call(this);
		this.loadMarkers();
		if(this.options.loadListing) {
		    this.loadListings();
		}
		
		if(this.options.updateOnMove){
            GEvent.addListener(this.options.map ,"moveend", function(){
                clearTimeout(this.globalTimeoutID); //clear previous timeouts
                this.globalTimeoutID = setTimeout(function(){this.reload()}.bind(this), this.options.mapMoveRefreshTimeout); //wait for map to be done scrolling - user end.
            }.bind(this));
        }
	},
	
	handleMarkers: function(results) {
	    if(results){
            var markers = results.documentElement.getElementsByTagName("Attraction");

            //get the viewing area of the map...to be used later
            var bounds = this.options.map.getBounds();

            for (var i = 0; i < markers.length; i++) 
            {
                // obtain the attribues of each marker
                var lat = parseFloat(markers[i].getElementsByTagName("Latitude")[0].firstChild.nodeValue);
                var lng = parseFloat(markers[i].getElementsByTagName("Longitude")[0].firstChild.nodeValue);
                
                //create point from lat/lng
                var gllPoint = new GLatLng(lat,lng);
                
                //get the meta data - create a hash object to hold the information
                var hMeta = new Hash();
                hMeta.set("ID", markers[i].getElementsByTagName("AttractionID")[0].firstChild.nodeValue);
                hMeta.set("Name", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Title", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Source", markers[i].getElementsByTagName("Source")[0].firstChild.nodeValue);
                
                hMeta.set("Latitude", lat);
                hMeta.set("Longitude", lng);
                
                if(!this.globalMarkers.hasKey(hMeta.get("ID"))) //only add new markers
                {
                    var oMarker = this.createMarker(gllPoint, this.markerIcons[0], hMeta);
                    this.globalMarkers.set(hMeta.get("ID"), oMarker);
                    this.options.map.addOverlay(oMarker);
                    
                    if(this.hideAll || this.globalMarkersHidden.hasKey(hMeta.get("ID"))) //check hidden status
                    {
                        oMarker.hide();
                    }
                }
            }
            
            if(this.options.countTarget && this.options.countTarget != null){
                this.options.countTarget.setHTML('[' + markers.length + ']');
            }
        }
	}
	
});

MappedAttractions.implement(new Events, new Options);

//************************************************************************************************
//****  Mapped Dinings
//************************************************************************************************
var MappedDinings = IMappedItems.extend({
	options: {
		loadingText: 'Loading Dinings',
		markerIconUrl: 'DiningMarker.png'
	},

	initialize: function(options) {
		this.setOptions(options);
		this.parent();

		this.markerIcons = [];
		this.markerIcons[0] = new GIcon(G_DEFAULT_ICON, this.options.baseUrl + "images/mapmarkers/" + this.options.markerIconUrl);

		//if (this.options.initialize) this.options.initialize.call(this);
		this.loadMarkers();
		if(this.options.loadListing) {
		    this.loadListings();
		}
		
		if(this.options.updateOnMove){
            GEvent.addListener(this.options.map ,"moveend", function(){
                clearTimeout(this.globalTimeoutID); //clear previous timeouts
                this.globalTimeoutID = setTimeout(function(){this.reload()}.bind(this), this.options.mapMoveRefreshTimeout); //wait for map to be done scrolling - user end.
            }.bind(this));
        }
	},
	
	handleMarkers: function(results) {
	    if(results){
            var markers = results.documentElement.getElementsByTagName("Dining");

            //get the viewing area of the map...to be used later
            var bounds = this.options.map.getBounds();

            for (var i = 0; i < markers.length; i++) 
            {
                // obtain the attribues of each marker
                var lat = parseFloat(markers[i].getElementsByTagName("Latitude")[0].firstChild.nodeValue);
                var lng = parseFloat(markers[i].getElementsByTagName("Longitude")[0].firstChild.nodeValue);
                
                //create point from lat/lng
                var gllPoint = new GLatLng(lat,lng);
                
                //get the meta data - create a hash object to hold the information
                var hMeta = new Hash();
                hMeta.set("ID", markers[i].getElementsByTagName("DiningID")[0].firstChild.nodeValue);
                hMeta.set("Name", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Title", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Source", markers[i].getElementsByTagName("Source")[0].firstChild.nodeValue);
                
                hMeta.set("Latitude", lat);
                hMeta.set("Longitude", lng);
                
                if(!this.globalMarkers.hasKey(hMeta.get("ID"))) //only add new markers
                {
                    var oMarker = this.createMarker(gllPoint, this.markerIcons[0], hMeta);
                    this.globalMarkers.set(hMeta.get("ID"), oMarker);
                    this.options.map.addOverlay(oMarker);
                    
                    if(this.hideAll || this.globalMarkersHidden.hasKey(hMeta.get("ID"))) //check hidden status
                    {
                        oMarker.hide();
                    }
                }
            }
            
            if(this.options.countTarget && this.options.countTarget != null){
                this.options.countTarget.setHTML('[' + markers.length + ']');
            }
        }
	}
	
});

MappedDinings.implement(new Events, new Options);

//************************************************************************************************
//****  Mapped Events
//************************************************************************************************
var MappedEvents = IMappedItems.extend({
	options: {
		loadingText: 'Loading Events',
		markerIconUrl: 'EventMarker.png',
		startDate: null,
		endDate: null
	},

	initialize: function(options) {
		this.setOptions(options);
		this.parent();

		this.markerIcons = [];
		this.markerIcons[0] = new GIcon(G_DEFAULT_ICON, this.options.baseUrl + "images/mapmarkers/" + this.options.markerIconUrl);
		
		if(!this.options.startDate || !this.options.endDate) {
		    this.options.startDate = new Date();
		    this.options.endDate = new Date();
		    this.options.endDate = this.options.endDate.setDate(this.options.endDate.getDate()+7);
		}
		//append the date attributes
		this.options.markerBaseUrl += "dtStartDate=" + this.options.startDate + "&dtEndDate=" + this.options.endDate + "&";
		this.options.listingBaseUrl += "dtStartDate=" + this.options.startDate + "&dtEndDate=" + this.options.endDate + "&";
        
		//if (this.options.initialize) this.options.initialize.call(this);
		this.loadMarkers();
		if(this.options.loadListing) {
		    this.loadListings();
		}
		
		if(this.options.updateOnMove){
            GEvent.addListener(this.options.map ,"moveend", function(){
                clearTimeout(this.globalTimeoutID); //clear previous timeouts
                this.globalTimeoutID = setTimeout(function(){this.reload()}.bind(this), this.options.mapMoveRefreshTimeout); //wait for map to be done scrolling - user end.
            }.bind(this));
        }
	},
	
	handleMarkers: function(results) {
	    if(results){
            var markers = results.documentElement.getElementsByTagName("Event");

            //get the viewing area of the map...to be used later
            var bounds = this.options.map.getBounds();

            for (var i = 0; i < markers.length; i++) 
            {
                // obtain the attribues of each marker
                var lat = parseFloat(markers[i].getElementsByTagName("Latitude")[0].firstChild.nodeValue);
                var lng = parseFloat(markers[i].getElementsByTagName("Longitude")[0].firstChild.nodeValue);
                
                //create point from lat/lng
                var gllPoint = new GLatLng(lat,lng);
                
                //get the meta data - create a hash object to hold the information
                var hMeta = new Hash();
                hMeta.set("ID", markers[i].getElementsByTagName("EventID")[0].firstChild.nodeValue);
                hMeta.set("Name", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Title", markers[i].getElementsByTagName("Name")[0].firstChild.nodeValue);
                hMeta.set("Source", markers[i].getElementsByTagName("Source")[0].firstChild.nodeValue);
                
                hMeta.set("Latitude", lat);
                hMeta.set("Longitude", lng);
                
                if(!this.globalMarkers.hasKey(hMeta.get("ID"))) //only add new markers
                {
                    var oMarker = this.createMarker(gllPoint, this.markerIcons[0], hMeta);
                    this.globalMarkers.set(hMeta.get("ID"), oMarker);
                    this.options.map.addOverlay(oMarker);
                    
                    if(this.hideAll || this.globalMarkersHidden.hasKey(hMeta.get("ID"))) //check hidden status
                    {
                        oMarker.hide();
                    }
                }
            }
            
            if(this.options.countTarget && this.options.countTarget != null){
                this.options.countTarget.setHTML('[' + markers.length + ']');
            }
            //this.fireEvent('onMarkersUpdated');
        }
	}
	
});


MappedEvents.implement(new Events, new Options);




//************************************************************************************************
//****  ImageToggler
//************************************************************************************************
var ImageToggler = new Class({
	options: {
		iconCheckedUrl: null,
		iconUnCheckedUrl: null,
		targetImages: null,
		onStatusChanged: null
	},
	
    initialize: function(options) {
        this.setOptions(options);
	    
        this.options.targetImages.each(function(element) {
            //set defaults
            element.src = this.options.iconCheckedUrl;
            element.setAttribute("status", "checked");
                
            element.addEvent('click', function() {
                this.toggleStatus(element);
            }.bind(this, element));
            
            element.isHidden = function(){
                if(this.getAttribute("status") == "checked") {
                    return false;
                }
                else {
                    return true;
                }
            };
            
            element.toggleStatus = function(){
                if(element.getAttribute("status") == "checked") {
                    element.src = this.options.iconUnCheckedUrl;
                    element.setAttribute("status", "unchecked");
                }
                else {
                    element.src = this.options.iconCheckedUrl;
                    element.setAttribute("status", "checked");
                }
            }.bind(this, element);
            
        }.bind(this));  
    },
    
    toggleStatus: function(element){
        if(element.getAttribute("status") == "checked") {
            element.src = this.options.iconUnCheckedUrl;
            element.setAttribute("status", "unchecked");
        }
        else {
            element.src = this.options.iconCheckedUrl;
            element.setAttribute("status", "checked");
        }

        this.fireEvent('onStatusChanged', element);
    },
    
    changeStatus: function(target, status) {
        if(status == true){
            target.src = this.options.iconCheckedUrl;
            target.setAttribute("status", "checked");
        }
        else{
            target.src = this.options.iconUnCheckedUrl;
            target.setAttribute("status", "unchecked");
        }
	}
});

ImageToggler.implement(new Events, new Options);
//************************************************************************************************
//****  FocusBox
//************************************************************************************************
var FocusBox = new Class({
	options: {
        target:null,
        targetPanels: null,
        togglerLinks: null,
        scrollDuration: 1500
	},
	
    initialize: function(options) {
        this.setOptions(options);
        
        this.targetID = 0;
        this.activePanel = 0;
        this.activeElement = null;
        this.fxScollingWindow = new Fx.Scroll(this.options.target, {
            wait: false,
            wheelStops: false,
            duration: this.options.scrollDuration,
            transition: Fx.Transitions.Quad.easeInOut
        });
        
        this.options.togglerLinks.each(function(element, index) {
            if(index == 0){ //set the first element
                this.activeElement = element;
            }
            
            element.addEvent("mouseover", function() {
                if(index != this.activePanel){
                    (window.ie)?element.setStyle('cursor', 'hand'):element.setStyle('cursor', 'pointer');
                }
            }.bind(this, element, index));
            
            element.addEvent("mouseout", function() {
                this.setStyle('cursor', 'auto')
            });
            
            element.addEvent('click', function() {
                this.togglePanel(index);
                this.updateToggler(element, index);
            }.bind(this, element, index));
        }.bind(this));
    },
    
    togglePanel: function(index){
        this.activePanel = index;
        this.fireEvent('onPanelLoading');
        this.fxScollingWindow.toElement(this.options.targetPanels[index]);
    },
    
    updateToggler: function(element, index){
        
        this.activeElement.removeClass('selected');
        element.addClass('selected');
        this.activeElement = element;
        
        
        //this.activeElement.removeClass('active');
        //element.addClass('active');
        //this.activeElement.setStyle('color','#669900');
        //element.setStyle('color','#000');
        
        this.activeElement = element;
        
    }
});

FocusBox.implement(new Events, new Options);


//************************************************************************************************
//****  FocusBox
//************************************************************************************************
var SwapBox = new Class({
	options: {
        target:null,
        targetPanels: null,
        togglerLinks: null,
        scrollDuration: 1
	},
	
    initialize: function(options) {
        this.setOptions(options);
        
        this.targetID = 0;
        this.activePanel = 0;
        this.activeElement = null;
        /*
        this.fxScollingWindow = new Fx.Scroll(this.options.target, {
            wait: false,
            wheelStops: false,
            duration: this.options.scrollDuration,
            transition: Fx.Transitions.Quad.easeInOut
        });
        */
        
        this.options.targetPanels.each(function(element, index) {
            if(this.activePanel != index){
                element.setStyle('display','none');
            }
            else{
                element.setStyle('display','block');
            }
        }.bind(this));
        
        this.options.togglerLinks.each(function(element, index) {
            if(index == 0){ //set the first element
                this.activeElement = element;
            }
            
            element.addEvent("mouseover", function() {
                if(index != this.activePanel){
                    (window.ie)?element.setStyle('cursor', 'hand'):element.setStyle('cursor', 'pointer');
                }
            }.bind(this, element, index));
            
            element.addEvent("mouseout", function() {
                this.setStyle('cursor', 'auto')
            });
            
            element.addEvent('click', function() {
                this.togglePanel(index);
                this.updateToggler(element, index);
            }.bind(this, element, index));
        }.bind(this));
    },
    
    togglePanel: function(index){
        this.activePanel = index;
        this.fireEvent('onPanelLoading');
        //this.fxScollingWindow.toElement(this.options.targetPanels[index]);
        
        this.options.targetPanels.each(function(element, index) {
            if(this.activePanel != index){
                element.setStyle('display','none');
            }
            else{
                element.setStyle('display','block');
            }
        }.bind(this));
    },
    
    updateToggler: function(element, index){
        
        this.activeElement.removeClass('selected');
        element.addClass('selected');
        this.activeElement = element;
        
        
        //this.activeElement.removeClass('active');
        //element.addClass('active');
        //this.activeElement.setStyle('color','#669900');
        //element.setStyle('color','#000');
        
        this.activeElement = element;
        
    }
});

SwapBox.implement(new Events, new Options);