if(!window.console){
	window.console={};
	window.console.debug=function(){ return true;};
}


var mainMap; // map functions for this website
var map; // GMap instance
var mgr; // MarkerManager for added markers
var mapLabels; // RyzomMapLabelOverlay for chainging language from script
var mapLanguage; // RyzomMapLabelControl


/*
 * This will be triggered on browser window resize
 * 
 * Recalculates new body container height and restores map center location.
 */
var timeout=false;
function map_resize(){
	var oldCenter=map.getCenter();
	
	// body width, window height
	var bw = $('body').outerWidth();
	var wh = $(window).height();
	//
	var wt = $('#wrapper').offset().top;
	
	var pw=0;
	if(panel_visible){
		// panel width if panel is visible
		pw = $('#panel').outerWidth();
	}
	
	// #map width, height and left attribute needs to be set - left == panel width
	var mapWidth=bw-pw;
	var mapHeight=wh-wt;
	
	$('#map').css({
		left: pw+'px',
		width: mapWidth+'px',
		height: mapHeight+'px'
	});
	
	// #panel height also needs to be set if panel is visible (width > 0)
	if(pw>0) $('#panel').css({height:mapHeight+'px'});

	// signal gmap that map container changed size and restore old center
	map.checkResize();
	map.setCenter(oldCenter);
}

/**
 * Make Panel object that handles the panel area
 * - expand/collapse icon placement
 * - panel width (or left-margin) on expand/collapse
 */
var panel_visible=true;
function panel_toggle(state){
	if(map.isLoaded()){
		var $map = $("#map");
		// if state is not set, then invert current state
		state= (state === undefined) ? !panel_visible : state;
		if(state){
			$map.addClass('mapPanelVisible');
			$('#panel').removeClass('panelHidden').addClass('panelVisible');
			$('#panel-toggle').addClass('mapPanelVisible');//.css({right: 0, left: 'auto'});
		}else{
			$map.removeClass('mapPanelVisible');
			$('#panel').removeClass('panelVisible').addClass('panelHidden');
			$('#panel-toggle').removeClass('mapPanelVisible');//.css({right: 'auto', left: 0});
		}
		panel_visible=state;
		$.cookie('ui.panel.active', state ? 'true' : 'false', {expires: 365});
		//
		map_resize();
		// FIXME: mapgroups should listen on #panel resize event
		mapgroups_toggle(mapgroups_visible);
	}
}

/**
 * Expands/collapses map groups list at the bottom of sidepanel
 * - hides/shows mapGroups-body (where the list is
 * - modifies #panel-body height
 */
var mapgroups_visible=true;
function mapgroups_toggle(state){
	if(state){
		// first lets make body visible or offsetHeight will not be accurate
		$('#mapGroups-body').show();
	}else{
		$('#mapGroups-body').hide();
	}
	var h1=$('#panel').height();
	var h2=$("#mapGroups").height();
	var h=h1-h2;
	$('#panel-body').css('height', h+'px');
	mapgroups_visible=state;
	$.cookie('ui.panel.mapgroups', state ? 'true' : 'false', {expires: 365});
}

// show default message on panel
function panel_reset(){
	$("#panel-body").html('..');	
}

function show_group(group){
	group.show();
}

function activate_group(group){
	var h3=document.createElement('h3');
	h3.innerHTML=group.getName();
	
	var ul=document.createElement('ul');
	group.createList(ul);
	
	var div = document.createElement('div');
	div.appendChild(h3);
	div.appendChild(ul);
	$('#panel-body').html(div);
}

// remove group from sidepanel
function remove_group(group){
	// hide markers
	group.hide();
	if(group.__tr) {
		// FIXME: maybe group is not the one active on panel ?
		panel_reset();
		$(group.__tr).remove();
		// also update mapgroup list
		mapgroups_toggle(mapgroups_visible);

		group.removeAll();
		delete group.__tr;
	}
}

