var latitude = 47.614727;
var longitude = -122.328644;
var zoom = 11;
var type = "map";
var map;
var addMarkersonLoad=true;
var mymode = "none";
var timeOut = 150;
var i=0;
var items;
var baseicon; var yellowicon; var blueicon; var whiteicon; var greenicon; var redicon
var resiicon; var resiiconovr; var condicon; var condiconovr;
var isMSIE = false;
var isOpera = false;
var MSIEversion=0;
var marks = new Array();
var sideItems = new Array();
var myMarkerList;
var m;
var l;
var running = false;
var prevZoom = -1;
var shownall = false;
var lastCenter;
var lastPick="none";
var mouseInstructions="Mouse over map icon to see more information on a listing.<br /><br />Click map icon for full details.<br /><br />Drag map to move around.";
var iconctr=15;
var iconheight=32;
var iconwidth=35;
var anchorx=6;
var anchory=20;

	
var resiicon = new GIcon();
resiicon.iconSize = new GSize(iconwidth, iconheight);
resiicon.iconAnchor = new GPoint(anchorx, anchory);
resiicon.id="resiicon";
//var resiiconovr = new GIcon(resiicon);
var resiiconsold = new GIcon(resiicon);
var resiiconopen = new GIcon();
resiiconopen.iconSize = new GSize(35, 40);
resiiconopen.iconAnchor = new GPoint(anchorx, anchory);
//var resiiconopenovr = new GIcon(resiiconopen);
//var resiiconsoldovr = new GIcon(resiicon);
//var openovr = new GIcon(resiicon);
var condicon = new GIcon(resiicon);
//var condiconovr = new GIcon(resiicon);
var condiconsold = new GIcon(resiicon);
var condiconopen = new GIcon(resiiconopen);
//var condiconopenovr = new GIcon(resiiconopen);
//var condiconsoldovr = new GIcon(resiicon);

var twnicon = new GIcon(resiicon);
//var twniconovr = new GIcon(resiicon);
var twniconsold = new GIcon(resiicon);
var twniconopen = new GIcon(resiiconopen);
//var twniconopenovr = new GIcon(resiiconopen);
//var twniconsoldovr = new GIcon(resiicon);
var hsbicon = new GIcon(resiicon);
//var hsbiconovr = new GIcon(resiicon);
var hsbiconsold = new GIcon(resiicon);
var hsbiconopen = new GIcon(resiiconopen);
//var hsbiconopenovr = new GIcon(resiiconopen);
//var hsbiconsoldovr = new GIcon(resiicon);

var multicon = new GIcon(resiicon);
//var multiconovr = new GIcon(resiicon);
var multiconsold = new GIcon(resiicon);
var multiconopen = new GIcon(resiiconopen);
//var multiconopenovr = new GIcon(resiiconopen);
//var multiconsoldovr = new GIcon(resiicon);
var manuicon = new GIcon(resiicon);
//var manuiconovr = new GIcon(resiicon);
var manuiconsold = new GIcon(resiicon);
var manuiconopen = new GIcon(resiiconopen);
//var manuiconopenovr = new GIcon(resiiconopen);
//var manuiconsoldovr = new GIcon(resiicon);
var vaclicon = new GIcon(resiicon);
//var vacliconovr = new GIcon(resiicon);
var vacliconsold = new GIcon(resiicon);
//var vacliconsoldovr = new GIcon(resiicon);
var renticon = new GIcon(resiicon);
//var renticonovr = new GIcon(resiicon);
var comiicon = new GIcon(resiicon);
//var comiiconovr = new GIcon(resiicon);
var comiiconsold = new GIcon(resiicon);
//var comiiconsoldovr = new GIcon(resiicon);
var myIcons = new Array();

function setupIcons(icon_path, icon_type){
	resiicon.image = icon_path+"resi."+icon_type;
	resiiconsold.image = icon_path+"resi_sold."+icon_type;
	resiiconopen.image = icon_path+"resi_open."+icon_type;
	condicon.image = icon_path+"cond."+icon_type;
	condiconsold.image = icon_path+"cond_sold."+icon_type;
	condiconopen.image = icon_path+"cond_open."+icon_type;
	
	twnicon.image = icon_path+"twn."+icon_type;
	twniconsold.image = icon_path+"twn_sold."+icon_type;
	twniconopen.image = icon_path+"twn_open."+icon_type;
	
	hsbicon.image = icon_path+"hsb."+icon_type;
	hsbiconsold.image = icon_path+"hsb_sold."+icon_type;
	hsbiconopen.image = icon_path+"hsb_open."+icon_type;
	
	multicon.image = icon_path+"mult."+icon_type;
	multiconsold.image = icon_path+"mult_sold."+icon_type;
	multiconopen.image = icon_path+"mult_open."+icon_type;
	manuicon.image = icon_path+"manu."+icon_type;
	manuiconsold.image = icon_path+"manu_sold."+icon_type;
	manuiconopen.image = icon_path+"manu_open."+icon_type;
	vaclicon.image = icon_path+"vacl."+icon_type;
	vacliconsold.image = icon_path+"vacl_sold."+icon_type;
	renticon.image = icon_path+"rent."+icon_type;
	comiicon.image = icon_path+"comi."+icon_type;
	comiiconsold.image = icon_path+"comi_sold."+icon_type;


	myIcons.resiicon=resiicon;
	myIcons.condicon=condicon;
	myIcons.twnicon=twnicon;
	myIcons.hsbicon=hsbicon;
	myIcons.vaclicon=vaclicon;
	myIcons.comiicon=comiicon;
	myIcons.multicon=multicon;
	myIcons.manuicon=manuicon;
	myIcons.busoicon=comiicon;
	myIcons.renticon=renticon;
	myIcons.resiiconopen=resiiconopen;
	myIcons.condiconopen=condiconopen;
	myIcons.twniconopen=twniconopen;
	myIcons.hsbiconopen=hsbiconopen;
	myIcons.multiconopen=multiconopen;
	myIcons.manuiconopen=manuiconopen;
	myIcons.resiiconsold=resiiconsold;
	myIcons.condiconsold=condiconsold;
	myIcons.hsbiconsold=hsbiconsold;
	myIcons.twniconsold=twniconsold;
	myIcons.vacliconsold=vacliconsold;
	myIcons.comiiconsold=comiiconsold;
	myIcons.multiconsold=multiconsold;
	myIcons.manuiconsold=manuiconsold;
	myIcons.busoiconsold=comiiconsold;
	myIcons.renticonsold=comiiconsold;
}
if (navigator.appVersion.indexOf("MSIE")!=-1) {
  temp=navigator.appVersion.split("MSIE");
  MSIEversion=parseFloat(temp[1]);
}

if (MSIEversion>=5.5) { //NON IE browser will return 0
  isMSIE = true;
}

