/**
 * G-Map
 *
 * @author      Michael Senkler, Torben Brodt
 * @license	CC Attribution-NonCommercial-ShareAlike 3.0 Unported <http://creativecommons.org/licenses/by-nc-sa/3.0/>
 */

var gmap_pins;
var gmap_total;
var dom_controls = null;
var gmap_groups = 125;
var ajax_hidegroup = new Array();

var gmap_tinyIcon = new GIcon();
gmap_tinyIcon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
gmap_tinyIcon.iconSize = new GSize(12, 20);
gmap_tinyIcon.iconAnchor = new GPoint(6, 20);
gmap_tinyIcon.infoWindowAnchor = new GPoint(5, 1);

var gmap_baseIcon1 = new GIcon();
gmap_baseIcon1.iconSize = new GSize(20, 34);
gmap_baseIcon1.iconAnchor = new GPoint(9, 34);
gmap_baseIcon1.infoWindowAnchor = new GPoint(9, 2);

var gmap_baseIcon10 = new GIcon();
gmap_baseIcon10.iconSize = new GSize(31, 34);
gmap_baseIcon10.iconAnchor = new GPoint(9, 34);
gmap_baseIcon10.infoWindowAnchor = new GPoint(9, 2);

var gmap_baseIcon100 = new GIcon();
gmap_baseIcon100.iconSize = new GSize(41, 34);
gmap_baseIcon100.iconAnchor = new GPoint(9, 34);
gmap_baseIcon100.infoWindowAnchor = new GPoint(9, 2);

var gmap_baseIcon1000 = new GIcon();
gmap_baseIcon1000.iconSize = new GSize(50, 34);
gmap_baseIcon1000.iconAnchor = new GPoint(9, 34);
gmap_baseIcon1000.infoWindowAnchor = new GPoint(9, 2);

/**
 * show/hides the black wall
 * @param trueFalse -> set true to display, false to hide
 */
function gBlack(trueFalse) {
	var dom_loading = document.getElementById('gmap_loading');
	dom_loading.style.display = trueFalse ? "block" : "none";
}

/**
 * displays a message box (unremovable)
 * @param type -> dialog type (WARNING/ERROR)
 * @param message -> html mesage
 */
function gDialog(type, message) {
	gLoading(false);
	gBlack(true);

	var icon = gmap_wcf+"icon/g-map/";
	switch(type) {
		case 'ERROR':
			icon += "dialog-error.png";
		break;
		case 'WARNING':
			icon += "dialog-warning.png";
		break;
	}

	var text = document.createTextNode(" "+message);

	var img = document.createElement('img');
	img.setAttribute('src', icon);
	img.setAttribute('alt', '');

	var div = document.createElement('div');
	div.setAttribute('width', '150px');
	div.appendChild(img);
	div.appendChild(text);

	var gmap_loading_message = document.getElementById('gmap_loading_message');
	gmap_loading_message.style.display = "block";
	gmap_loading_message.appendChild(div);
}

/**
 * shows/hides loading screen
 * @param trueFalse -> set true to display, false to hide
 */
function gLoading(trueFalse) {
	gBlack(trueFalse);
	var dom_loading_img = document.getElementById('gmap_loading_img');
	dom_loading_img.style.display = trueFalse ? "block" : "none";
}

/**
 * toggles filter
 * @param id -> 
 * @param trueFalse -> 
 */
function gFilter(id, trueFalse) {
	if(trueFalse == false) {
		ajax_hidegroup.push(id);;
	} else {
		var c = new Array();
		for(var i=0; i<ajax_hidegroup.length; i++) {
			if(ajax_hidegroup[i] != id) {
				c.push(ajax_hidegroup[i]);
			}
		}
		ajax_hidegroup = c;
	}
	gMap();
}


/**
 * adds a new group to the controls bar
 * @param id -> 
 * @param title ->
 */
function gAddGroup(id, title) {
	if(dom_controls == null)
		dom_controls = document.getElementById('gmap_controls');
		
	var text = document.createTextNode(title);
	
	var input = document.createElement('input');
	input.setAttribute('type', 'checkbox');
	input.setAttribute('checked', 'checked');
	input.setAttribute('onclick', 'gFilter('+id+', this.checked)');
	
	var div = document.createElement('div');
	div.style.top = gmap_groups+'px';
	
	div.appendChild(input);
	div.appendChild(text);
	
	dom_controls.appendChild(div);
	gmap_groups += 25;
}

/**
 * returns markers in different sizes
 *
 * @param point -> position longitude/latitude
 * @param headline -> bold printed headline
 * @param userstring -> content string
 * @param count -> usercount
 */
function gMarker(point, headline, userstring, count) {
	var baseIcon;

	if(count <= 1) {
		baseIcon = gmap_tinyIcon;
	} 
	else if(count > 999) {
		baseIcon = gmap_baseIcon1000;
	} 
	else if(count > 99) {
		baseIcon = gmap_baseIcon100;
	} 
	else if(count > 9) {
		baseIcon = gmap_baseIcon10;
	} 
	else {
		baseIcon = gmap_baseIcon1;
	}

	// Create a lettered icon for this point using our icon class
	var icon = new GIcon(baseIcon);
	icon.image = gmap_wbb + 'index.php?page=MapMarker&d='+ count;
	var marker = new GMarker(point, icon);

	GEvent.addListener(marker, "click", function() {
			var s = '<div class="gmap_b" onclick="map.zoomIn();"><div class="gmap_h">'+headline+':</div>'+userstring+'</div></div>';
			marker.openInfoWindowHtml(s);
			});
	return marker;
}

/**
 * loads userdata from ajax and creates markers
 * @param type -> grouping parameter (e.g. posts, users)
 */
function gMap(type) {
	gLoading(true); // show loading message
        gmap_pins = 0;
        gmap_total = 0;

        var url = gmap_wbb+"index.php?page=MapAjax&type="+gmap_type;
        url += ajax_hidegroup.length > 0 ? "&groups="+ajax_hidegroup.join(",") : "";

	GDownloadUrl(url, function(data, responseCode) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('p');
		var dom_usercount = document.getElementById('gmap_usercount');
		var errorcodes = xml.documentElement.getElementsByTagName('errors')[0];

		if(errorcodes != null) {
			var errorcodes_arr = errorcodes.firstChild.data.split(",");
			var messages = new Array();
			for(var i=0; i<errorcodes_arr.length; i++) {
				messages.push(gmap_errors[errorcodes_arr[i]]);
			}
			gDialog("ERROR",messages.join("<br/>"));
			return;
		}

		map.clearOverlays();

		for(var i=0; i<markers.length; i++) {
			var count = 0;
			var users = markers[i].getElementsByTagName('u');
			var lat = parseFloat(markers[i].getAttribute("lat"));
			var lng = parseFloat(markers[i].getAttribute("lng"));
			var headline = markers[i].getAttribute("h");
			
			var userstring = "";
			for(var j=0; j<users.length; j++) {
				var url = gmap_wbb + 'index.php?page=User&amp;userID='+users[j].getAttribute("id");

				userstring += (count == 0 ? "" : ", ") + '<a href="'+url+'">'+users[j].firstChild.data+'</a>';
				count++;
			}

			map.addOverlay(gMarker(new GPoint(lat,lng), headline, userstring, count));
			
			gmap_total += count;
			gmap_pins++;
		}

		// update user count
		dom_usercount.innerHTML = gmap_total;
		
		gLoading(false); // hide loading message
	});
}

