 var map;
 var tooltip;
 var gmarkers = [];
 var marker_counter = 0;
 var baseIcon = new GIcon();
 var map_geo_lat = 0;
 var map_geo_lng = 0;
 baseIcon.iconSize=new GSize(32,32);
 baseIcon.shadowSize=new GSize(56,32);
 baseIcon.iconAnchor=new GPoint(16,32);
 baseIcon.infoWindowAnchor=new GPoint(16,0);
 var propertyIcon = new GIcon(baseIcon, "http://maps.google.com/mapfiles/kml/pal5/icon12.png", null, "http://maps.google.com/mapfiles/kml/pal5/icon12s.png");




function loadMap()
{
   if(MM_findObj('map'))
   {
      load();
   }
}

function unloadMap()
{
   if(MM_findObj('map'))
   {
      GUnload();
   }
}




function changeSearchOption(change,to)
{
   var objName = '';
   var val_obj = document.getElementById('results_option_'+change);
   var current_value = val_obj.value;    
   if(current_value)
   {
      objName = 'results_option_'+change+'_'+current_value.replace(/ /g,'_');
      var current_obj = document.getElementById(objName);
      current_obj.className = 'results_option'; 
   }
   objName = 'results_option_'+change+'_'+to.replace(/ /g,'_');
   var obj = document.getElementById(objName);
   obj.className = 'results_option_selected';
   val_obj.value = to;
   
   // If we're setting the 'results_to_display' variable
   // make sure we reset the page number, note that that
   // will automatically call doSearch so no need to call
   // it again in this function...
   if(change == 'results_to_display')
   {
      setPage(1);  
   }
   // Changing the flexibility option is the only
   // option which potentially results in a different
   // number of results being displayed. If we're not
   // setting that particular option, just skip ahead to the
   // actual search...
   else if(change == 'flexible_dates')
   {
      updateCurrentSelection();
   }
   else
   {
      doSearch();  
   }
}


var results_option_divs = [];
results_option_divs[0] = 'results_to_display';
results_option_divs[1] = 'display_map';
results_option_divs[2] = 'flexible_dates';
results_option_divs[3] = 'sort_by';
results_option_divs[4] = 'sort_type';
function toggleResultsOptionDiv(objName)
{
   for(var i = 0; i < 5; i++)
   {
      if(results_option_divs[i]!=objName) document.getElementById(results_option_divs[i]+'_div').style.display = 'none';  
   }
   var obj = document.getElementById(objName+'_div');
   obj.style.display = (obj.style.display == 'none') ? '' : 'none';
}



function toggleMapOption(option)
{
   var obj = document.getElementById('slideshow_button');
   var src = obj.src;
   if(option == 'slideshow')
   {
      if(src.indexOf("pause") == -1)
      {
         obj.src = "/images/pause.gif";
         // Start slideshow
         showOnMap();
      }
      else
      {
         obj.src = "/images/play.gif"; 
         // Pause slideshow
         stopSlideShow();
      }
   } 
}



function setPage(page)
{
   setLoading('shortlist',true);
   var obj = document.getElementById('search_page');
   obj.value = page;
   doSearch();
   var idx = this.location.href.indexOf("#");
   this.location.href = (idx==-1) ? this.location.href+"#search" : this.location.href.substring(0,idx)+"#search";
}



function doSearch()
{
    setLoading('shortlist',true);
    unloadMap();
    var vars = [];
    var qs = '';
    // SEARCH VARIABLES 
    vars[0]='page';
    for(var i = 0; i < vars.length; i++)
    {
       qs += vars[i]+"="+document.getElementById('search_'+vars[i]).value+"&";
    }
    // RESULTS VARIABLES
    vars = [];
    vars[0]='results_to_display';vars[1]='display_map';vars[2]='flexible_dates';vars[3]='sort_by';vars[4]='sort_type';
    for(var i = 0; i < vars.length; i++)
    {
       qs += vars[i]+"="+document.getElementById('results_option_'+vars[i]).value+"&";
    }
    
    qs += "&shortlist_session="+server_shortlist_session_to_open;    
    qs += "&logged_in="+server_uid+"&login_type="+server_login_type
    var url = '/ajax/'+server_url_prefix+'_shortlist.ajax.php?'+qs;
    ajaxRequest(url, true, 'doSearchResponse');
}