if (navigator.userAgent.indexOf("Opera")!=-1) {
  isOpera = true;
  isMSIE = false;
}
function uncheck(what){
  switch (what){
    case "st_box":
     var thebox1=document.getElementById("st_box_1");
     thebox1.checked=false;
     var thebox2=document.getElementById("st_box_2");
     thebox2.checked=false;
	 var thelistbox=document.getElementById("mylist_box");
     thelistbox.checked=false;
     break;
	 
    case "poh": 
     var thebox=document.getElementById("poh_box");
     thebox.checked=false;
	 var thelistbox=document.getElementById("mylist_box");
     thelistbox.checked=false;
	 break;
	 
	 case "all":
     var thebox1=document.getElementById("st_box_1");
     thebox1.checked=false;
     var thebox2=document.getElementById("st_box_2");
     thebox2.checked=false;
	 var thebox=document.getElementById("poh_box");
     thebox.checked=false;
     break;
   }
}
function doJunk(){
  alert("doing junk");
}
//marks[id] = createMarker(point,myIcon,myId,myLp,myLptyp,myStat,myBrBth,myAddress,myCity);
//function createMarker(point, icon, id, lp, ptyp, st, brbth, addr, city) {
function createMarker(point, icon, id) {
   var marker = new GMarker(point, myIcons[icon]);
   
   GEvent.addListener(marker, "click", function() {
      setView('detail', id);	
   }); 
   
   GEvent.addListener(marker, "mouseover", function() {

        var myCon=document.getElementById("controls");
        if(myCon.style.visibility=="visible"){
	  changeView();
	}
        document.getElementById("clock").style.visibility="visible";
	picsrc="<img src='http://photos.logicaldog.com/smallpic.php?LN="+id+"' width='180' ";
	picsrc+="onload=\"doStuff("+id+")\">";
        var picdiv=document.getElementById("picture");
        var picmsg=document.getElementById("instructions");
        var message=document.getElementById("message");
        picmsg.style.visibility="hidden";
        picdiv.style.visibility="visible";
	picdiv.innerHTML=picsrc;
	//var newMessage=marks[id].br + " bedroom, " + marks[id].bth + " bath";
	var newMessage=marks[id].lptyp + "<br />" + marks[id].lp + "<br />" + marks[id].brbth + "<br />";
	newMessage += marks[id].addr + "<br />" + marks[id].city + "<br />" + marks[id].stat; 
	message.innerHTML=newMessage;
	//marker.topMarkerZIndex(); // bring marker to top
	
   }); 

        GEvent.addListener(marker, "mouseout", function() {
        document.getElementById("clock").style.visibility="hidden";
        var picdiv=document.getElementById("picture");
        var picmsg=document.getElementById("instructions");
	picdiv.innerHTML=mouseInstructions;
        var message=document.getElementById("message");
	message.innerHTML="";
        //picmsg.style.visibility="visible";
        //picdiv.style.visibility="hidden";
	//document.getElementById("9"+id).style.backgroundColor="#f5f5f5";
        //marker.restoreImage();
   	//marker.restoreMarkerZIndex();
	
   });

   return marker;
}

var panels = new Array('panel1', 'panel2', 'panel3');
var selectedTab = null;

function showPanel(tab, name){
  if(selectedTab){
	selectedTab.className = 'tab';
    selectedTab.style.backgroundColor = '';
    selectedTab.style.paddingTop = '';
    selectedTab.style.paddingBottom = '';
  }
  selectedTab = tab;
  //selectedTab.style.backgroundColor = 'white';
  selectedTab.className = 'stab';
  //selectedTab.style.paddingTop = '6px';
  for(i = 0; i < panels.length; i++){
    document.getElementById(panels[i]).style.display = (name == panels[i]) ? 'block':'none';
  }
  return false;
}
function changeDetail(myDiv, myState, myLN){
  var theDiv=document.getElementById(myDiv);
  var theControls=document.getElementById('controls');

  var theOuter=document.getElementById('outerframe');
  var theList=document.getElementById('list');
  var thePic=document.getElementById('picture');
  var theNav=document.getElementById('navigation');
  var theMsg=document.getElementById('message');
  var theBrand=document.getElementById('branding');
  var theLeft=document.getElementById('left_floater');
  theDiv.style.visibility=myState;
  if(myState=="visible"){
      theControls.style.visibility="hidden";
      theNav.style.visibility="hidden";
      theMsg.style.visibility="hidden";
      theOuter.style.visibility="hidden";
      theList.style.visibility="hidden";
      thePic.style.visibility="hidden";
      theBrand.style.visibility="hidden";
      theLeft.style.visibility="hidden";
      xajax_getDetails(myLN);
      showPanel(document.getElementById('tab1'), 'panel1');
  }
  if(myState=="hidden"){
      //theControls.style.visibility="visible";
      theNav.style.visibility="visible";
      theMsg.style.visibility="visible";
      theOuter.style.visibility="visible";
      theList.style.visibility="visible";
      thePic.style.visibility="visible";
      theBrand.style.visibility="visible";
      theLeft.style.visibility="visible";
      theDiv.innerHTML="Loading details...";
  }
}
function setView(what,myLN){
  var myHelpers=document.getElementById("helpers");
  var myHelp=document.getElementById("help");
  var myWelcome=document.getElementById("welcome");
  var myPropList=document.getElementById("thelist");
  var myListContent=document.getElementById("listContent");
  var myDetail=document.getElementById("detail");
  var myMap=document.getElementById("mapdiv");
  var myRefineBar=document.getElementById("refine_bar");
  var myFocusBoxes=document.getElementById("focus_boxes");
  var myPropStatus=document.getElementById('prop_status');
  var myPropType=document.getElementById('prop_type');
  var myCon=document.getElementById("controls");
  var myList=document.getElementById("list");
  var myNav=document.getElementById("navigation");
  var myMsg=document.getElementById("message");
  var myPic=document.getElementById("picture");
  var myPicMsg=document.getElementById("instructions");
  var myMapClock=document.getElementById("mapclock");
  var myOuter=document.getElementById('outerframe');
  var myBrand=document.getElementById('branding');
  var myBestWith=document.getElementById('bestwith');
  var myAlert=document.getElementById('toomany');
  var myGoogleAlert=document.getElementById('notfound');
  var myLeft=document.getElementById('left_floater');
  var myLegendWrapper=document.getElementById('legend_wrapper');
  var myListID=document.getElementById('display_list');

  switch(what){
    case 'detail':
	  selectTab('prop_detail');
	  myHelpers.style.display="none";
	  myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myListContent.style.display="none";
      myMap.style.visibility="hidden";
	  myRefineBar.style.visibility="hidden";
	  myFocusBoxes.style.visibility="hidden";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myNav.style.visibility="hidden";
      myMsg.style.visibility="hidden";
      myOuter.style.visibility="visible";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myBrand.style.visibility="hidden";
      myBestWith.style.visibility="hidden";
	  myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="none";
	  myListID.style.visibility="hidden";
      //myPicMsg.style.visibility="hidden";
	  
      //add display style to prevent being "on top" of flash or forms
	  myDetail.style.visibility="visible";
	  myDetail.style.display="block";
      
	  xajax_getDetails(myLN);
	  break;
	  
    case 'results':
	  selectTab('map');
	  myHelpers.style.display="none";
	  myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myListContent.style.display="none";
	  myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myMap.style.visibility="visible";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
	  myLeft.style.left="10px";
      myLeft.style.visibility="visible";
      myCon.style.visibility="hidden";
      myList.style.visibility="visible";
      myPic.style.visibility="visible";
      myPic.innerHTML=mouseInstructions;
      myNav.style.visibility="visible";
      myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
      myOuter.style.visibility="visible";
      //myPicMsg.style.visibility="visible";
      myMsg.style.visibility="visible";
      myBrand.style.visibility="visible";
      myBestWith.style.visibility="visible";
      myNav.innerHTML="Refine Search";
      myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="block";
      break; 
	  
    case 'refine':  
      selectTab('map');
	  myHelpers.style.display="none";
	  myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myListContent.style.display="none";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myMap.style.visibility="visible";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myOuter.style.visibility="visible";
      myNav.style.visibility="visible";
      myBrand.style.visibility="visible";
      myBestWith.style.visibility="visible";
      myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
      //myPicMsg.style.visibility="hidden";
      myNav.innerHTML="Results";
      myMsg.style.visibility="hidden";
	  myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="block";
	  myListID.style.visibility="hidden";
      break;
	  
    case 'notfound': 
	  myHelpers.style.display="none";
      myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
      myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myListContent.style.display="none";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="visible";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myMap.style.visibility="visible";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myOuter.style.visibility="visible";
      myNav.style.visibility="visible";
      myBrand.style.visibility="visible";
      myBestWith.style.visibility="visible";
      myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
      //myPicMsg.style.visibility="hidden";
      myNav.innerHTML="Results";
      myMsg.style.visibility="hidden";
	  myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="block";
	  myListID.style.visibility="hidden";
      break;
      
    case 'searching':  
      selectTab('map');
	  myHelpers.style.display="none";
	  myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myListContent.style.display="none";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myMap.style.visibility="visible";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      //myList.innerHTML="";
      myList.style.visibility="visible";
      myPic.style.visibility="hidden";
      //myPicMsg.style.visibility="visible";
      myMsg.style.visibility="hidden";
      myMsg.innerHTML="Searching";
      myNav.innerHTML="Refine Search";
      myMapClock.innerHTML="Please Wait...";
      myMapClock.style.visibility="visible";
	  myLegendWrapper.style.display="block";
	  
      break; 
	  
	  case 'my_list':
      selectTab('my_list');
	  myHelpers.style.display="none";
	  myHelp.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myPropList.style.visibility="visible";
	  myListContent.style.display="block";
	  myPropList.style.display="block";
      myMap.style.visibility="hidden";
	  myRefineBar.style.visibility="hidden";
	  myFocusBoxes.style.visibility="hidden";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myNav.style.visibility="hidden";
      myMsg.style.visibility="hidden";
      myOuter.style.visibility="visible";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myBrand.style.visibility="hidden";
      myBestWith.style.visibility="hidden";
	  myMapClock.style.visibility="hidden";
      //myPicMsg.style.visibility="hidden";
	  
      //add display style to prevent being "on top" of flash or forms
	  myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
	  myLegendWrapper.style.display="none";
	  myListID.style.visibility="hidden";
	  
      break;
	  
	  
	  case 'help':
      selectTab('help');
	  myHelpers.style.display="none";
	  myPropList.style.visibility="hidden";
	  myWelcome.style.visibility="hidden";
	  myHelp.style.display="block";
      myMap.style.visibility="hidden";
	  myRefineBar.style.visibility="hidden";
	  myFocusBoxes.style.visibility="hidden";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myNav.style.visibility="hidden";
      myMsg.style.visibility="hidden";
      myOuter.style.visibility="visible";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myBrand.style.visibility="hidden";
      myBestWith.style.visibility="hidden";
	  myMapClock.style.visibility="hidden";
      //myPicMsg.style.visibility="hidden";
	  
      //add display style to prevent being "on top" of flash or forms
	  myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
	  myLegendWrapper.style.display="none";
	  myListID.style.visibility="hidden";
      break;
	  
	  case 'welcome':
	  selectTab('map');
	  myHelpers.style.display="none";
	  myWelcome.style.visibility="visible";
	  myHelp.style.display="none";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myMap.style.visibility="visible";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myNav.style.visibility="hidden";
      myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
      myOuter.style.visibility="visible";
      //myPicMsg.style.visibility="visible";
      myMsg.style.visibility="hidden";
      myBrand.style.visibility="visible";
      myBestWith.style.visibility="visible";
      myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="block";
	  myListID.style.visibility="hidden";
      break; 
	  
	  case 'draw_zoom':
	  selectTab('map');
	  myHelpers.style.display="none";
	  myWelcome.style.visibility="hidden";
	  myHelp.style.display="none";
	  myPropList.style.visibility="hidden";
	  myPropList.style.display="none";
	  myAlert.style.visibility="hidden";
	  myGoogleAlert.style.visibility="hidden";
      myMap.style.visibility="visible";
	  myRefineBar.style.visibility="visible";
	  myFocusBoxes.style.visibility="visible";
	  myPropStatus.style.visibility="hidden";
	  myPropType.style.visibility="hidden";
      myLeft.style.visibility="hidden";
      myCon.style.visibility="hidden";
      myList.style.visibility="hidden";
      myPic.style.visibility="hidden";
      myNav.style.visibility="hidden";
      myDetail.style.visibility="hidden";
	  myDetail.style.display="none";
      myOuter.style.visibility="visible";
      myPicMsg.style.visibility="hidden";
      myMsg.style.visibility="hidden";
      myBrand.style.visibility="visible";
      myBestWith.style.visibility="visible";
      myMapClock.style.visibility="hidden";
	  myLegendWrapper.style.display="none";
	  myListID.style.visibility="hidden";
      break; 
	  
  }
}

