var map;
var geocoder = new GClientGeocoder();

var markers = new Array();
var markerText = new Array();
var numMarkers = 0;

var usermark = null;

var curaddress = null;

var zooml;
var curzoom;

//functions
var itemFindFn = null;
var handleData = null;
//

//kansas, y0
var initpoint = new GLatLng(38.498090, -98.320235);
var curpoint = new GLatLng(0,0);

var formkeys = ['miles', 'pricef', 'pricet', 'sorttype', 'sortdir', 'page', 'perpage'];
var formvals = new Array();

for(i in formkeys)
    formvals[formkeys[i]] = null;
formvals['sorttype'] = 3
formvals['sortdir'] = 0

//if there are other async things going on, we get hosed with just one of these
var goojax = getXmlHttpRequestObject();

var mapIcons = new Array();
mapIcons[""] = new GIcon(); 
mapIcons[""].image = "http://www.google.com/mapfiles/marker.png"; 
mapIcons[""].shadow="http://www.google.com/mapfiles/shadow50.png"; 
mapIcons[""].iconSize=new GSize(20, 34); 
mapIcons[""].shadowSize=new GSize(37, 34); 
mapIcons[""].iconAnchor=new GPoint(9,34); 
mapIcons[""].infoWindowAnchor=new GPoint(9,2); 
mapIcons[""].infoShadowAnchor=new GPoint(18,25); 
mapIcons[""].printImage="http://www.google.com/mapfiles/markerie.gif"; 
mapIcons[""].mozPrintImage="http://www.google.com/mapfiles/markerff.gif"; 
mapIcons[""].printShadow="http://www.google.com/mapfiles/dithshadow.gif"; 
mapIcons[""].transparent="http://www.google.com/mapfiles/markerTransparent.png";
mapIcons[""].imageMap=[9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0];

function numberedIcon(iconNumber) {

   var number;
   if (isNaN(parseInt(iconNumber))) {

      number = "";
   } else if (!isNaN(parseInt(iconNumber)) && ((iconNumber < 0) || (iconNumber > 99))) {
      number = "";
   } else if ((typeof(iconNumber)=="undefined") || (iconNumber==null)) { 
      number = "" 
   } else { 
      number = iconNumber; 
   }

   if (!mapIcons[iconNumber]) {
      var icon = new GIcon(mapIcons[""]);
      icon.image = "/static/image/markers/"+ number +".png";
      mapIcons[iconNumber]=icon;
   } 
   return mapIcons[iconNumber];
}

function mapload(mapid, lat, lng, mind, maxd, text, tooltip, sort, zoom) { 
    zooml = zoom;
    //if(lat != null && lng != null)
    //    formvals['miles'] = 50;
    
    formvals['sdate'] = mind;
    formvals['edate'] = maxd;
    
    formvals['sorttype'] = sort;
    formvals['sortdir'] = 0;
    
    if (GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById(mapid));
      map.addControl(new GSmallMapControl());
      
      if(lat == null || lng == null){
        curzoom = 4
        map.setCenter(initpoint, curzoom);
        //var marker = createMarker(initpoint, text, {title:tooltip}, true)
        curpoint = initpoint;
        itemFindFn(initpoint, map.getBounds());
      }
      else{
        curzoom = zoom
        var loc = new GLatLng(lat, lng);
        curpoint = loc; 
        map.setCenter(loc, zoom);
        
        var marker = createMarker(loc, text, {title:tooltip}, true, null)

        itemFindFn(loc, map.getBounds());
      }      
    }
}

function createMarker(point, text, opts, isuser, icon) {

  if( icon != null )
    opts.icon = icon;

  var marker = new GMarker(point, opts);
    
  //text = "<b>" + text + "</b>"
  
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(text);
  });

  if(isuser == true){
    removeUserMark()
    usermark = marker;
  }
  else{
    markers[numMarkers] = marker;
    markerText[numMarkers] = text;
    numMarkers++;
  }
  
  return marker;
}

function asyncShowCB(point) {
    if (!point) {
      alert("The location '" + curaddress + "' was not found!\nDid you spell everything correctly?");
      return null;
    }
    else {    
      //If we dont check for this the map has some odd behavior
      if( !(point.equals(curpoint)) ){
        curpoint = point;
        
        map.setCenter(point, zooml);
        
        var marker = new createMarker(point, "You are here!", {title: "You"}, true, null);
        
        var pos = marker.getPoint();
      }
      var bounds = map.getBounds();
      itemFindFn(point, bounds)
    }
}