function doSearchResponse()
{
   if (xmlHttp.readyState==4)
   {
      rc = xmlHttp.responseText;
      var search_results_div = document.getElementById('shortlist_div');
      var _div = document.createElement("div"); 
      _div.innerHTML = rc;
      search_results_div.innerHTML = "";
      search_results_div.appendChild(_div);
      setLoading('shortlist',false);
      // This is for map data
      if(document.getElementById("to_eval"))
      {
         eval(document.getElementById("to_eval").innerHTML.substring(4));
      }
      // This is for the open list option
      if(document.getElementById("open_list_to_eval"))
      {
         eval(document.getElementById("open_list_to_eval").innerHTML.substring(4));  
      }
   }
}


function base64_encode( data ) {
        
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];
 
    if (!data) {
        return data;
    }
 
    data = utf8_encode(data+'');
    
    do {
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);
 
        bits = o1<<16 | o2<<8 | o3;
 
        h1 = bits>>18 & 0x3f;
        h2 = bits>>12 & 0x3f;
        h3 = bits>>6 & 0x3f;
        h4 = bits & 0x3f;
 
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);
    
    enc = tmp_arr.join('');
    
    switch( data.length % 3 ){
        case 1:
            enc = enc.slice(0, -2) + '==';
        break;
        case 2:
            enc = enc.slice(0, -1) + '=';
        break;
    }
 
    return enc;
}


function utf8_encode ( string ) {
 
    string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
 
    var utftext = "";
    var start, end;
    var stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc != null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }
 
    if (end > start) {
        utftext += string.substring(start, string.length);
    }
 
    return utftext;
}


function base64_decode( data ) {
 
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];
 
    if (!data) {
        return data;
    }
 
    data += '';
 
    do {
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
        
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = utf8_decode(dec);
 
    return dec;
}


function utf8_decode ( str_data )
{
 
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    
    str_data += '';
    
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
}