function changeView(){
  var myCon=document.getElementById("controls");
  if(myCon.style.visibility=="visible"){
      setView('results');
    }else{
      setView('refine');
  }
}
function doStuff(id){
  document.getElementById("clock").style.visibility="hidden";
  if(lastPick != 'none'){
    document.getElementById(lastPick).style.backgroundColor="#f5f5f5";
  }
  //document.getElementById("9"+id).style.backgroundColor="#888888";
  //lastPick="9"+id;
  //document.getElementById("8"+id).focus();
}
function hideClock(){
  document.getElementById("clock").style.visibility="hidden";
}

function onLoad(){
  if(!GBrowserIsCompatible()){
      var err = document.getElementById("errmsg");
      err.style.visibility = "visible";
    }else{
	  var icon_path=document.getElementById("icon_path").value;
	  var icon_type=document.getElementById("icon_type").value;
	  setupIcons(icon_path,icon_type);
	  	  
	  //load up focus map form county dropdown menu
	  xajax_makeDropdown('','county_sel','County');
      getParameters();//just getting the lat/lon to use...
	  
	  
	  document.getElementById("mapclock").style.visibility="visible";
	  map = new GMap2(document.getElementById("mapdiv"));
	  //map.addControl(new GLargeMapControl());
	  //map.addControl(new GSmallZoomControl());
	 map.addControl(
		  new TextualZoomControl(),
		  new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,10)));
		map.enableContinuousZoom();
	  
	 var otherOpts = { 
		  buttonStartingStyle: {display:'block',color:'black',background:'white',width:'80px',textAlign:'center',
			fontFamily:'Verdana',fontSize:'10px',lineHeight:'12px',border:'1px solid gray',padding:'3px',cursor:'pointer', marginBottom:'3px'},
		  buttonHTML: 'Draw Zoom',
		  buttonZoomingHTML: 'Draw a region on the map.',
		  buttonZoomingStyle: {background:'#CCCCCC'},
		  backButtonEnabled: false
		} 
		map.addControl(new DragZoomControl({}, otherOpts, {}), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,48)));
		


	  //map.addControl(new GSmallMapControl());
	 // map.addMapType(G_PHYSICAL_MAP);
	  map.addControl(new GMapTypeControl());
	  //map.addControl(new GScaleControl());
	  map.setCenter(new GLatLng(latitude,longitude), zoom);
	  
	  if(type == 'sat'){
		  map.setMapType(G_SATELLITE_MAP);
		}else if(type == 'hybrid'){
		  map.setMapType(G_HYBRID_MAP);
		}else{
		  map.setMapType(G_NORMAL_MAP);
		  
	  }
	  
	 // var myPano;
    
     // var mapPano = new GLatLng(latitude,longitude);
     // panoramaOptions = { latlng:mapPano };
     // myPano = new GStreetviewPanorama(document.getElementById("pano"), panoramaOptions);
      //GEvent.addListener(myPano, "error", handleNoFlash);

    

	 
	  m = document.getElementById("mapclock");      
	  listdiv=document.getElementById("list");
	  var picdiv=document.getElementById("picture");
	  var picdivmsg=picdiv.innerHTML;
		//if (stopLoad!=true){
			  if (addMarkersonLoad==true){
				  update_map();
			  }else{
				 setView('welcome');
			  }
			  
			  lastCenter = map.getCenter();
		
			  GEvent.addListener(map, "zoomend", function(){
					//update_map(); alert ('zzomend');
			  });
			  
			  GEvent.addListener(map, "moveend", function(){
				center = map.getCenter();
				if (center != lastCenter) {
			  		update_map();
			  		lastCenter = center;
					//alert ('moveend');
				}
			  });
	  //}
  }
}
function handleNoFlash(errorCode) {
  if (errorCode == FLASH_UNAVAILABLE) {
	alert("Error: Flash doesn't appear to be supported by your browser");
	return;
  }
}
function setMode(a){
    currentMode = a;
    if (currentMode == 1)   // hide map and show the panorama
    {

		//document.getElementById("pano").style.display = "block";
		document.getElementById("mapdiv").style.display = "none";
    }
    else
    {                
         //document.getElementById("pano").style.display = "none";
         document.getElementById("mapdiv").style.display = "block";

    }
}
function getParameters(){
	//stopLoad=false;
  var url = new String(location.href);
 addMarkersonLoad=false;
 if(url.indexOf('?') > -1){
      var queryString = url.split('?');
      if (queryString[1].length > 0) {
		  var paramString = queryString[1];
          var params = paramString.split("&");
          for (var i=0; i<= params.length-1; i++){
            var curParam= params[i].split("=");
            if (curParam[1].length > 0) {
	        var param=curParam[0].toLowerCase();
                switch (param){
		  			case "mode":
		    			mymode = curParam[1];
		  			break;
                  	
					case "lon":
                    	var curlon = curParam[1];
	            		if((curlon >=-180 ) && (curlon <= 180)){
                        	longitude = curParam[1];
	           			}
                    break;
                  
				  	case "lat":
                    	var curlat = curParam[1];
						if ((curlat >=-180 ) && (curlat <= 180)) {
							latitude = curlat;
						}
                    break;
                  
				  	case "zoom":
                    	var curzoom = curParam[1];
						if ((curzoom >=1 ) && (curzoom <= 18)) {
							zoom = parseInt(curzoom);
						}
                    break;
                  	
					case "type":
                    	if ( curParam[1].toLowerCase() == 'sat' ) {
                        	type = "sat";
                      	}else if( curParam[1].toLowerCase() == 'hybrid' ) {
                        	type = "hybrid";
                      	}else{
                        	type = "map";
                    	}
                    break;
					
					case "q":
						var myQ=curParam[1];
						//stopLoad=true;
						xajax_talktoGoogle(myQ);
						//addMarkersonLoad=true;
					break;
					
                 }
	     	}
          }
      }		  
  }else{
	  //set defaults
	  addMarkersonLoad=false;
  }
}

