/*
var COLORS = [["red", "#ff0000"], ["orange", "#ff8800"], ["green","#008000"],
              ["blue", "#000080"], ["purple", "#800080"]];
*/

var COLORS = [["red", "#ff0000"]];
			  
var options = {};
var colorIndex_ = 0;

var map;

var markers = {};
markers_array = [];
var markers_base_ids = {}; // ids маркеров в базе
var markers_titles = {};   
var markers_texts = {};
var markers_pos = {};
var markerCounter_ = 0;

var lastX;
var lastY;
var lastZoom;

var markerClusterer;

var loading_markers = false;
var marker_request = 0;

function getColor(named) {
	return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
}

function getIcon(color) {
	var icon = new GIcon();
	icon.image = clusterer_image_dir_path +".png";
//	icon.shadow = ""; // тень

	icon.iconSize = new GSize(35, 30);
//	  icon.shadowSize = new GSize(0, 0); // размеры тени
	icon.iconAnchor = new GPoint(18, 30);
//	icon.infoWindowAnchor = new GPoint(5, 1); // точка привязки инфоокна 
	return icon;
}

function markers_load(){
	
	var bounds = map.getBounds();
	
	if (loading_markers) {
		marker_request = 1;
		return;
	}
	
	var center = map.getCenter();
	lastX = center.lng();
	lastY = center.lat();
	lastZoom = map.getZoom();
	
	marker_request = 0;
	loading_markers = true;
//	$("#message").html("loading markers...");
	
	// Use pre-loaded array
	if (typeof init_map_data == "object") {
	
		markers_insert(init_map_data);
		return true;
	}

	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	
	var lat1 = southWest.lat();
	var lat2 = northEast.lat();
	var lng1 = southWest.lng();
	var lng2 = northEast.lng();
	
	$.post(
		load_marker_action, 
		{ "lat1": lat1, "lat2": lat2, "lng1": lng1, "lng2": lng2 },
		function (data) {
			$("#message").html("");
			
			if(data === ""){
				loading_markers = false;
				return;
			}
			
			data = eval("("+data+")");
			if (data !== null) {
//				markers_insert(data);
			}
			
			loading_markers = false;
			
			if (marker_request !== 0){
				markers_load();
			}
		}
	);
}

function markers_insert (data) {
	var count_markers = 0;

	markers_clean_all();
	map.clearOverlays();
	
	var west = "null";
	var east = "null";
	var north = "null";
	var south = "null";
	
	$.each(data, function(key, val){
		if (!in_array(val["id"], markers_base_ids)) {
			var latlng = new GLatLng(val["x"], val["y"]);
			var marker = marker_add(latlng);
			
			markers_titles[marker["name"]] = val["title"];
			markers_base_ids[marker["name"]] = val["id"];
			
			
			if((east == "null") || (val["y"] > east)){
				east = parseFloat(val["y"]);
			}
			if((west == "null") || (val["y"] < west)){
				west = parseFloat(val["y"]);
			}
			if((north == "null") || (val["x"] < north)){
				north = parseFloat(val["x"]);
			}
			if((south == "null") || (val["x"] > south)){
				south = parseFloat(val["x"]);
			}
			
									
			var sw = new GLatLng(south,west);
			var ne = new GLatLng(north,east);
			var bounds = new GLatLngBounds(sw, ne);
			var centerpoint = new GLatLng((north + south)/2, (east + west)/2);
			var zoomlevel = map.getBoundsZoomLevel(bounds);
			
			if(zoomlevel > max_map_zoom){
				zoomlevel = max_map_zoom;
			}
			
			map.setCenter(centerpoint, zoomlevel);

		}
		count_markers++;
	});
	
	if (markerClusterer != null) {
		markerClusterer.clearMarkers();
	}
	
//	$("#message").html("loaded - "+count_markers);
	var styles = [
	{
		url: clusterer_image_dir_path + "_group.png",
        opt_textColor: '#ffffff',
        width: 50,
        height:45 
    },
	{
		url: clusterer_image_dir_path + "_group.png",
        opt_textColor: '#ffffff',
        width: 50,
        height:45 
    },
	{
		url: clusterer_image_dir_path + "_group.png",
        opt_textColor: '#ffffff',
        width: 50,
        height:45 
    }
	];
	
	markerClusterer = new MarkerClusterer(map, markers_array,  { gridSize: 40, styles: styles });
}

function markers_clean_all (){

	if(markers !== null){
		$.each(markers, function(key, marker){
			marker.hide();
		});
	}

	markers = {};
	markers_base_ids = {};
	markers_titles = {};
	markers_texts = {};
	markers_pos = {};
	markers_array = [];
}





function marker_add (latlng){

      var color = getColor(true);
      var marker = new GMarker(latlng, {icon: getIcon(color), draggable: false});
	  
      //map.addOverlay(marker);
	  
	  marker["name"] = markerCounter_;
	  ++markerCounter_;
	  
	  markers[marker["name"]] = marker;
	  markers_array.push(marker);
	  
	  
	  markers_pos[marker["name"]] = latlng.toUrlValue();
	  
      GEvent.addListener(marker, "click", function() {
		marker_view(marker);
      });
	  
      GEvent.addListener(marker, "mouseover", function() {
		//marker_display_title(marker);
      });
	  
      GEvent.addListener(marker, "mouseout", function() {
		marker_display_none_title(marker);
      });
	  
	  return marker;
	  
	  
}