function decodeQ(no_add_to_history,initial_load)
{
   var loc = this.location.href;  
   var idx = loc.indexOf("#q=");
   // If 'q' variable is present
   if(idx != -1)
   {
      var q = loc.substring(idx+3);
      var decoded_q = base64_decode(q);
      var q_parts = decoded_q.split('_');
      var vars = [];
      vars[0] = 'country';vars[1] = 'region';vars[2] = 'area';vars[3] = 'dates_checkin';vars[4] = 'dates_checkout';vars[5] = 'price';vars[6] = 'property_type';vars[7] = 'bedrooms';vars[8] = 'sleeps';vars[9] = 'location_features';vars[10] = 'property_features'; vars[11] = 'page'; vars[12] = 'results_to_display';vars[13] = 'display_map';vars[14] = 'flexible_dates';vars[15] = 'sort_by';vars[16] = 'sort_type';
      for(var i = 0; i < vars.length; i++)
      {
         var prefix = (i <= 11) ? 'search_' : 'results_option_';
         if(i == 16) { q_parts[16] = (q_parts[16]=='DESC') ? 'highest_to_lowest' : 'lowest_to_highest'; }
         if(prefix == 'search_')
         {
            document.getElementById(prefix+vars[i]).value = q_parts[i];
         }
         else
         {
            // Raw change search option code because we don't want to search again
            var objName = '';
            var val_obj = document.getElementById('results_option_'+vars[i]);
            var current_value = val_obj.value;    
            if(current_value)
            {
               objName = 'results_option_'+vars[i]+'_'+current_value.replace(/ /g,'_');
               var current_obj = document.getElementById(objName);
              current_obj.className = 'results_option'; 
            }
            objName = 'results_option_'+vars[i]+'_'+q_parts[i].replace(/ /g,'_');
            var obj = document.getElementById(objName);
            obj.className = 'results_option_selected';
            val_obj.value = q_parts[i];  
         }
         if(vars[i] != 'dates_checkin' && vars[i] != 'dates_checkout')
         {
            // If q for this variable is set...
            if(q_parts[i] != '')
            {
               selectOption(vars[i],true);   
               if(vars[i] == 'country')
               {
                  enableOption('region',true);  
               }
               else if(vars[i] == 'region')
               {
                  enableOption('area',true);  
               }
            }
            // If q for this variable is not set...
            else
            {
               // Only un-select the option if it hasn't previously been disabled
               if(document.getElementById('search_option_'+vars[i]+'_div').className!='search_option_disabled')
               {
                  selectOption(vars[i],false);
               }
               
               // If we're unselecting options, other options must be disabled
               if(vars[i] == 'country')
               {
                  enableOption('region',false);
               }  
               else if(vars[i] == 'region')
               {
                  enableOption('area',false);  
               }
            }
         }
      }
      if(q_parts[3]!='' && q_parts[4]!='')
      {
         document.getElementById('search_dates_checkin').value = q_parts[3];
         document.getElementById('search_dates_checkout').value = q_parts[4];
         selectOption('dates',true);  
      }
      else
      {
         document.getElementById('search_dates_checkin').value = '';
         document.getElementById('search_dates_checkout').value = '';
         selectOption('dates',false);    
      }
      g_no_add_to_history = no_add_to_history;
      updateCurrentSelection(true);
   }
   // If no q specified and it's not the initial load, reset all variables
   // i.e. user clicked back until the page was as originally requested...
   else if(initial_load != true)
   {
      // Reset all variables to defaults
      var vars = []; 
      vars[0] = 'country';vars[1] = 'region';vars[2] = 'area';vars[3] = 'dates_checkin';vars[4] = 'dates_checkout';vars[5] = 'price';vars[6] = 'property_type';vars[7] = 'bedrooms';vars[8] = 'sleeps';vars[9] = 'location_features';vars[10] = 'property_features'; vars[11] = 'page'; vars[12] = 'results_to_display';vars[13] = 'display_map';vars[14] = 'flexible_dates';vars[15] = 'sort_by';vars[16] = 'sort_type';
      for(var i = 0; i < vars.length; i++)
      {
         var prefix = (i <= 11) ? 'search_' : 'results_option_';
         if(prefix == 'search_')
         {
            if(vars[i] == 'page')
            {
               document.getElementById(prefix+vars[i]).value = '1';
            }
            else
            {
               document.getElementById(prefix+vars[i]).value = ''; 
               
               // 2->1 relationship for q paramater and option
               if(vars[i] != 'dates_checkin' && vars[i] != 'dates_checkout')
               {
                  // Only un-select the option if it hasn't previously been disabled
                  if(document.getElementById('search_option_'+vars[i]+'_div').className!='search_option_disabled')
                  {
                     selectOption(vars[i],false);
                  }
               }
               // Normal parameters can be unselected (assuming they're not disabled)
               else
               {
                  // Only un-select the option if it hasn't previously been disabled
                  if(document.getElementById('search_option_dates_div').className!='search_option_disabled')
                  {
                     selectOption('dates',false);
                  }
               }
               
               // If we're unselecting options, other options must be disabled
               if(vars[i] == 'country')
               {
                  enableOption('region',false);
               }  
               else if(vars[i] == 'region')
               {
                  enableOption('area',false);  
               }
            }
         }
         else
         {
            var val = '';
            switch(vars[i])
            {
               case 'results_to_display':
               val = '10';
               break; 
               
               case 'display_map':
               val = 'no';
               break;  
               
               case 'flexible_dates':
               val = 'yes';
               break;
               
               case 'sort_by':
               val = 'default';
               break;
               
               case 'sort_type':
               val = 'highest_to_lowest';
               break;   
            }
            // Raw change search option code because we don't want to search again
            var _objName = '';
            var _val_obj = document.getElementById('results_option_'+vars[i]);
            var _current_value = _val_obj.value;    
            if(_current_value)
            {
               _objName = 'results_option_'+vars[i]+'_'+_current_value.replace(/ /g,'_');
               var _current_obj = document.getElementById(_objName);
               _current_obj.className = 'results_option'; 
            }
            _objName = 'results_option_'+vars[i]+'_'+val.replace(/ /g,'_');
            var _obj = document.getElementById(_objName);
            _obj.className = 'results_option_selected';
            _val_obj.value = val;    
         } 
      }
      g_no_add_to_history = no_add_to_history;
      updateCurrentSelection(true);
   }
}