function getSelectedCheckbox(buttonGroup) {
   var retArr = new Array();
   var lastElement = 0;
   if (buttonGroup[0]) { // if the button group is an array (one check box is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            retArr.length = lastElement;
            retArr[lastElement] = i;
            lastElement++;
         }
      }
   } else { 
      if (buttonGroup.checked) { // if the one check box is checked
         retArr.length = lastElement;
         retArr[lastElement] = 0; // return zero as the only array value
      }
   }
	   return retArr;

} // Ends the "getSelectedCheckbox" function

function uncheckAll(buttonGroup) {
   var retArr = new Array();
   var lastElement = 0;
   if (buttonGroup[0]) { // if the button group is an array (one check box is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         buttonGroup[i].checked=false;
      }
   }
	   return retArr;

} // Ends the "getSelectedCheckbox" function


function getSelectedCheckboxValue(buttonGroup) {
   // return an array of values selected in the check box group. if no boxes
   // were checked, returned array will be empty (length will be zero)
   var retArr = new Array(); // set up empty array for the return values
   var selectedItems = getSelectedCheckbox(buttonGroup);
   if (selectedItems.length != 0) { // if there was something selected
      retArr.length = selectedItems.length;
      for (var i=0; i<selectedItems.length; i++) {
         if (buttonGroup[selectedItems[i]]) { // Make sure it's an array
            retArr[i] = buttonGroup[selectedItems[i]].value;
         } else { // It's not an array (there's just one check box and it's selected)
            retArr[i] = buttonGroup.value;// return that value
         }
      }
   }
   return retArr;
} // Ends the "getSelectedCheckBoxValue" function


