/*#################################################################
#
#                          Map Class
#                      by: John Calabrese
#
#########################################################x7x#####*/


function buildMap()
{
        var headID = document.body;
        var cssNode = document.createElement('link');
        cssNode.type = 'text/css';
        cssNode.rel = 'stylesheet';
        cssNode.href = './js/buildMap.css';
        cssNode.media = 'screen';
        headID.appendChild(cssNode);
        this.cityId = null;
        this.prevCity = null;
        this.prevState = null;
        this.prevCountry = null;
        this.prevPostalCode = null;
        this.setIOMCenter = null;
        this.setTheIOMZoom = null;
        this.initFunc = function (element) {
                if (GBrowserIsCompatible()) {
                        this.element = element;
                        var my = this;
                        // define the crosshair tile layer and its required functions
                        this.crossLayer = new GTileLayer(new GCopyrightCollection(""), 0, 15);
                        this.crossLayer.getTileUrl =  function(tile, zoom) {
                                        return "./include/tile_crosshairs.png";
                                }
                        this.crossLayer.isPng = function() {return true;}
			if(window.jstiming == undefined)
			  window.jstiming = {Timer : function(){ return 5; }, setTimerName : function(){ return 5;} }//Google is screwing things up so this is a temp fix
                        this.geocoder = new GClientGeocoder();
                        // Create a new map type incorporating the tile layer
                        this.layerTerCross = [ G_PHYSICAL_MAP.getTileLayers()[0],this.crossLayer ];
                        this.mtTerCross = new GMapType(this.layerTerCross,G_PHYSICAL_MAP.getProjection(), "Ter+");
                        this.map = new GMap2(document.getElementById(element),
                                                { size: new GSize(document.getElementById(element).style.width.replace('px',''),
                                                                document.getElementById(element).style.height.replace('px','')
                                                                )
                                                }
                                        );
                        //this.map.addMapType(G_PHYSICAL_MAP);
                        //this.map.addMapType(this.mtTerCross);
                        //this.map.enableScrollWheelZoom();
                        //this.map.addControl(new GSmallZoomControl())
                        this.map.enableContinuousZoom();
                        this.map.disableDoubleClickZoom();
                        this.map.addControl(new GLargeMapControl(),
                        new GControlPosition(G_ANCHOR_TOP_LEFT,
                        new GSize(5,-60)));
                        
                        
                        this.mapControl = new GHierarchicalMapTypeControl();
                        // Set up map type menu relationships
                        this.mapControl.clearRelationships();
                        this.mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", true);
                        //this.mapControl.addRelationship(G_PHYSICAL_MAP, this.mtTerCross, "Crosshairs");
                        // Add control after you've specified the relationships
                        this.map.addControl(this.mapControl);
                        var my = this;
                        this.bounds = new GLatLngBounds; 
                        GEvent.addListener(this.map, "dragend", function(){my.rePopulateMap();});
                        GEvent.addListener(this.map, "dblclick", function(){my.rePopulateMap()});
                }
        }
      
        this.showLocation = function (address1,innId) {
                var my = this;
                //build the display contents of the marker
                var markerText2 = this.getMarkerDescriptionContent();
                var markerText1 = this.getMarkerContactContent();
                
                //check if lng and lat are store in the system
                if (my.lat!='' && my.lng!='') {
                        //run from stored lng and lat if exists
                        this.addMarkLngLat(my.lat,my.lng,markerText1,markerText2,innId);
                }else{
                        //update the address incase of geocode
                        address1 = address1.toUpperCase();
                        address1 = address1.replace('WEST','W.');
                        address1 = address1.replace('EAST','E.');
                        address1 = address1.replace('NORTH','N.');
                        address1 = address1.replace('SOUTH','S.');
                        //geocode the lng lat from the address if not stored
                        this.geocoder.getLocations(address1,geoCallback);
                        
                }

                //geocode callback function
                function geoCallback(response) {
                        var point = null;
                        var place = null;
                        if (response && response.Status.code == 200) {
                                place = response.Placemark[0];
                                if(place.Point.coordinates[1] && place.Point.coordinates[0]){
                                        
                                        my.addMarkLngLat(place.Point.coordinates[1],place.Point.coordinates[0],markerText1,markerText2,innId);
                                }
                        }
                }
        }
        
        this.addArray = function (f_array)
        {
                for (var i = 0; i < f_array.length; i++) {
                        this.addLocationToMap(f_array[i]);
                }
        }
        
        this.centerMap = function (cityName,stateCode,countryCode)
        {
                //this.geocoder.getLocations(address1,geoCallback);
                //this.map.setCenter(point,9);
                this.map.setCenter(new GLatLng(0,0),0); 
        }
        
        this.flyToCity = function(address1)
        {
                var my = this;
                this.geocoder.getLocations(address1,geoCallback);
                //geocode callback function
                function geoCallback(response) {
                        var point = null;
                        var place = null;
                        if (response && response.Status.code == 200) {
                                place = response.Placemark[0];
                                if(place.Point.coordinates[1] && place.Point.coordinates[0]){
                                        //my.map.setZoom(9);
                                        my.map.setCenter(new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]));
                                        my.setCenter=my.map.getCenter();
                                        my.rePopulateMap();
                                }
                        }
                }
        }
        
        this.reverseGeocodeAJAX = function(a,b)
        {
                var my = this;
                sendClick = 'lat='+a+"&lng="+b;
                var xmlhttp =  new XMLHttpRequest();
                xmlhttp.open('POST', '/mapLib/ajax/reverseGeocodeAJAX.php', true);
                // The callback function
                xmlhttp.onreadystatechange = function() {
                    if (xmlhttp.readyState == 4) {
                        if (xmlhttp.status == 200) {
                                var res = xmlhttp.responseText;
                                var area = my.getBetween("<area>","</area>",res);
                                var city = my.getBetween("<city>","</city>",area[0])[0];
                                var state = my.getBetween("<state>","</state>",area[0])[0];
                                var country = my.getBetween("<country>","</country>",area[0])[0];
                                var postalCode = my.getBetween("<postalCode>","</postalCode>",area[0])[0];
                                //document.getElementById('location_disp').innerHTML = city+", "+state;
                                my.getCityListings(city,state,country,postalCode);
                                my.prevCity = city;
                                my.prevState = state;
                                my.prevCountry = country;
                                my.prevPostalCode = postalCode;
                        }else{
                                alert("There was an error.");
                        }
                    }
                }
                // Send the POST request
                xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                xmlhttp.send(sendClick);
                xmlhttp.close;
        }
        
        this.getCityListings = function(city,state,country,postalCode)
        {
                var my = this;
                if(city!=this.prevCity || city==''){
                        //document.getElementById('listing_disp').innerHTML = document.getElementById('listing_disp').innerHTML;
                        this.searchingDialog = new Dialog('searchingDialog');
                        this.searchingDialog.setWidth('420');
                        this.searchingDialog.setHeight('70');
                        this.searchingDialog.setModal(false);
                        this.searchingDialog.setLockColor('white');
                        this.searchingDialog.setBorderColor('black');
                        this.searchingDialog.setDialogBody("<span style='font-weight:bold;color:black;font-size:17;'>Searching for Inns in "+city+", "+state+"</span>");
                        this.searchingDialog.showDialog();
                        sendClick = 'city='+city+"&state="+state+"&country="+country+"&postalCode="+postalCode+"&lat='"+my.center[0]+"'&lng='"+my.center[1]+"'";
                        var xmlhttp =  new XMLHttpRequest();
                        xmlhttp.open('POST', '/mapLib/ajax/getCityListingsAJAX.php', true);
                        // The callback function
                        xmlhttp.onreadystatechange = function() {
                            if (xmlhttp.readyState == 4) {
                                if (xmlhttp.status == 200) {
                                        var returnedMarkers = my.getBetween("<listingMarkers>","</listingMarkers>",xmlhttp.responseText)[0];
                                        var iom = my.getBetween("<IOMMarker>","</IOMMarker>",returnedMarkers)[0];
                                        var inns = my.getBetween("<InnsMarker>","</InnsMarker>",returnedMarkers);
                                        var nearbyinns = my.getBetween("<NearbyInnsMarker>","</NearbyInnsMarker>",returnedMarkers);
                                        var secondaryinns = my.getBetween("<SecondaryInnsMarker>","</SecondaryInnsMarker>",returnedMarkers);
                                        var title = my.getBetween("<Title>","</Title>",xmlhttp.responseText)[0];
                                        my.cityId = my.getBetween("<CityId>","</CityId>",xmlhttp.responseText)[0];
                                        document.getElementById('location_disp').innerHTML = title;
                                        var cnt=0;
                                        if((nearbyinns && nearbyinns!='') || (inns && inns!='') || (iom && iom!='') || (secondaryinns && secondaryinns!=''))
                                        {
                                                var listings_html =  my.getBetween("<listingHTML>","</listingHTML>",xmlhttp.responseText)[0];
                                                document.getElementById('listing_disp').innerHTML = listings_html;
                                                var point = null;
                                                var bounds = new GLatLngBounds();
                                                my.clearMap();
                                                zoom = my.map.getBoundsZoomLevel(bounds);
                                                var allInns = [[iom],inns,secondaryinns,nearbyinns];
                                                for(var h=0;h<allInns.length;h++)
                                                {
                                                        var inns_h = allInns[h];
                                                        for(var z=0;z<inns_h.length;z++)
                                                        {
                                                                if(inns_h[z]){
                                                                        var disp_address = my.getBetween("<address>","</address>",inns_h[z])[0];
                                                                        var disp_address2 = my.getBetween("<address2>","</address2>",inns_h[z])[0];
                                                                        var disp_cityName = my.getBetween("<cityName>","</cityName>",inns_h[z])[0];
                                                                        var disp_stateCode = my.getBetween("<stateCode>","</stateCode>",inns_h[z])[0];
                                                                        var disp_countryCode = my.getBetween("<countryCode>","</countryCode>",inns_h[z])[0];
                                                                        var disp_lng = my.getBetween("<lng>","</lng>",inns_h[z])[0];
                                                                        var disp_lat = my.getBetween("<lat>","</lat>",inns_h[z])[0];
                                                                        var disp_name = my.getBetween("<name>","</name>",inns_h[z])[0];
                                                                        var disp_imageSrc = my.getBetween("<imageSrc>","</imageSrc>",inns_h[z])[0];
                                                                        var disp_tagline2 = my.getBetween("<tagline2>","</tagline2>",inns_h[z])[0];
                                                                        var disp_phone = my.getBetween("<phone>","</phone>",inns_h[z])[0];
                                                                        var disp_website = my.getBetween("<website>","</website>",inns_h[z])[0];
                                                                        var disp_email = my.getBetween("<email>","</email>",inns_h[z])[0];
                                                                        var disp_innId = my.getBetween("<innId>","</innId>",inns_h[z])[0];
                                                                        point  = new GLatLng(disp_lat,disp_lng);
                                                                        if(disp_lat!=0 && disp_lng!=0 && disp_lat!='' && disp_lng!='')
                                                                        {
                                                                                my.addLocationToMap([disp_address,disp_address2,
                                                                                        disp_cityName,disp_stateCode,disp_countryCode,disp_lng,
                                                                                        disp_lat,disp_name,disp_imageSrc,disp_tagline2,
                                                                                        disp_phone,disp_website,disp_email,disp_innId]);
                                                                                if(h!=2)
                                                                                {
                                                                                        if(cnt<20){bounds.extend(point);}
                                                                                        cnt++;
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                        /*if(h=='3' && inns_h.length>'0')
                                                        {
                                                                document.getElementById('location_disp').innerHTML = '';
                                                        }*/
                                                }
                                                
                                                var featuredInnDisplay =  my.getBetween("<featuredInnDisplay>","</featuredInnDisplay>",xmlhttp.responseText)[0];
                                                var curr_state =  my.getBetween("<fullStateName>","</fullStateName>",xmlhttp.responseText)[0];
                                                var breadCrumb =  my.getBetween("<breadCrumb>","</breadCrumb>",xmlhttp.responseText)[0];
                                                document.getElementById('breadCrumb').innerHTML = breadCrumb;
                                                if(featuredInnDisplay!=''){document.getElementById('featuredDispCont').innerHTML = featuredInnDisplay;}
                                                
                                                if(curr_state){
                                                        document.getElementById('gclink').href = '/'+curr_state+'-Bed-Breakfast-Gift-Certificates';
                                                        document.getElementById('gcbutton1').onclick = function(){window.open('/'+curr_state+'-Bed-Breakfast-Gift-Certificates')};
                                                        document.getElementById('gcbutton2').onclick = function(){window.open('/'+curr_state+'-Bed-Breakfast-Gift-Certificates')};
                                                }
                                                
                                                
                                                point = new GLatLng(my.center[0],my.center[1]);
                                                var curr_zoom = my.map.getZoom();
                                                var new_zoom = my.map.getBoundsZoomLevel(bounds);
                                                
                                                if(cnt==1){my.setTheZoom=curr_zoom;}
                                                else if(new_zoom>curr_zoom){my.setTheZoom=curr_zoom+1;}
                                                else if(new_zoom<curr_zoom-3){my.setTheZoom=curr_zoom-3;}
                                                else{my.setTheZoom = new_zoom;}
                                                if(my.setTheZoom<8){my.setTheZoom=8;}
                                                
                                                
                                                var b_cen = bounds.getCenter().toUrlValue().split(",");
                                                if(b_cen[0]==0 || b_cen[1]==0 || b_cen[0]==180 || b_cen[1]==180){my.setCenter = point;my.setTheZoom=my.setTheZoom;}
                                                else if(my.setCenter==bounds.getCenter()){my.setCenter = point;my.setTheZoom=my.setTheZoom-1;}
                                                else{my.setCenter = bounds.getCenter();}
                                                my.map.setCenter(point);
                                        }
                                }else{
                                        alert("There was an error.");
                                }
                            }
                            
                        }
                        // Send the POST request
                        xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                        xmlhttp.send(sendClick);
                        xmlhttp.close;
                        setTimeout("closeDialog('searchingDialog',false)",1000);
                }
        }
        
        this.rePopulateMap = function()
        {
                var map = this.map;
                this.center = this.map.getCenter().toUrlValue().split(",");
                var lat = this.center[0];
                var lng = this.center[1];
                this.reverseGeocodeAJAX(lat,lng);
        }
        
        this.addMarkLngLat = function(a,b,c,d,innId)
        {
                point = new GLatLng(a,b);
                tCenter = this.map.getCenter().toUrlValue().split(",");
                if(tCenter[0]==0 && tCenter[1]==0){this.map.setCenter(point);}
                
                //GEvent.addDomListener(click, "click", function(){marker.openInfoWindowHtml(markerText);});
                
                var baseIcon = new GIcon(G_DEFAULT_ICON);
                baseIcon.shadow = "https://www.BnBFinder.com/images/createInnDisplay/mm_20_shadow.png";
                //baseIcon.shadow = "https://www.BnBFinder.com/images/createInnDisplay/pin_shadow.png";
                baseIcon.iconSize = new GSize(12,20);
                baseIcon.shadowSize = new GSize(22,20);
                baseIcon.iconAnchor = new GPoint(6,20);
                baseIcon.infoWindowAnchor = new GPoint(9, 2);
                
                
                var letteredIcon = new GIcon(baseIcon);
                letteredIcon.image = "https://www.BnBFinder.com/images/createInnDisplay/houseCity.png";
                //letteredIcon.image = "https://www.BnBFinder.com/images/createInnDisplay/marker.png";
              
                // Set up our GMarkerOptions object
                markerOptions = { icon:letteredIcon };
                mark = new GMarker(point);
                
                var infowindow2 = new GInfoWindowTab("Description",d);
                var infowindow1 = new GInfoWindowTab("Contact",c);
                GEvent.addListener(mark, "click", function(){this.openInfoWindowTabsHtml([infowindow1,infowindow2]); });
                var my=mark;
                GEvent.addDomListener(document.getElementById('centeronmap'+innId), "click", function(){my.openInfoWindowTabsHtml([infowindow1,infowindow2]); scroll(0,0);centeronButtons();});
                //GEvent.addListener(this.map, "infowindowclose", function(){centerMap();});
                this.map.addOverlay(mark);
        }
        
        this.getMarkerDescriptionContent = function()
        {
                var img = "<img height=70 src='http://www.BnBFinder.com/"+this.imageSrc+"'>";
                var disp_add = this.tagline.substring(0,120);
                var retvar = "<b>"+this.name+"</b><br>";
                retvar += "<div class='bubble'>"+
                                "<div style='background:#f8f8f8;float:left;width:100;height:70;overflow:hidden;'>"+img+"</div>"+
                                "<div style='font-color:lightgrey;font-size:small;text-align:left;float:left;overflow:wrap;width:200;'><font size=2 color=gray>"+disp_add+"..."+
                                "<a target='_blank' href='http://www.BnBFinder.com/"+this.stateCode+"/"+this.cityName+"/Bed-and-Breakfast/Listing/"+this.innId+"'><span class='purpleInnLink' ><b>more</b></span></a></font></div>"+
                        "</div>";
                retvar += "<br>";
                return retvar;
        }
        
        this.getMarkerContactContent = function()
        {
                var img = "<img height=70 src='http://www.BnBFinder.com/"+this.imageSrc+"'>";
                var disp_add = this.tagline.substring(0,120);
                if(this.website && this.website!='undefined')
                {
                        var website = this.website;
                        website = website.replace("http://","");
                }else{
                        website = '';
                }
                var retvar = "<b>"+this.name+"</b><br>";
                retvar += "<div id='myInnsDiv"+this.innId+"_bbl' class='myInnsFloatingBox'></div>";
                retvar += "<div class='bubble'>"+
                                
                                "<div style='background:#f8f8f8;float:left;width:100;height:70;overflow:hidden;'>"+img+"</div>"+
                                "<div style='font-color:lightgrey;font-size:small;text-align:left;float:left;overflow:wrap;width:200;'>"+
                                "<font size=2 color=gray>"+this.address+"<br>"+
                                this.cityName+","+this.stateCode+" "+this.countryCode+"<br>"+
                                this.phone+"<br>"+
                                "<a style='float:left' class='purpleInnLink' target='_blank' href='/affiliate/index.php?innId="+this.innId+"'>Website</a> "+
                                "<a style='float:right' class='purpleInnLink' target='_blank' href='http://www.BnBFinder.com/?action=emailInn&innId="+this.innId+"'>Send Email</a><br>"+
                                "<span id='myInnsSpan"+this.innId+"_bbl' class='purpleInnLink' onclick=myInnsTable('"+this.innId+"_bbl')>Save in My Inns</span><br/>";
                                "</font></a></font></div>"+
                        "</div>";
                retvar += "<br>";
                return retvar;
        }
        
        this.getBetween = function (first,last,text)
        {
                var i = text.split(first);
                retval = [];
                for(var z=1;z<i.length;z++)
                {
                        var j = i[z].split(last);
                        retval.push(j[0]);
                }
                return retval;
        }
        
        
        this.addLocationToMap = function(f_array)
        {
                this.address = f_array[0];
                this.address2 = f_array[1];
                this.cityName = f_array[2];
                this.stateCode = f_array[3];
                this.countryCode = f_array[4];
                this.lng = f_array[5];
                this.lat = f_array[6];
                this.name = f_array[7];
                this.imageSrc = f_array[8];
                this.tagline = f_array[9];
                this.phone = f_array[10];
                this.website = f_array[11];
                this.email = f_array[12];
                this.innId = f_array[13];
                //alert(this.innId);
                this.showLocation(this.buildAddress(this.address,this.address2,this.cityName,this.stateCode,this.countryCode),this.innId);
        }
        
        this.clearMap = function(){this.map.clearOverlays();}
        this.buildAddress = function (a,b,c,d,e){return a+","+b+","+c+","+d+","+e;}
}
function Sleep(naptime){
        naptime = naptime * 1000;
        var sleeping = true;
        var now = new Date();
        var alarm;
        var startingMSeconds = now.getTime();
        //alert("starting nap at timestamp: " + startingMSeconds + "\nWill sleep for: " + naptime + " ms");
        while(sleeping){
                alarm = new Date();
                alarmMSeconds = alarm.getTime();
                if(alarmMSeconds - startingMSeconds > naptime){ sleeping = false; }
        }      
        //alert("Wakeup!");
}

function centerIOM()
{
       myMap.map.panTo(myMap.setIOMCenter); 
}
function zoomIOM()
{
        myMap.map.setZoom(myMap.setTheIOMZoom); 
}
function saveCenter()
{
        myMap.setCenter=myMap.map.getCenter();
}
function zoomMap()
{
        myMap.map.setZoom(myMap.setTheZoom); 
}
function centerMap()
{
        myMap.map.panTo(myMap.setCenter);
}