function showInfoWindow(ind){
    markers[ind].openInfoWindowHtml(markerText[ind]);
}
    
function showAddress(address) {
  
  zoom = map.getZoom();
  if( map.getZoom() > 5 )
    zooml = curzoom = zoom

  curaddress = address;
  geocoder.getLatLng(curaddress, asyncShowCB);
}

function removeMarkers(){
        
    for( var i = 0; i < numMarkers; i++ )
        map.removeOverlay(markers[i]);
    
    numMarkers = 0;
}
function removeUserMark(){
    
    if( usermark != null )
        map.removeOverlay(usermark);
}

function getTimezone(){
    var visitortime = new Date();
    if(visitortime) {
        return -1*(visitortime.getTimezoneOffset()/60) ;
    }
    else {
        return 0;
    }
}

function showSearchAddress(address){
    if(address != null && address.length > 0 )
        showAddress(address)
    else
        itemFindFn(curpoint, map.getBounds());
}

//Called when the goojax response is returned.
function handleGmQuery() {
    if (goojax.readyState == 4) {
        
        removeMarkers();
        
        var str = goojax.responseText;
        
        var resd = gbid('mapResData');
        var tbl = '<table style="border-collapse: collapse; width: 99%;">'
        
        if( str != '\n' ){
            str = str.split("\n");
            pl = gbid('pageLinks');
            if ( pl )
                setHtml(pl, str[0]);
                
            for(i=1; i < str.length -1 && str[i] != 'err'; i++) {
                
                var data = str[i].split('^')
                tbl += dataHandler(i, data, resd);
                
            }
        }
        
        tbl += '</table>'
        if( resd )
            setHtml(resd, tbl);
    }
}

function findItems(path, point, mind, maxd, bounds) {
    
    var xparams = ''
    for( i in formvals ){
        if( formvals[i] != null )
            xparams += '&'+i+'='+formvals[i]
    }
    xparams += "&lat=" + point.lat() + "&lng=" + point.lng()
    
    if ((goojax.readyState == 4 || goojax.readyState == 0)) {
        //readyfn(xparams, 'tz=' + getTimezone(), dates, point);
        goojax.open("GET", path + '?tz=' + getTimezone() + xparams, true);
        goojax.onreadystatechange = handleGmQuery;
        goojax.send(null);
    }
}

//*******************************
//** site specific...

////////////YARDSALE

function makeYsRow(index, img, link, title, addy, date, start, end, dist){
    var picLink = img;
    //if( img != '' )
    //    picLink = ' <a href="'+link+'" style="color: #f00">Images!</a>'
    var txt = '<tr style="border-top: 1px solid #ddd;"><td><b>' + index + '</b></td>';
    //txt += '<td valign="top"><div class="thumb" style="background:url('+img+') no-repeat;"></div></td>';
    txt += '<td><table width="100%"><tr><td><a href="javascript: showInfoWindow('+(index-1)+')">'+title+'</a>' + picLink + '</td>';
    txt += '<td style="text-align: right;"><span style="color: #aaa;" class="sz8">' + dist +' miles</span></td>';
    //txt += '</tr><tr><td colspan="2" style="color: #666;">'+br+' br, '+bath+' bath, '+sqft+' sqft</td></tr>';
    txt += '</tr><tr><td colspan="2" style="color: #050;">'+date+'</td></tr>';
    txt += '</tr><tr><td colspan="2" class="bold">'+start+' - '+end+'</td></tr>';
    txt += '<tr><td colspan="2">'+addy+'</td></tr></table></td></tr>';
    return txt
}