function update_map(){
	//alert (running);
  setView('searching');
  map.clearOverlays();
  marks = new Array();
  //hmarks = new Array();

  if (running) {
	  	//alert ('a');
    request.abort();
    running = false;
  }
  //if(shownall == false || map.getZoomLevel() >= prevZoom){
  //if(shownall == true || shownall == false){
      
      var bounds = map.getBounds();
      var center = map.getCenter();
      var zoom = map.getZoom();
      var loPrice = document.getElementById("low");
      var hiPrice = document.getElementById("high");
      var myQuery = "bounds="+bounds.toString();
      var myPtyp = getSelectedCheckboxValue(document.prop_boxes.prop_box);
      var myPtypStr=myPtyp.join(",");
      var mySt = getSelectedCheckboxValue(document.st_boxes.st_box);
      var myStStr=mySt.join(",");
      var myPoh = getSelectedCheckboxValue(document.poh_boxes.poh_box);
      var myPohStr=myPoh.join(",");
	  
	  var current_list=getList();
	  if (current_list!=""){
		  document.getElementById('listbox_display').style.display="block";
	  }else{
		 document.getElementById('listbox_display').style.display="none"; 
	  }
	  ///added for "my list"
	  var myList = getSelectedCheckboxValue(document.poh_boxes.mylist_box);
      if (myList=="yes"){
		  var myListID=document.getElementById("display_list");
		  myListID.style.visibility="visible";
		  var myListStr = current_list;
	  }else{
		  var myListStr = "none";
		  var myListID=document.getElementById("display_list");
		  myListID.style.visibility="hidden";
	  }
	  //added for mls number
	  var myMlsNum=document.getElementById('mlsnum').value;
	  if (myMlsNum.length>0){
		  var myListStr = '+'+myMlsNum;
		  var myListID=document.getElementById("display_list");
		  myListID.style.visibility="visible";
	  }
	  
	  /////
	  //added for show/no show open houses
	  var myShowPohStr=document.getElementById("showpoh").value;
	  ///
      myQuery += "&LP_from=" + loPrice.value;
      myQuery += "&LP_to=" + hiPrice.value;
      myQuery += "&ptyp=" + myPtypStr;
      myQuery += "&st=" + myStStr;
      myQuery += "&poh=" + myPohStr;
	  
	  ////
	  myQuery += "&my_list=" + myListStr;
	  myQuery += "&showpoh=" + myShowPohStr;
   	  //////
	
      //****************************************************************************
      // always get a count of how many markers to fetch
      //****************************************************************************
      requestCount = GXmlHttp.create();
      requestCount.open("GET", "6markers.php?"+myQuery+"&mode=count&db="+mymode, true);
	 //alert ("6markers.php?"+myQuery+"&mode=count&db="+mymode);
      requestCount.send(null);

      // readystate will cycle from 2 to 3 to 4
      requestCount.onreadystatechange = function(){
        if(requestCount.readyState == 4){
        
          // this is the problem line - need to only do this at readystate 4
	  var xmlDocCount = requestCount.responseXML;
	  var xmlDocText = requestCount.responseText;
	  // ??? state is never running here, running is set at end of function
	  if (requestCount.readyState == 4 && running){
              m.innerHTML = "Parsing XML..";
              //var xmlDocCount = requestCount.responseXML;
          }

	  var countCheck = xmlDocCount.documentElement.getElementsByTagName("count");
	  var testCount=countCheck[0].getAttribute("value");
	 // alert (testCount);
          //GLog.write(requestCount.responseText);
          //****************************************************************************
	  // act upon the results of the test count 
          //****************************************************************************
          if(testCount > 90){
	      setView('refine');
              document.getElementById("mapclock").style.visibility="hidden";
              document.getElementById("toomany").style.visibility="visible";
	      m.innerHTML= testCount + " listings in this view, please zoom in or narrow your price range!";
	  
	    }else{
	      // send a request for the markers within the bounds 
              request = GXmlHttp.create();
              request.open("GET", "6markers.php?"+myQuery+"&db="+ mymode, true);
              request.send(null);

              request.onreadystatechange = function(){
                  if(request.readyState == 4){
	      
	            // also need to do this only at readystate 4 
                    var xmlDoc = request.responseXML;
                    if (request.readyState == 4 && running){
                        m.innerHTML = "Parsing XML..";
                    }
	            // markers contains the entire list of points within our bounds
                    var markers = xmlDoc.documentElement.getElementsByTagName("marker");
                    //GLog.write(request.responseText);

                    // never really ever see this message, maybe just lose it?
	            m.innerHTML = "Adding Markers...";
              
	            for(var i = 0; i < markers.length; i++){
                        id = markers[i].getAttribute("id");
                        //id = i;
                        if(marks[id] && marks[id] != null){
                            marks[id].old = false;
                            //hmarks[id].old = false;
                          }else{
                            var myLon = parseFloat(markers[i].getAttribute("lng"));
                            var myLat = parseFloat(markers[i].getAttribute("lat"));
                            var myId = parseFloat(markers[i].getAttribute("id"));
                            var myLp = markers[i].getAttribute("lp");
                            //var myBr = markers[i].getAttribute("br");
                            //var myBth = markers[i].getAttribute("bth");
                            //var mySt = markers[i].getAttribute("st");
                            //var myPtyp = markers[i].getAttribute("ptyp");
                            //var myPoh = markers[i].getAttribute("poh");
                            //var myDisp = markers[i].getAttribute("disp");
                            var myIcon = markers[i].getAttribute("icon");
                            var myBrBth = markers[i].getAttribute("brbth");
                            var myStat = markers[i].getAttribute("stat");
                            var myLptyp = markers[i].getAttribute("lptyp");
                            var myAddress = markers[i].getAttribute("address");
                            var myCity = markers[i].getAttribute("city");
                            var point = new GLatLng(myLat,myLon);
			    
			    //if(myPoh=="yes"){
			      //  mySt="poh";
			    //}
                            //GLog.write(myIcon);
                            //alert(myIcon); 
			    marks[id] = createMarker(point,myIcon,myId);
			    //hmarks[id] = createMarker(point,condiconopenovr,"h"+myId,myLp,myPtyp,mySt);
                            
			    map.addOverlay(marks[id]);
                            //marks[id].isnew = true;
                            //marks[id].lat = myLat;
                            //marks[id].lon = myLon;
                            marks[id].id = myId;
                            marks[id].lp = myLp;
                            //marks[id].br = myBr;
                            //marks[id].st = mySt;
                            //marks[id].ptyp = myPtyp;
                            //marks[id].bth = myBth;
                            //marks[id].disp = myDisp;
			    //new stuff here
                            marks[id].brbth = myBrBth;
                            marks[id].stat = myStat;
                            marks[id].lptyp = myLptyp;
                            marks[id].addr = myAddress;
                            marks[id].city = myCity;
                        }
                    }
		    
		    //mylist="";
		    listdiv.innerHTML="<img src='map_icons/legend.gif'>";
	            var count = xmlDoc.documentElement.getElementsByTagName("count");
                    if(count && count.length > 0){
                        c = count[0].getAttribute("value");
                        if (markers.length == c){
			    /*
                            document.getElementById("mapclock").style.visibility="hidden";
                            document.getElementById("controls").style.visibility="hidden";
                            document.getElementById("navigation").innerHTML="Refine Search";
                            document.getElementById("picture").style.visibility="visible";
                            document.getElementById("picmsg").style.visibility="visible";
                            document.getElementById("list").style.visibility="visible";
                            document.getElementById("message").style.visibility="visible";
			    //changeView();
			    */
			    setView('results');
			    var recordCount=document.getElementById("message");
                            recordCount.innerHTML = "Done, showing "+markers.length+" listings";
                            shownall = true;
                          }else{
                            m.innerHTML = "Done, showing random "+markers.length+" of "+c+" markers, ";
                            m.innerHTML += "Zoom-in to see more";
                            shownall = false;
                        }
                      }else{
                        m.innerHTML = "Finished, showing "+markers.length+" of unknown markers";
                        document.getElementById("mapclock").style.visibility="hidden";
                        shownall = true;
                    }
                    running = false;
		  } // end of if(request.readyState == 4) function
              }//end of request.onreadystatechange = function
              m.innerHTML = "Requesting Results...";
              running = true;
	  }//end of if
	} //end of if(requestCount.readyState == 4) function
      } //end of requestCount.onreadystatechange function
  //} // end of if(shownall == false
  prevZoom = map.getZoom();
} // end of update_map function

/*
* DragZoomControl Class 
 */ 
function DragZoomControl(opts_boxStyle, opts_other, opts_callbacks) {
  // Holds all information needed globally
  // Not all globals are initialized here
  this.globals = {
    draggingOn: false,
    cornerTopDiv: null,
    cornerRightDiv: null,
    cornerBottomDiv: null,
    cornerLeftDiv: null,
    mapPosition: null,
    outlineDiv: null,
    mapWidth: 0,
    mapHeight: 0,
    mapRatio: 0,
    startX: 0,
    startY: 0,
    borderCorrection: 0
  };

  //box style options
  this.globals.style = {
    opacity: .2,
    fillColor: "#000",
    border: "2px solid blue"
  };

  var style = this.globals.style;
  for (var s in opts_boxStyle) {
    style[s]=opts_boxStyle[s];
  }

  var borderStyleArray = style.border.split(' ');
  style.outlineWidth = parseInt(borderStyleArray[0].replace(/\D/g,''));
  style.outlineColor = borderStyleArray[2];
  style.alphaIE = 'alpha(opacity=' + (style.opacity * 100) + ')';
 
  // map context stack for back button
  this.globals.backStack = [];

  // Other options
  this.globals.options={
    buttonHTML: 'zoom ...',
    buttonStartingStyle: 
      {width: '52px', border: '1px solid black', padding: '2px'},
    buttonStyle: {background: '#FFF'},
    backButtonHTML: 'zoom back',
    backButtonStyle: {background: '#FFF', display: 'none'},
    buttonZoomingHTML: 'Draw a region on the map',
    buttonZoomingStyle: {background: '#FF0'},
    overlayRemoveTime: 6000,
    backButtonEnabled: false,
    stickyZoomEnabled: false
  };
	
  for (var s in opts_other) {
    this.globals.options[s] = opts_other[s]
  }

  // callbacks: buttonclick, dragstart, dragging, dragend, backbuttonclick 
  if (opts_callbacks == null) {
    opts_callbacks = {}
  }
  this.globals.callbacks = opts_callbacks;

}