function setLoading(obj,loading)
{
    var div = document.getElementById(obj+'_div');
    var loading_div = document.getElementById(obj+'_loading_div');
    div.style.display = (loading) ? 'none' : '';
    loading_div.style.display = (loading) ? '' : 'none';  
}





 function load() 
 {
   if (GBrowserIsCompatible())
   {
     var loc;
     map = new GMap2(document.getElementById("map"));
     map.addControl(new GSmallMapControl());
     map.setCenter(new GLatLng(map_geo_lat,map_geo_lng),13);
     map.setMapType(G_HYBRID_MAP);
     tooltip = document.createElement("div");
     map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
     tooltip.style.visibility="hidden";
   }
 }
 
 
 
 function setMapGeoLatLng(lat,lng)
 {
    map_geo_lat = lat;
    map_geo_lng = lng;  
 }
 
 function importanceOrder (marker,b) 
 {
    return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
 }

 function createMarker(pPoint,pName,pLink,pIcon,pStyling,pImportance)
 {
     var marker = new GMarker(pPoint,{icon:pIcon,zIndexProcess:importanceOrder});
     marker.importance = pImportance;
     marker.tooltip = '<div class="tooltip" style="'+pStyling+'">'+pName+'</div>';
     marker.url = pLink;
     gmarkers[marker_counter++] = marker;
     map.addOverlay(marker);

     GEvent.addListener(marker, "click", function()
     {
       registerCTR('Map - Shortlist','','0','0','','1','Map');
       window.location.href=marker.url;
     });
     GEvent.addListener(marker,"mouseover", function()
     {
         var obj = document.getElementById('slideshow_button');
         if(obj)
         {
            obj.src = "/images/play.gif";
            // Pause slideshow
            stopSlideShow();
         }
         showTooltip(marker);
     });
     GEvent.addListener(marker,"mouseout", function()
     {
       tooltip.style.visibility="hidden"
     });
     return (marker_counter-1);
 }                       

 function showTooltip(marker)
 {
    tooltip.innerHTML = marker.tooltip;
    var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
    var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
    var anchor=marker.getIcon().iconAnchor;
    var width=marker.getIcon().iconSize.width;
    var height = 130;
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height));
    pos.apply(tooltip);
    tooltip.style.visibility="visible";
 }
 
 
function showOnMap()
{
   startSlideShow(gmarkers); 
}

var currentSlideShowList = '';
var currentSlideShowT = '';
var slideShowIntermission = 4;

function startSlideShow(item_list)
{
   currentSlideShowList = item_list;
   currentSlideShowT = setInterval('nextSlideShowItem();',slideShowIntermission*1000);
}


function resetMapVariables()
{
   stopSlideShow();
   gmarkers = [];
   marker_counter = 0;
   currentSlideShowList = '';
   currentSlideShowT = '';
   slideShowIntermission = 4; 
}


function nextSlideShowItem()
{
   var nextMarker = currentSlideShowList.shift();
   map.panTo(new GLatLng(nextMarker.getPoint().lat()+0.01,nextMarker.getPoint().lng()+0.02));
   showTooltip(nextMarker);
   currentSlideShowList.push(nextMarker); 
}

function stopSlideShow()
{
   if(currentSlideShowT)
   {
      clearInterval(currentSlideShowT);  
   }
}
