var try_catch_return = '';

function get_request_object()
{
  try
  {
    if(window.ActiveXObject){
      httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
      httpRequest = new XMLHttpRequest();
    }
    return httpRequest;
  }
  catch(err)
  {
    var txt="get_request_object Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function get_streets_for_city(city,street)
{
  try
  {
    httpRequest = get_request_object();
    var url = "/resources/ajax.php?action=get_streets&city=" + city + "&street=" + street;
    httpRequest.open("GET", url, true);
    httpRequest.onreadystatechange = function () {fill_streets_dropdown_list(); } ;
    httpRequest.send(null);  
  }
  catch(err)
  {
    var txt="Error description get_streets_for_city: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function fill_streets_dropdown_list()
{
  try
  {
    if(httpRequest.readyState == 4)
    {
      if (httpRequest.status == 200)
      {
        
        var streets = JSON.parse(httpRequest.responseText);
        var select = document.getElementById('street_select');
        select.length = 0;
        
        for(var i=0;i < streets.length;i++)
        {
          var new_option = document.createElement('option');
          new_option.text = streets[i]['street'];
          new_option.value = streets[i]['street'];
  
          try {
            select.add(new_option, null); // standards compliant; doesn't work in IE
          }
          catch(ex) {
            select.add(new_option); // IE only
          }
        }
        
      }
    }
  }
  catch(err)
  {
    var txt="Error description refresh_bookmarks: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function reload_bookmarks(current_bookmark_id,section)
{
  try
  {    
    //we push a item into the field every time this method is called    
    BOOKMARKS_RELOAD_CALLS_POOL.push("reload_bookmarks");    
    sleep(1);
    
    if(BOOKMARKS_RELOAD_CALLS_POOL.length > 0)
    {
      BOOKMARKS_RELOAD_CALLS_POOL = [];
      httpRequest = get_request_object();

      if(current_bookmark_id != null && current_bookmark_id != '')      
        current_bookmark_id = '&property_id=' + current_bookmark_id;
      if(section != '')        
        section = '&section=' + section;      
      
      var url = "/resources/ajax.php?action=reload_bookmarks" + current_bookmark_id + section;
      httpRequest.open("GET", url, true);      
      httpRequest.onreadystatechange = function () { refresh_bookmarks(); };
      httpRequest.send(null);  
    }    
  }
  catch(err)
  {
    var txt="Error description reload_bookmarks: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function refresh_bookmarks()
{
  try
  {
    if(httpRequest.readyState == 4)
    {
      if (httpRequest.status == 200)
      {
        var wrapper = document.getElementById('bookmark_wrapper');
        
        while (wrapper.hasChildNodes())
          wrapper.removeChild(wrapper.firstChild);

        var newdiv = document.createElement('div');
        newdiv.innerHTML = httpRequest.responseText;
        wrapper.appendChild(newdiv);                
        
        bindMouseEvents();
      }
    }
  }
  catch(err)
  {
    var txt="Error description refresh_bookmarks: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }

}



function save_window_resize(width,height)
{
  try
  {
    httpRequest = get_request_object();
    var url = "/resources/ajax.php?action=save_window_resize&width=" + width + "&height=" +height;
    httpRequest.open("GET", url, true);
    httpRequest.onreadystatechange = function () {} ;
    httpRequest.send(null);  
  }
  catch(err)
  {
    var txt="Error description save_resize: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function sleep(naptime){
  try
  {
    naptime = naptime * 1000;
    var sleeping = true;
    var now = new Date();
    var alarm;
    var startingMSeconds = now.getTime();
    while(sleeping){
       alarm = new Date();
       alarmMSeconds = alarm.getTime();
       if(alarmMSeconds - startingMSeconds > naptime)
        { sleeping = false; }
    }
  }
  catch(err)
  {
    var txt="Error description sleep: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }        
}


function lookup_address(address, put_marker, section, my_map, my_markers, asynchrone, callback)
{
  if(section == null) section = 'map';
  if(my_map == null) my_map = map; //map is global variable, sometimes its needed override
  if(my_markers == null && section == 'map') my_markers = markers; //markers is global variable, sometimes its needed override
  if(section == 'list') $('#ajax_loader').show();
  /*var lng_diff = square_coords[0]['lng'] - square_coords[2]['lng'];
  var lat_diff = square_coords[0]['lat'] - square_coords[2]['lat'];
  if(lng_diff < 0) lng_diff *= -1;
  if(lat_diff < 0) lat_diff *= -1;*/  
  
  // return latlng of address from google
  	var geocoder = new google.maps.Geocoder();
	var lat = 0;
	var lng = 0;
	geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
	  	lat = results[0].geometry.location.lat();
	  	lng = results[0].geometry.location.lng();
		try
		  {
		  if (put_marker==null)
		    put_marker=true;
		  if(typeof(asynchrone) == "undefined"){
		      asynchrone = true;
		  }
		  var ResultData = -1;  
		  var url = "/resources/ajax.php";
		  $.ajax(
		  { url: url,
		    dataType: 'json',
		    data: 
		    {   
			  lat: lat,
			  lon: lng,
		      action: 'lookup_address',
		      address: address
		    },                
		    async: asynchrone,
		    success: function(data) 
		    {
		        if(section == 'map')
		          refresh_map(my_markers, my_map,put_marker,data);
		        else if(section == 'list') {
		          if(data.lat == "0" && data.lon == "0"){
		            $(".message_location_cannot_found").show();
		          }  
		          else
		          {
		            $("#location_was_find input[name='search_address']").val(address); 
		            $("#location_was_find input[name='lat']").val(lat);
					$("#location_was_find input[name='lng']").val(lng);
					$("#location_was_find").submit(); //if location_was_find form exists, it makes reload site, else it makes set_minimap_square()
		             
		            set_minimap_square(data);

		            //this is here because we want to update position on minimap even after when user chooses type of property
		            //switching list to other property type is done through links, not as form, so we need to modify links
		            $('.mod40_property_types a').each(function(){
		            	var href = $(this).attr('href');
		            	var questMarkPos = href.indexOf('?');
		            	if(questMarkPos>0)
		            		href = href.substring(0, questMarkPos);
		            	$(this).attr('href', href+'?search_address='+address+'&lat='+lat+'&lng='+lng);
		            });
		            
		            var string = $("h1.h1_style").html().split(" - ",2);            
		            string = string.length > 1 ? string[0] + " - " : ""; //difference betwen wizard page (without property type) and list page (property type - location)
		            $("h1.h1_style").html( string + data.locality_string );                          
		          }
		          $('#ajax_loader').hide();
		        }
		        ResultData = data;
				if (typeof(callback) != "undefined"){
					callback(ResultData);
				}
		    },
		    error: function(data) {
		      if(section == 'list') $('#ajax_loader').hide();
		    },
		    type: 'GET'
		    });
		  }                        
		  catch(err)
		  {
		    if(section == 'list') $('#ajax_loader').hide();
		    var txt="Error description lookup_address: " + err.description + "\n\n";
		    txt+="Click OK to continue.\n\n";
		    debug(txt);
		  }                  
		  return ResultData;   

        } else {
			$(".message_location_cannot_found").show();
			if(section == 'list') $('#ajax_loader').hide();
		}}
	);
          
}
function refresh_map(markers, map,put_marker,in_coors)
{
  try
  {
    if (put_marker==null)
      put_marker=true;
        
    if(in_coors.lat == "0" && in_coors.lon == "0") 
    {
      $(".message_location_cannot_found").show();
      return 0;
    }
    else  
    {
      $(".message_location_cannot_found").hide();
      $('#accordion').accordion('activate', 1);
    }
    
    map.setCenter(new google.maps.LatLng(in_coors.lat, in_coors.lon));
    map.setZoom(15);
    /*put marker if requested*/
    if (put_marker)
    {               
      var point = new google.maps.LatLng(in_coors.lat, in_coors.lon);
      var anIcon = new google.maps.MarkerImage(ICON_URL,new google.maps.Size(31, 36),new google.maps.Point(0,0),new google.maps.Point(0, 36));
      var marker = new google.maps.Marker({'position': point, 'draggable': true, 'icon': anIcon, 'raiseOnDrag': false});
      marker.setMap(map);
      while(markers[0]) //NOTE: this while is used in exinfowindow.js, but in add property (section 541) isn't included that javascript
        markers.pop().setMap(null);
      markers.push(marker);
    }

    /*update location fields if available*/
    var area1 = window.document.getElementById("coord_lon");
    var area2 = window.document.getElementById("coord_lat");
    
	if (area1!=undefined)
    {
      area1.value = in_coors.lon;
      area2.value = in_coors.lat;

      google.maps.event.addListener(marker, "dragend", function() {
        area1.value = marker.getPosition().lng();
        area2.value = marker.getPosition().lat();
      });
    }
    
  }
  catch(err)
  {
    var txt="Refresh map,Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function set_minimap_square(in_coords)
{
  try
  {       
    $(".message_location_cannot_found").hide();      
    if(square_selected_path != null && square_coords != null) 
    {
      var path = [          
        new google.maps.LatLng(parseFloat(in_coords.lat) + parseFloat(in_coords.lat_diff)/2, parseFloat(in_coords.lon) + parseFloat(in_coords.lng_diff)/2),
        new google.maps.LatLng(parseFloat(in_coords.lat) - parseFloat(in_coords.lat_diff)/2, parseFloat(in_coords.lon) + parseFloat(in_coords.lng_diff)/2),
        new google.maps.LatLng(parseFloat(in_coords.lat) - parseFloat(in_coords.lat_diff)/2, parseFloat(in_coords.lon) - parseFloat(in_coords.lng_diff)/2),
        new google.maps.LatLng(parseFloat(in_coords.lat) + parseFloat(in_coords.lat_diff)/2, parseFloat(in_coords.lon) - parseFloat(in_coords.lng_diff)/2),
        new google.maps.LatLng(parseFloat(in_coords.lat) + parseFloat(in_coords.lat_diff)/2, parseFloat(in_coords.lon) + parseFloat(in_coords.lng_diff)/2)
      ];

      square_selected_path.setPath(path);           
      
      var zoom_diff = in_coords.zoom > 11 ? in_coords.zoom - 10 : 0;
      map.setZoom(6 + zoom_diff);
      map.panTo(new google.maps.LatLng(parseFloat(in_coords.lat),parseFloat(in_coords.lon)) );          
    }    
  }
  catch(err)
  {
    var txt="Refresh list,Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function save_marker_state(id, htmlContent, action)
{
  try
  {
    var JSONObject = new Object;
    
    if(action == 'open')
    {
      JSONObject.state = 'opened';
      JSONObject.id = id;
      JSONObject.content = htmlContent;
      
    }
    else if(action == 'close')
    {
      JSONObject.state = 'closed';
      JSONObject.id = id;
    }
    
    JSONstring = JSON.stringify(JSONObject);
    
    var url = '/resources/ajax.php?action=save_marker_state&json='+JSONstring;
     
    httpRequest.open('GET', url, true);
    httpRequest.onreadystatechange = function () { change(); } ;
    httpRequest.send(null);
  }
  catch(err)
  {
    var txt="save marker state Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function remove_outside_markers(ne_lat,ne_lng,sw_lat,sw_lng)
{
  try
  {
    var display_area_width = Math.abs(sw_lng-ne_lng);
    var display_area_height = Math.abs(sw_lat-ne_lat);
        
    var desired_loading_area_sw_lat = sw_lat - display_area_height * MARKER_LOAD_AREA_EXTENSION;
    var desired_loading_area_sw_lng = sw_lng - display_area_width * MARKER_LOAD_AREA_EXTENSION;
    var desired_loading_area_ne_lat = ne_lat + display_area_height * MARKER_LOAD_AREA_EXTENSION;
    var desired_loading_area_ne_lng = ne_lng + display_area_width * MARKER_LOAD_AREA_EXTENSION;
    
    not_deleted_markers = Array();
    while(!(CURRENT_MARKERS.length < 1))
    {
      cur_marker = CURRENT_MARKERS.pop();
      
      cur_lat = cur_marker.getPosition().lat();
      cur_lng = cur_marker.getPosition().lng();  
      
      if((cur_lng < desired_loading_area_sw_lng || cur_lng > desired_loading_area_ne_lng) || 
         (cur_lat < desired_loading_area_sw_lat || cur_lat > desired_loading_area_ne_lat))
         {
           map.clearMyOverlay(cur_marker);
         }
      else
      { 
        not_deleted_markers.push(cur_marker); 
      }
    }
    CURRENT_MARKERS = not_deleted_markers;
  }
  catch(err)
  {
    var txt="remove markers,Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
    
  }
  
}

function send_map_stats(prop_id)
{
  var url = "/resources/ajax.php";
  $.ajax(
      { url: url,
        dataType: 'json',
        data: 
        {   
          prop_id: prop_id,
          action: 'map_prop_show'
        },                
        success: function(data) 
        {
           //do nothing as this is backround job
        },
        error: function(data) {
          //do also nothing as this is backround job
        },
        type: 'GET'
        });
            
}


function debug(mssg)
{
  try
  {
    if(window.DEBUG_MODE && DEBUG_MODE == true)
    {
      new_w = window.open("","Debuging window");
        
      new_w.document.write(mssg+"<br />");
    }
  }
  catch(err)
  {
    var txt="debug - Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
    
  }
}

function save_map_state(prop_show_id)
{
  
  try
  {
    var curent_bounds = map.getBounds();
      
    view_change = "drag";
    var httpRequest = get_request_object();
    //we dont do zoom event anymore so we just clear the overlays when the zoom is changed
    debug("save_map_state: get_request_object");
    
    //we dont do drag when on low zoom level
    //if we are in a low zoom level, we can see largeer part of the map
    if(map.getZoom() < DEFAULT_ZOOM_LEVEL && PREW_ZOOM_LVL < DEFAULT_ZOOM_LEVEL && view_change == "drag")
      //if we are zooming in do nothing
      //if(PREW_ZOOM_LVL < map.getZoom())
      {
        debug("-------------------------------------");
        save_map_state();
        return;
      }
    
    if(PREW_ZOOM_LVL != map.getZoom())
    {
      if(curInfoBox != null) {
        curInfoBox.close();
      }
      debug("clearing all overlays");        
      map.clearMyOverlays();      
    }
    
    debug("save_map_state: creating JSON");

    
    var JSONObject = new Object;
    
    if(prop_show_id != null)
      JSONObject.show_prop = prop_show_id;
    
    JSONObject.zoom = map.getZoom();
    debug("save_map_state: map.getZoom()");
    
    JSONObject.prew_zoom = PREW_ZOOM_LVL;
    
    PREW_ZOOM_LVL = JSONObject.zoom;
    
    JSONObject.view_change = view_change;
    
    JSONObject.center = new Object;
    JSONObject.center.lat = map.getCenter().lat() ;
    JSONObject.center.lng = map.getCenter().lng() ;
    
    debug("save_map_state: got lat and long");
    
    var ne_lat = curent_bounds.getNorthEast().lat();
    var ne_lng = curent_bounds.getNorthEast().lng();
    var sw_lat = curent_bounds.getSouthWest().lat();
    var sw_lng = curent_bounds.getSouthWest().lng();
    
    JSONObject.north_east_corner = new Object;
    JSONObject.north_east_corner.lat = ne_lat;
    JSONObject.north_east_corner.lng = ne_lng;
    
    JSONObject.south_west_corner = new Object;
    JSONObject.south_west_corner.lat = sw_lat;
    JSONObject.south_west_corner.lng = sw_lng;
    
    debug("save_map_state: JSON.stringify");
    
    JSONstring = JSON.stringify(JSONObject);
  
    debug("starting request to server");
    /*
    var url = '/resources/ajax.php?action=save_map_state&json='+JSONstring;
    httpRequest.open('GET', url, true);
    httpRequest.onreadystatechange = function () { on_marker_array_recieve(ne_lat,ne_lng,sw_lat,sw_lng,prop_show_id); } ;
    httpRequest.send(null);  
    */
    
    $.ajax({
        url: '/resources/ajax.php',
        data: {
    	  action: 'save_map_state',
    	  jsonData: JSONObject
    	},
        dataType: 'JSON',
        success: function(data) {
	        remove_outside_markers(ne_lat,ne_lng,sw_lat,sw_lng);
	        
	        var markers = JSON.parse(data);
	        if(markers == "reload_page")
	          window.location.reload( true );
	        else if(markers == "cookie_disabled")
	          return;
	        var i;
	        for(i=0;i<markers.length;i++)
	        {
	          markers[i]['html'] = stripslashes(markers[i]['html']);
	          var point = new google.maps.LatLng(markers[i]['lat'],markers[i]['lon']);
              if(markers[i].top != undefined)
                var image = markers[i].top;
              else
                var image = 0;
           	var marker = createMarker(point,markers[i]['title'],markers[i]['html'], image, "", markers[i]['url'], markers[i]['first_prop_id'], markers[i]['property_type']);
	          google.maps.event.addListener(marker, "click", function(){ save_marker_state(0,'',"open"); });
	          google.maps.event.addListener(marker, "infowindowclose", function(){ save_marker_state(0,"","close"); });
	          marker.setMap(map);          
	          CURRENT_MARKERS.push(marker);
	          var j;
	          for(j=0; j < markers[i]['ids'].length; j++)
	          {
	            if(prop_show_id != null && prop_show_id == markers[i]['ids'][j]) //last_property_id is global var - in this case is defined in property_edit.js
	            {
	              $(marker).mouseover(); //open infowindow
	              last_property_id = 0;
	            }
	          }
	        }
    		//closing overlay window if its popped
	    	if(document.getElementById("ajax_loader"))
	            document.getElementById("ajax_loader").style.display='none';
	    	//alert('success');
	    	return;
	    },
        error: function(xmlRequest, status, error) {
	    	//closing overlay window if its popped
	    	if(document.getElementById("ajax_loader"))
	            document.getElementById("ajax_loader").style.display='none';
      		//alert('error');
      		return;
        }
    });	
    
    if(document.getElementById("ajax_loader"))
        document.getElementById("ajax_loader").style.display='block'; 
   //save_map_state();
  }
  
  catch(err)
  {
  
  debug("save_map_state exception:"+print_r(err));
    var txt="save map state,Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
    
}
function stripslashes(str) {
  try
  {
    if(str == null)
    {
      debug("toto je nula"+str);
      return "";
    }
    var pattern1 = /\\'/g;
    var pattern2 = /\\"/g;
    var pattern3 = /\\0/g;
    var pattern4 = /\\\\/g;
  
    str=str.replace(pattern1,'\'');
    str=str.replace(pattern2,'"');
    str=str.replace(pattern3,'\0');
    str=str.replace(pattern4,'\\');
    
    return str;
  }
  catch(err)
  {
    var txt="stripslashes - Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    debug(txt);
  }
}

function change() {

}


function print_r(theObj,indent){
  var output='';
  if (indent == undefined) { indent = '?    '; } else { indent += '?    '; }
  if(theObj.constructor == Array || theObj.constructor == Object) {
  for(var p in theObj){
             if(theObj[p].constructor == Array|| theObj[p].constructor == Object){
               var type = (theObj[p].constructor == Array) ? "Array" : "Object";
               output += indent+'['+p+']('+type+")=>\n";
               output += print_r(theObj[p],indent);
             } else { output += indent+'['+p+']:'+theObj[p]+"\n"; }
          }
       }
       return output;
     }