DragZoomControl.prototype = new GControl();


/**
 * Back Button functionality:	
 * Method of this object called to save the map context before the zoom.
 * @param {text} text string for the back button
 */
DragZoomControl.prototype.saveMapContext = function(text) {
  if (this.globals.options.backButtonEnabled) {
    this.saveBackContext_(text,true);
    this.globals.backButtonDiv.style.display = 'block';
  }	
};


/**
 * Creates a new button to control gzoom and appends to the button container div.
 * @param {DOM Node} buttonContainerDiv created in main .initialize code
 */
DragZoomControl.prototype.initButton_ = function(buttonContainerDiv) {
  var G = this.globals;
  var buttonDiv = document.createElement('div');
  buttonDiv.innerHTML = G.options.buttonHTML;
  buttonDiv.id = 'gzoom-control';
  DragZoomUtil.style([buttonDiv], {cursor: 'pointer', zIndex:200});
  DragZoomUtil.style([buttonDiv], G.options.buttonStartingStyle);
  DragZoomUtil.style([buttonDiv], G.options.buttonStyle);
  buttonContainerDiv.appendChild(buttonDiv);
  return buttonDiv;
};

/**												
 * Creates a second new button to control backup zoom and appends to the button container div.
 * @param {DOM Node} buttonContainerDiv created in main .initialize code
 */
DragZoomControl.prototype.initBackButton_ = function(buttonContainerDiv) {	//**BB** entire function
  var G = this.globals;
  var backButtonDiv = document.createElement('div');
  backButtonDiv.innerHTML = G.options.backButtonHTML;
  backButtonDiv.id = 'gzoom-back';
  DragZoomUtil.style([backButtonDiv], {cursor: 'pointer', zIndex:200});
  DragZoomUtil.style([backButtonDiv], G.options.buttonStartingStyle);
  DragZoomUtil.style([backButtonDiv], G.options.backButtonStyle);
  buttonContainerDiv.appendChild(backButtonDiv);
  return backButtonDiv;
};

/**
 * Sets button mode to zooming or otherwise, changes CSS & HTML.
 * @param {String} mode Either "zooming" or not.
 */
DragZoomControl.prototype.setButtonMode_ = function(mode){
  var G = this.globals;
  if (mode == 'zooming') {
    G.buttonDiv.innerHTML = G.options.buttonZoomingHTML;
    DragZoomUtil.style([G.buttonDiv], G.options.buttonStartingStyle);
    DragZoomUtil.style([G.buttonDiv], G.options.buttonZoomingStyle);
  } else {
    G.buttonDiv.innerHTML = G.options.buttonHTML;
    DragZoomUtil.style([G.buttonDiv], G.options.buttonStartingStyle);
    DragZoomUtil.style([G.buttonDiv], G.options.buttonStyle);
  }
};

/**
 * Is called by GMap2's addOverlay method. Creates the zoom control
 * divs and appends to the map div.
 * @param {GMap2} map The map that has had this DragZoomControl added to it.
 * @return {DOM Object} Div that holds the gzoomcontrol button
 */ 
DragZoomControl.prototype.initialize = function(map) {
  var G = this.globals;
  var me = this;
  var mapDiv = map.getContainer();
 
  // Create div for both buttons	
    var buttonContainerDiv = document.createElement("div");	
    DragZoomUtil.style([buttonContainerDiv], {cursor: 'pointer', zIndex: 150});

  // create and init the zoom button
    //DOM:button
    var buttonDiv = this.initButton_(buttonContainerDiv);

  // create and init the back button				
    //DOM:button
    var backButtonDiv = this.initBackButton_(buttonContainerDiv);
  
  // Add the two buttons to the map 					
    mapDiv.appendChild(buttonContainerDiv);
 
  //DOM:map covers
    var zoomDiv = document.createElement("div");
    zoomDiv.id ='gzoom-map-cover';
    zoomDiv.innerHTML ='<div id="gzoom-outline" style="position:absolute;display:none;"></div><div id="gzoom-cornerTopDiv" style="position:absolute;display:none;"></div><div id="gzoom-cornerLeftDiv" style="position:absolute;display:none;"></div><div id="gzoom-cornerRightDiv" style="position:absolute;display:none;"></div><div id="gzoom-cornerBottomDiv" style="position:absolute;display:none;"></div>';
    DragZoomUtil.style([zoomDiv], {position: 'absolute', display: 'none', overflow: 'hidden', cursor: 'crosshair', zIndex: 101});
    mapDiv.appendChild(zoomDiv);
  
  // add event listeners
    GEvent.addDomListener(buttonDiv, 'click', function(e) {
      me.buttonclick_(e);
    });
    GEvent.addDomListener(backButtonDiv, 'click', function(e) {
      me.backButtonclick_(e);
    });
    GEvent.addDomListener(zoomDiv, 'mousedown', function(e) {
      me.coverMousedown_(e);
    });
    GEvent.addDomListener(document, 'mousemove', function(e) {
      me.drag_(e);
    });
    GEvent.addDomListener(document, 'mouseup', function(e) {
      me.mouseup_(e);
    });
  
  // get globals
    G.mapPosition = DragZoomUtil.getElementPosition(mapDiv);
    G.outlineDiv = DragZoomUtil.gE("gzoom-outline");	
    G.buttonDiv = DragZoomUtil.gE("gzoom-control");
    G.backButtonDiv = DragZoomUtil.gE("gzoom-back");
    G.mapCover = DragZoomUtil.gE("gzoom-map-cover");
    G.cornerTopDiv = DragZoomUtil.gE("gzoom-cornerTopDiv");
    G.cornerRightDiv = DragZoomUtil.gE("gzoom-cornerRightDiv");
    G.cornerBottomDiv = DragZoomUtil.gE("gzoom-cornerBottomDiv");
    G.cornerLeftDiv = DragZoomUtil.gE("gzoom-cornerLeftDiv");
    G.map = map;
  
    G.borderCorrection = G.style.outlineWidth * 2;	
    this.setDimensions_();
  
  //styles
    this.initStyles_();
  return buttonContainerDiv;
};

/**
 * Required by GMaps API for controls. 
 * @return {GControlPosition} Default location for control
 */
DragZoomControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(3, 120));
};

/**
 * Function called when mousedown event is captured.
 * @param {Object} e 
 */
DragZoomControl.prototype.coverMousedown_ = function(e){
  var G = this.globals;
  var pos = this.getRelPos_(e);
  G.startX = pos.left;
  G.startY = pos.top;
  
  DragZoomUtil.style([G.mapCover], {background: 'transparent', opacity: 1, filter: 'alpha(opacity=100)'});
  DragZoomUtil.style([G.outlineDiv], {left: G.startX + 'px', top: G.startY + 'px', display: 'block', width: '1px', height: '1px'});
  G.draggingOn = true;

  G.cornerTopDiv.style.top = (G.startY - G.mapHeight) + 'px';
  G.cornerTopDiv.style.display ='block';
  G.cornerLeftDiv.style.left = (G.startX - G.mapWidth) +'px';
  G.cornerLeftDiv.style.top = G.startY + 'px';
  G.cornerLeftDiv.style.display = 'block';

  G.cornerRightDiv.style.left = G.startX + 'px';
  G.cornerRightDiv.style.top = G.startY + 'px';
  G.cornerRightDiv.style.display = 'block';
  G.cornerBottomDiv.style.left = G.startX + 'px';
  G.cornerBottomDiv.style.top = G.startY + 'px';
  G.cornerBottomDiv.style.width = '0px';
  G.cornerBottomDiv.style.display = 'block';

  // invoke the callback if provided
  if (G.callbacks.dragstart != null) {
    G.callbacks.dragstart(G.startX, G.startY);
  }

  return false;
};