function marker_display_title (marker){
	//map.panTo(marker.getPoint());
	
    var markerOffset = map.fromLatLngToDivPixel(marker.getPoint());
	var x = markerOffset.x + 15;
	var y = markerOffset.y - 20;
	
//    $("#marker_title_popup").html(base64_decode(markers_titles[marker["name"]])).show().css({ top:y, left: x});
}

function marker_display_none_title (marker){
    var markerOffset = map.fromLatLngToDivPixel(marker.getPoint());
//    $("#marker_title_popup").hide();
}

/* rise window with ad content */
function init_ad_window() {
try {

	var _filter_buttons = {}
	_filter_buttons[t_cancel]	= function() {
		$(this).dialog('close');
	};
	$("#ad_window").dialog({
		bgiframe: true,
		autoOpen: false,
		width: 700,
		height: 450,
		modal: true,
		buttons: _filter_buttons,
		close: function() {
			$(this).dialog('destroy');
		}
	});
} catch (e) {}
}



function marker_view(marker){
	var title = markers_titles[marker["name"]];
	var text = markers_texts[marker["name"]];
	var id_in_base = markers_base_ids[marker["name"]];
	var ad_info = "";
	
	

	if((id_in_base !== undefined) && (text == undefined))  {
		ad_info = marker_load_text(id_in_base);
		text = ad_info["text"];
		markers_texts[marker["name"]] = text;
	}

	if(title !== undefined){
		title = base64_decode(title);
	}
	
	$("#ad_window").html(text);
	$("#ad_window").attr("title", title);
	init_ad_window();
	$("#ad_window").dialog('open');
}

function marker_load_text(id_in_base){
	$.ajaxSetup({
		async: false
	}); 

	$("#message").html("load text...");
	var ad_content = "";

	var params = {"id": id_in_base};
	if (typeof query_encoded != "undefined") {
		params["search_what"] = query_encoded;
	}
	$.post(marker_load_text_action, params, function (data){
		$("#message").html("");
			
		if (data !== undefined) {
			ad_content = eval("(" + data + ")");
			ad_content["text"] = base64_decode(ad_content["text"]);
		}
	});
	return ad_content;			
}

function initialize() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
	map.enableScrollWheelZoom();

	if(map_data_center !== ""){
		map_data_zoom = parseInt(map_data_zoom);
		map.setCenter(eval(map_data_center), map_data_zoom);
	}else{
//		map.setCenter(new GLatLng(47.840814, 35.079346), 13); //default center
	}
	
	GEvent.addListener(map, "moveend", function() {
		if(markers_enable === "1"){
			if(is_allow_load(map)){
//				markers_load();
			}
		}
	});

	
	function is_allow_load(map){
		var cur_zoom = map.getZoom();
	
		var center = map.getCenter();
		var diffX = (center.lng() - lastX);
		var diffY = (center.lat() - lastY);

		if (diffX < 0) diffX = diffX * (-1);
		if (diffY < 0) diffY = diffY * (-1); 

		var bounds = map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var referenciaX = (northEast.lng() - southWest.lng()) / 4 ;
		var referenciaY = (northEast.lat() - southWest.lat()) / 4 ;

		if(referenciaX < 0) referenciaX = referenciaX * (-1) ;
		if(referenciaY < 0) referenciaY = referenciaY * (-1) ; 

		if(cur_zoom >= map_data_zoom && (diffX > referenciaX) || (diffY > referenciaY) || (lastZoom !== cur_zoom)){
			return true;
		}else{
			return false;
		}
	}
/*	
	GEvent.addListener(map,"click", function(overlay,latlng) {     
		if (latlng) {   
		var myHtml = "The GLatLng value is: " + latlng + " at zoom level " + map.getZoom();
		map.openInfoWindow(latlng, myHtml);
		}
    });
*/
	
//	$("#marker_title_popup").appendTo(map.getPane(G_MAP_FLOAT_SHADOW_PANE));
	
	if(markers_enable === "1"){
		markers_load();
	}
	
   map.addControl(new GLargeMapControl());
   map.addControl(new GMapTypeControl());

	map.setMapType(G_NORMAL_MAP);
//    map.clearOverlays();
    featureTable_ = document.getElementById("featuretbody");
  }
}


$(function(){
	initialize();
});


/* OTHER FUNCTIONS */
function in_array(what, where) {
	var result = false;

	if(where !== null){
		$.each(where, function(key, val){
			if(val === what){
				result = true;
	            return;
			}
		});
	}
	
	return result;
}

function base64_decode( data ) {
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, dec = "", tmp_arr = [];
 
    data += '';
 
    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = utf8_decode(dec);
 
    return dec;
}


function utf8_decode ( str_data ) {
    var tmp_arr = [], i = ac = c1 = c2 = c3 = 0;
 
    str_data += '';
 
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
}