// add marker group to sidepanel.
function add_group(group, dst){
	// destination jquery container where to add this group info
	dst=dst||$("#mapGroups-body");

	var tr=document.createElement('div');
	tr.className='mapGroupRow'+(group.hidden ? ' cbNormal' : ' cbActive');
	tr.innerHTML=
		'<img src="images/w_answer_16_cancel.png" style="float: right;" alt="remove" />'+
		'<img src="images/clear.gif" width="16px" height="16px" alt="show" /> '+
		'<a href="javascript:void(0);">'+group.getName()+'</a>';
	group.__tr=tr;
	$(tr).click(function(e){
		// remove group from map and delete it
		if($(e.target).is('img[alt="remove"]')){
			remove_group(group);
			return;
		}
		var cl_add, cl_del;
		if($(tr).is('.cbActive')){
			cl_add='cbNormal';
			cl_del='cbActive';
		}else{
			cl_add='cbActive';
			cl_del='cbNormal';
		}
		// click was on name, show group content on panel
		if($(e.target).is('a')){
			activate_group(group);
			cl_add='cbActive';
			cl_del='cbNormal';
		}
		$(tr).removeClass(cl_del).addClass(cl_add);
		if(cl_add=='cbActive'){
			group.show();
		}else{
			group.hide();
			panel_reset();
		}
	});
	$(dst).append(group.__tr);

	// also update mapgroup list
	mapgroups_toggle(mapgroups_visible);
};

$(function(){
	/**
	 * Language change object for map.
	 * Can use RyzomMapLabelControl object directly
	 */
	var langBar = {
		$div : $("#langBar"),
		
		init: function(ovr){
			var me=this;
			this.ovr_=ovr;
			this.ovr_container = ovr.initialize(langBar);
			this.ovr_.doLabelChange=function(a,b,c){ return me.doLabelChange(a,b,c);};
			//
			this.restore();
		},
		// restore language 
		restore: function(){
			var sel=$.cookie('ui.lang');
			if(this.ovr_.langs.indexOf(sel)!=-1){
				// language cookie is set, restore it
				this.ovr_.setLanguage(sel);
			}
		},
		// save language to cookie
		save: function(lang){
			$.cookie('ui.lang', lang, {expires: 365});
			// write selected language to server side session
			$.post('ajax/language.php', { lang: lang });
		},
		// will be called when language changes
		doLabelChange:function(obj, lang, target){
			target=target || this.$div.find("img[alt="+lang+"]").get(0);
			if(target){
				$(':hidden', target.parentNode).show();
				$(target).hide();
				this.save(lang);
			}
		},
		// return target DOM container for language icons
		getContainer:function(){
			return this.$div.get(0);
		}
	
	};
	
	// map labels
	mapLabels=new RyzomMapLabelOverlay('en', true);
	// for langugage
	mapLanguage = new RyzomMapLabelControl(mapLabels);
	langBar.init(mapLanguage);
	
	/**
	 * initialize map
	 */
	map=RyzomMap('map-body', 5, 1, 15);
	map.addOverlay(mapLabels);
	// this allows to change languages
	//map.addControl(new RyzomMapLabelControl(mapLabels));
	// add location tracker to map
	//map.addControl(new RyzomNavLabelControl());

	/**
	 * marker manager
	 */
	//mgr=new MarkerManager(map, {trackMarkers: false, maxZoom:map.maxZoom});
	mgr=new MarkerClusterer(map, [], {maxZoom: 11, gridSize: 15});
	
	//mgr.refresh();

	/**
	 * UI resize
	 */
	var p=$.cookie('ui.panel.active');
	if(p === null) p='true';
	panel_visible = p=='true';

	var g=$.cookie('ui.panel.mapgroups');
	if(g === null) g='true';
	mapgroups_visible= g=='true';

	// handle map container resize event
	$(window).bind('resize', function(){
		if(timeout) clearTimeout();
		timeout=setTimeout(map_resize, 0);
	});

	// toggle panel on-off button
	$('#panel-toggle').click(function(){
		panel_toggle(!panel_visible);
		return false;
	});
	panel_toggle(panel_visible);
	
	// toggle map groups on/off
	$("#mapGroups .bar").click(function(){
		mapgroups_toggle(!mapgroups_visible);
		return false;
	});
	mapgroups_toggle(mapgroups_visible);
});