/**z
 * Function called when drag event is captured
 * @param {Object} e 
 */
DragZoomControl.prototype.drag_ = function(e){
  var G = this.globals;

  document.onselectstart = function() {
    return false;
  };

  if(G.draggingOn) {
    var pos = this.getRelPos_(e);
    rect = this.getRectangle_(G.startX, G.startY, pos, G.mapRatio);

    if (rect.left) {
      addX = -rect.width;			
    } else { 
      addX = 0;
    }

    if (rect.top) {
      addY = -rect.height;
    } else {
      addY = 0;
    }

    DragZoomUtil.style([G.outlineDiv], {left: G.startX + addX + 'px', top: G.startY + addY + 'px', display: 'block', width: '1px', height: '1px'});	
	
    G.outlineDiv.style.width = rect.width + "px";
    G.outlineDiv.style.height = rect.height + "px";

    G.cornerTopDiv.style.height = ((G.startY + addY) - (G.startY - G.mapHeight)) + 'px';
    G.cornerLeftDiv.style.top = (G.startY + addY) + 'px';
    G.cornerLeftDiv.style.width = ((G.startX + addX) - (G.startX - G.mapWidth)) + 'px';
    G.cornerRightDiv.style.top = G.cornerLeftDiv.style.top;
    G.cornerRightDiv.style.left = (G.startX + addX + rect.width + G.borderCorrection) + 'px';
    G.cornerBottomDiv.style.top = (G.startY + addY + rect.height + G.borderCorrection) + 'px';
    G.cornerBottomDiv.style.left = (G.startX - G.mapWidth + ((G.startX + addX) - (G.startX - G.mapWidth))) + 'px';
    G.cornerBottomDiv.style.width = (rect.width + G.borderCorrection) + 'px';
		
    // invoke callback if provided
    if (G.callbacks.dragging != null) {
      G.callbacks.dragging(G.startX, G.startY, rect.endX, rect.endY)
    }
		
    return false;
  }  
};

/** 
 * Function called when mouseup event is captured
 * @param {Event} e
 */
DragZoomControl.prototype.mouseup_ = function(e){
  var G = this.globals;
  if (G.draggingOn) {
    var pos = this.getRelPos_(e);
    G.draggingOn = false;
    
    var rect = this.getRectangle_(G.startX, G.startY, pos, G.mapRatio);

    if (rect.left) rect.endX = rect.startX - rect.width;
    if (rect.top) rect.endY = rect.startY - rect.height;
	
    this.resetDragZoom_();

    var nwpx = new GPoint(rect.startX, rect.startY);
    var nepx = new GPoint(rect.endX, rect.startY);
    var sepx = new GPoint(rect.endX, rect.endY);
    var swpx = new GPoint(rect.startX, rect.endY);
    var nw = G.map.fromContainerPixelToLatLng(nwpx); 
    var ne = G.map.fromContainerPixelToLatLng(nepx); 
    var se = G.map.fromContainerPixelToLatLng(sepx); 
    var sw = G.map.fromContainerPixelToLatLng(swpx); 

    var zoomAreaPoly = new GPolyline([nw, ne, se, sw, nw], G.style.outlineColor, G.style.outlineWidth + 1,.4);

    try{
      G.map.addOverlay(zoomAreaPoly);
      setTimeout (function() {G.map.removeOverlay(zoomAreaPoly)}, G.options.overlayRemoveTime);  
    }catch(e) {}

    polyBounds = zoomAreaPoly.getBounds();
    var ne = polyBounds.getNorthEast();
    var sw = polyBounds.getSouthWest();
    var se = new GLatLng(sw.lat(), ne.lng());
    var nw = new GLatLng(ne.lat(), sw.lng());
    zoomLevel = G.map.getBoundsZoomLevel(polyBounds);
    center = polyBounds.getCenter();
    G.map.setCenter(center, zoomLevel);

    // invoke callback if provided
    if (G.callbacks.dragend != null) {
      G.callbacks.dragend(nw, ne, se, sw, nwpx, nepx, sepx, swpx);
    }
		
    //re-init if sticky
    if (G.options.stickyZoomEnabled) {
      //GLog.write("stickyZoomEnabled, re-initting");
      this.initCover_();
      if (G.options.backButtonEnabled) this.saveBackContext_(G.options.backButtonHTML,false); // save the map context for back button
      G.backButtonDiv.style.display='none';
    }
  }
};

/**
 * Set the cover sizes according to the size of the map
 */
DragZoomControl.prototype.setDimensions_ = function() {
  var G = this.globals;
  var mapSize = G.map.getSize();
  G.mapWidth  = mapSize.width;
  G.mapHeight = mapSize.height;
  G.mapRatio  = G.mapHeight / G.mapWidth;
  DragZoomUtil.style([G.mapCover, G.cornerTopDiv, G.cornerRightDiv, G.cornerBottomDiv, G.cornerLeftDiv], 
    {width: G.mapWidth + 'px', height: G.mapHeight +'px'});
};

/**
 * Initializes styles based on global parameters
 */
DragZoomControl.prototype.initStyles_ = function(){
  var G = this.globals;
  DragZoomUtil.style([G.mapCover, G.cornerTopDiv, G.cornerRightDiv, G.cornerBottomDiv, G.cornerLeftDiv], 
    {filter: G.style.alphaIE, opacity: G.style.opacity, background:G.style.fillColor});
  G.outlineDiv.style.border = G.style.border;  
};

/**
 * Function called when the zoom button's click event is captured.
 */
DragZoomControl.prototype.buttonclick_ = function(){
	setView('draw_zoom');
  var G = this.globals;	
  G.backButtonDiv.style.display='none';
  if (G.mapCover.style.display == 'block') { // reset if clicked before dragging 
  	this.resetDragZoom_();
	//update_map();
    if (G.options.backButtonEnabled) {  
      this.restoreBackContext_();  // pop the backStack on a button reset
      if (G.backStack.length==0) G.backButtonDiv.style.display='none';
    }
  } else {
    this.initCover_();
    if ( G.options.backButtonEnabled ) this.saveBackContext_(G.options.backButtonHTML,false); // save the map context for back button
  }
};

/**
 * Back Button functionality:	
 * Function called when the back button's click event is captured.
 * calls the function to set the map context back to where it was before the zoom.
 */
DragZoomControl.prototype.backButtonclick_ = function(){
  var G = this.globals;	
  if (G.options.backButtonEnabled) {
    this.restoreBackContext_();
    // invoke the callback if provided
    if (G.callbacks['backbuttonclick'] != null) {
      G.callbacks.backbuttonclick(G.methodCall);
    }
  }
};

/** 
 * Back Button functionality:	
 * Saves the map context and pushes it on the backStack for later use by the back button
 */
DragZoomControl.prototype.saveBackContext_ = function(text,methodCall) {
  var G = this.globals;
  var backFrame = {};
  backFrame["center"] = G.map.getCenter();
  backFrame["zoom"] = G.map.getZoom();
  backFrame["maptype"] = G.map.getCurrentMapType();
  backFrame["text"] = G.backButtonDiv.innerHTML; // this saves the previous button text
  backFrame["methodCall"] = methodCall; //This determines if it was an internal or method call
  G.backStack.push(backFrame);
  G.backButtonDiv.innerHTML = text;
  // Back Button is turned on in resetDragZoom_()
};