function handleYsData(index, data, resd){
    var lat = parseFloat(data[0])
    var lng = parseFloat(data[1])
    
    //we should have lat, lng, date, starttime, endtime, url, title
    var point = new GLatLng(lat,lng)
    
    var date = data[2];
    var start = data[3];
    var end = data[4];
    var link = data[5];
    var title = data[6];
    var addy = data[7];
    var img = data[8];
    var brief = data[9];
    var dist = data[10];
    
    var permatext = "Permalink"
    if( brief.length >= 300 ){
        brief += '...';
        permatext = "More"
    }
    
    var txt = '<div><b>'+title+'</b></div>'
    txt += '<div>' + addy + '</div>'
    txt += '<div style="color: #050;">'+date+'</div>'
    txt += '<div>'+start+' to '+end+'</div>'
    txt += '<div>&nbsp;</div><div style="max-width: 350px;">'+brief+'</div>'
    txt += '<div style="text-align: right">'
    if(img != ''){
        img = img.split(';');
        var imgarr = '[';
        for( var i = 0; i < img.length; i ++){
            imgarr += "{'caption': '"+ title +"', 'url': '"+img[i]+"'}";
            if(i != img.length-1)
                imgarr += ','; //ie messes up the extra comma...
        }
        imgarr += ']';
        
        img = ' <a href="#" style="color: #f00" onclick="return GB_showImageSet('+imgarr+', 1)">Images!</a> ';
        txt += img;
    }
    txt += '<a href="'+link+'" onclick="return GB_showCenter(\''+title+'\', \''+link+'?l=lite\')">' + permatext + '</a></div>'
    
    //<a href="http://google.com/" onclick="return GB_showCenter('Google', this.href)">Visit Google</a>
    
    //txt += '<table><tr><td>Date:</td><td>'+date+'</td></tr>'
    //txt += '<tr><td>Start:</td><td>'+start+'</td></tr>'
    //txt += '<tr><td>End:</td><td>'+end+'</td></tr></table>'
    
    var marker = createMarker(point, txt, {title: addy}, false, numberedIcon(index));
    if(marker != null){
        map.addOverlay(marker);
        if( resd )
            return makeYsRow(index, img, link, title, addy, date, start, end, dist);
    }
    return '';
}

function findYardsales(point, bounds) {
    findItems('/asyncys', point, bounds);
}

function setContentHeight(){
    var height = getWindowSize().height;
    var ml = gbid('mainLayout');
    height = height - 175;
    if(height < 100)
        height = 100;
    ml.style.height = height + 'px';
}

function maploadYardsale(mapid, lat, lng, mind, maxd, text, tooltip, sort, zoom) {
    
    if(AJS.isIe()){
        AJS.AEV(window, 'resize', setContentHeight);
        setContentHeight();
    }
    
    itemFindFn = findYardsales;
    dataHandler = handleYsData;
    
    mapload(mapid, lat, lng, mind, maxd, text, tooltip, sort, zoom);
}

////////////////OPENHOUSE

function makeOhRow(index, img, link, title, price, br, bath, sqft, addy, date, start, end){
    var txt = '<tr><td><b>' + index + '</b></td>';
    txt += '<td valign="top"><div class="thumb" style="background:url('+img+') no-repeat;"></div></td>';
    txt += '<td><table width="100%"><tr><td><a href="'+link+'">'+title+'</a></td>';
    txt += '<td style="text-align: right;"><b>$'+price+'</b></td>';
    txt += '</tr><tr><td colspan="2" style="color: #666;">'+br+' br, '+bath+' bath, '+sqft+' sqft</td></tr>';
    txt += '</tr><tr><td colspan="2" style="color: #050;">'+date+' '+start+' - '+end+'</td></tr>';
    txt += '<tr><td colspan="2">'+addy+'</td></tr></table></td></tr>';
    return txt
}

function handleOhData(index, data, resd){
    var lat = parseFloat(data[0])
    var lng = parseFloat(data[1])
    
    //we should have lat, lng, date, starttime, endtime, url, title
    var point = new GLatLng(lat,lng)
    
    var date = data[2];
    var start = data[3];
    var end = data[4];
    var link = data[5];
    var title = data[6];
    var addy = data[7];
    var price = data[8];
    var br = data[9];
    var baths = data[10];
    var sqft = data[11];
    var img = data[12];
    
    var txt = '<a style="font-size: 12;" href="'+link+'">'+title+'</a><br/>'
    txt += addy + '<br/>'
    txt += br + ' beds, ' + baths + ' baths, ' + sqft + ' sqft ' + '<br/><br/>'
    txt += '<table><tr><td>Date:</td><td>'+date+'</td></tr>'
    txt += '<tr><td>Start:</td><td>'+start+'</td></tr>'
    txt += '<tr><td>End:</td><td>'+end+'</td></tr></table>'
    
    var marker = createMarker(point, txt, {title: addy}, false, numberedIcon(i));
    if(marker != null){
        map.addOverlay(marker);
        if( resd )
            return makeOhRow(i, img, link, title, price, br, baths, sqft, addy, date, start, end);
    }
    return '';
}

function findOpenHouses(point, bounds) {
    findItems('/homes/asyncoh', point, bounds);
}

function maploadOpenHouse(mapid, lat, lng, mind, maxd, text, tooltip, sort, zoom) { 
    
    itemFindFn = findOpenHouses;
    dataHandler = handleOhData;
    
    mapload(mapid, lat, lng, mind, maxd, text, tooltip, sort, zoom);
}