/** 
 * Back Button functionality:	
 * Pops the previous map context off of the backStack and restores the map to that context
 */
DragZoomControl.prototype.restoreBackContext_ = function() {
  var G = this.globals;
  var backFrame = G.backStack.pop();
  G.map.setCenter(backFrame["center"],backFrame["zoom"],backFrame["maptype"]);
  G.backButtonDiv.innerHTML = backFrame["text"];
  G.methodCall = backFrame["methodCall"];
  if (G.backStack.length==0) G.backButtonDiv.style.display = 'none'; // if we're at the top of the stack, hide the back botton
};

/**
 * Shows the cover over the map
 */
DragZoomControl.prototype.initCover_ = function(){
  var G = this.globals;
  G.mapPosition = DragZoomUtil.getElementPosition(G.map.getContainer());
  this.setDimensions_();
  this.setButtonMode_('zooming');
  DragZoomUtil.style([G.mapCover], {display: 'block', background: G.style.fillColor});
  DragZoomUtil.style([G.outlineDiv], {width: '0px', height: '0px'});

  //invoke callback if provided
  if(G.callbacks['buttonclick'] != null){
    G.callbacks.buttonclick();
  }

};

/**
 * Gets position of the mouse relative to the map
 * @param {Object} e
 */
DragZoomControl.prototype.getRelPos_ = function(e) {
  var pos = DragZoomUtil.getMousePosition(e);
  var G = this.globals;
  return {top: (pos.top - G.mapPosition.top), 
          left: (pos.left - G.mapPosition.left)};
};

/**
 * Figures out the rectangle the user's trying to draw
 * @param {Number} startX 
 * @param {Number} startY
 * @param {Object} pos
 * @param {Number} ratio
 * @return {Object} Describes the rectangle
 */
DragZoomControl.prototype.getRectangle_ = function(startX, startY, pos, ratio){
  var left = false;
  var top = false;
  var dX = pos.left - startX;
  var dY = pos.top - startY;	
  if (dX < 0) {
    dX = dX * -1;
    left = true;
  }
  if (dY < 0) {
    dY = dY * -1;
    top = true;
  }
  delta = dX > dY ? dX : dY;

  return {
    startX: startX,
    startY: startY,
    endX: startX + delta,
    endY: startY + parseInt(delta * ratio),
    width: delta,
    height: parseInt(delta * ratio),
    left:left,
    top:top
  }
};

/** 
 * Resets CSS and button display when drag zoom done
 */
DragZoomControl.prototype.resetDragZoom_ = function() {
  var G = this.globals;
  DragZoomUtil.style([G.mapCover, G.cornerTopDiv, G.cornerRightDiv, G.cornerBottomDiv, G.cornerLeftDiv], 
    {display: 'none', opacity: G.style.opacity, filter: G.style.alphaIE});
  G.outlineDiv.style.display = 'none';	
  this.setButtonMode_('normal');
  if (G.options.backButtonEnabled  && (G.backStack.length > 0)) G.backButtonDiv.style.display = 'block'; // show the back button
};



/* utility functions in DragZoomUtil.namespace */
var DragZoomUtil={};

/**
 * Alias function for getting element by id
 * @param {String} sId
 * @return {Object} DOM object with sId id
 */
DragZoomUtil.gE = function(sId) {
  return document.getElementById(sId);
}

/**
 * A general-purpose function to get the absolute position
 * of the mouse.
 * @param {Object} e  Mouse event
 * @return {Object} Describes position
 */
DragZoomUtil.getMousePosition = function(e) {
  var posX = 0;
  var posY = 0;
  if (!e) var e = window.event;
  if (e.pageX || e.pageY) {
    posX = e.pageX;
    posY = e.pageY;
  } else if (e.clientX || e.clientY){
    posX = e.clientX + 
      (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
    posY = e.clientY + 
      (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
  }	
  return {left: posX, top: posY};  
};

/**
 * Gets position of element
 * @param {Object} element
 * @return {Object} Describes position
 */
DragZoomUtil.getElementPosition = function(element) {
  var leftPos = element.offsetLeft;          // initialize var to store calculations
  var topPos = element.offsetTop;            // initialize var to store calculations
  var parElement = element.offsetParent;     // identify first offset parent element  
  while (parElement != null ) {                // move up through element hierarchy
    leftPos += parElement.offsetLeft;      // appending left offset of each parent
    topPos += parElement.offsetTop;  
    parElement = parElement.offsetParent;  // until no more offset parents exist
  }
  return {left: leftPos, top: topPos};
};

/**
 * Applies styles to DOM objects 
 * @param {String/Object} elements Either comma-delimited list of ids 
 *   or an array of DOM objects
 * @param {Object} styles Hash of styles to be applied
 */
DragZoomUtil.style = function(elements, styles){
  if (typeof(elements) == 'string') {
    elements = DragZoomUtil.getManyElements(elements);
  }
  for (var i = 0; i < elements.length; i++){
    for (var s in styles) { 
      elements[i].style[s] = styles[s];
    }
  }
};

/**
 * Gets DOM elements array according to list of IDs
 * @param {String} elementsString Comma-delimited list of IDs
 * @return {Array} Array of DOM elements corresponding to s
 */
DragZoomUtil.getManyElements = function(idsString){		
  var idsArray = idsString.split(',');
  var elements = [];
  for (var i = 0; i < idsArray.length; i++){
    elements[elements.length] = DragZoomUtil.gE(idsArray[i])
  };
  return elements;
};

function TextualZoomControl() {
	}
	
	TextualZoomControl.prototype = new GControl();

// 	Creates a one DIV for each of the buttons and places them in a container
// 	DIV which is returned as our control element.
	TextualZoomControl.prototype.initialize = function(map) {
		var container = document.createElement("div");

// "Zoom In" button
		var zoomInDiv = document.createElement("div");
		this.setButtonStyle_(zoomInDiv);
		container.appendChild(zoomInDiv);
		zoomInDiv.appendChild(document.createTextNode("Zoom In"));
		// The "true" argument in the zoomIn() method allows continuous zooming
		GEvent.addDomListener(zoomInDiv, "click", function() {map.zoomIn(null,null,true);} );

// "Zoom Out" button
		var zoomOutDiv = document.createElement("div");
		this.setButtonStyle_(zoomOutDiv);
		zoomOutDiv.style.borderTop = 0+'px';
		container.appendChild(zoomOutDiv);
		zoomOutDiv.appendChild(document.createTextNode("Zoom Out"));
		// The "true" argument in the zoomOut() method allows continuous zooming
		GEvent.addDomListener(zoomOutDiv, "click", function() {map.zoomOut(null,true);} );

// 		We add the control to to the map container and return the element 
// 		for the map class to position properly.

		map.getContainer().appendChild(container);
		return container;
	}


// 	The control will appear in the top left corner of the map with 7 pixels of padding.
	TextualZoomControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(15, 7));
	}

// Sets the proper CSS for the given button element.
	TextualZoomControl.prototype.setButtonStyle_ = function(button) {
		button.style.textDecoration = "none";
		button.style.color = "black";
		button.style.backgroundColor = "white";
//		button.style.font = "12px Verdana bold";
		button.style.fontFamily = "Verdana";
		button.style.fontSize = "10px";
		button.style.fontWeight= "normal";
		button.style.border = "1px solid gray";
		button.style.padding = "3px";
		button.style.paddingBottom = "3px";
		button.style.marginBottom = "0px";
		button.style.textAlign = "center";
		button.style.width = "80px";
		button.style.lineHeight = "12px";
		button.style.cursor = "pointer";
	}