/*
 main functions of upnx client.
 */
function getEventIW(marker, key){
    isMapUpdatable = true;
    GEvent.addListener(marker, "infowindowopen", function(){
        isMapUpdatable = false;
    });
    GEvent.addListener(marker, "infowindowclose", function(){
        isMapUpdatable = true;
        queryEvents();
    });
    GEvent.clearListeners(marker,"click");
    GEvent.addListener(marker, "click", function(){
        marker.closeInfoWindow();
    });
    $.get("/event/get", {
        'key': key
    }, function(data){
        marker.openInfoWindowHtml(data);
    }, "html");
}


function addEventOnMap(event){
	var marker = new GMarker(new GLatLng(event.lc_lat, event.lc_lng));
    event['marker'] = marker; // bind marker to corresponding event
	mapEvents.push(event);
    map.addOverlay(marker);
    GEvent.addListener(marker, "click", function(){
        getEventIW(marker, event.key);
    });
}


function updateEventsMap(events){
    map.clearOverlays();
	mapEvents = new Array(); // reset map events
    $.each(events, function(i, event){
		addEventOnMap(event);
    });
}


function receiveEventsQuery(data){
    var block = $("#eventsSearchResults");
    block.removeClass("error");
    block.removeClass("notice");
    block.addClass("success");
    block.html(data.infos.sentence);
    updateEventsMap(data.events);
}


function queryEvents(){
    var filtersMap = {};
    $.each($("#filters .filter"), function(i, filter){
        filtersMap[filter.name] = filter.value;
    }, false);
    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();
    filtersMap['lc_lat1'] = sw.lat();
    filtersMap['lc_lat2'] = ne.lat();
    filtersMap['lc_lng1'] = sw.lng();
    filtersMap['lc_lng2'] = ne.lng();
    $.getJSON("/event/query", filtersMap, function(data){
        receiveEventsQuery(data);
    });
    var resSentence = "<b>looking for events</b>";
    var block = $("#eventsSearchResults");
    block.removeClass("success");
    block.removeClass("error");
    block.addClass("notice");
    block.html(resSentence);
}



function addEventIW(overlay, latlng){
    var marker = new GMarker(latlng);
    GEvent.addListener(marker, "infowindowopen", function(){
        isMapUpdatable = false;
        $(function(){
			if (session.username !== "") {
	            $("form.addEventForm").ajaxForm(function(data){
	                eventCreated(data);
	            });				
			}
        });
    });
    GEvent.addListener(marker, "infowindowclose", function(){
        isMapUpdatable = true;
		marker.hide();
    });
    map.addOverlay(marker);
    $.get("/event/add", {
        lc_lat: latlng.lat(),
        lc_lng: latlng.lng()
    }, function(data){
        marker.openInfoWindowHtml(data);
    }, "html");
}

function locateAddress(address){
    if (geocoder) {
        geocoder.getLatLng(address, function(point){
            if (point) {
                map.setCenter(point, 12);
            }
        });
    }
}

function updateSessionPanel(data) {
	session = data.session;
	// update session block (top-right corner)
    var block = $("#session");
	if (session.username === "") {
		// if user is logged out
	    block.html('<a href="' + session.url + '">sign in / register</a>');		
	} else {
		// if we got a user
		block.html('logged as <b>'+ session.username + '</b>, <a href="' + session.url + '">logout</a>');	
	}
}

function showEvent(key) {
	var e;
	// finds event info in myevents table
	for (i in myEvents) {
		if ( myEvents[i].key == key) {
			e = myEvents[i];
			break;
		}		
	}
	mapEvents = null;
	map.setCenter(new GLatLng(e.lc_lat,e.lc_lng),map.getZoom());
	// finds event info in mapevents table
	for (i in mapEvents) {
		if ( e.key == key) {
			e = mapEvents[i];
			break;
		}		
	}
}

function updateEditPanel() {
		if (session.username === "") {
		$.get("/session/invite", 
			{},
		 	function(data){
	        	$("#panel-edit").html(data);
	    	},
			"html");		
		} else {
			$.getJSON("/event/my", 
				{},
			 	function(data){
					myEvents = data.events;
					var output = "";
					output += '<table> <tr> <th> my events </th> <th> </th>';
					$.each(myEvents, function(i, event){
			        	output += '<tr><td class="small text">'+ event.dt_stt +'</td> <td class="small text"><a class="myEvent" href="javascript:showEvent(\'' + event.key + '\');" id="">' + event.in_sum + '</a></td></tr>';
    				});
					output += '</tr></table>';
					output += '<hr/><p> <strong>To add an event</strong>: double-click on the map where you want to add it. </p>';
		        	$("div#panel-edit").html(output);
		    	});						
		}

}

function updateSession(){
	$.getJSON("/session/status", {}, function(data){
		updateSessionPanel(data);
		updateEditPanel();
	});
}

function eventCreated(data){
    isMapUpdatable = false;
	updateSession();
    queryEvents();
}


//INIT SCRIPTS
var map = null;
var geocoder = null;
var mapEvents = null;
var myEvents = null;
var isMapUpdatable = true;
var session = null;
$(document).ready(function(){
    // replace gmaps body.load attribute setting
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
		geocoder = new GClientGeocoder();
        map.setCenter(new GLatLng(46.802503, 7.151281), 13);
        map.addControl(new GSmallZoomControl());
        map.addControl(new GMapTypeControl());
        GEvent.clearListeners(map, "dblclick"); // removed dbclick zooming
        GEvent.addListener(map, "dblclick", function(overlay, latlng){
			addEventIW(overlay, latlng);			
        });
        GEvent.addListener(map, "moveend", function(){
            if (isMapUpdatable) {
                queryEvents();
            }
        });
    }
    // init tabbed panels
    $('#panels > #tabs').tabs({
        fx: {
            opacity: 'toggle',
            duration: 'fast'
        }
    });
    // init query filters
    $.each($("#filters .filter"), function(){
        $(this).change(function(){
            queryEvents();
        }, false);
    }, false);
	// init locator
    $.each($("input#address"), function(){
        $(this).keyup(function(event){
			locateAddress(event.target.value);
		}, false);
        $(this).focus(function(event){
			var oval = "fribourg";
			if (event.target.value === oval) {
				event.target.value="";
				$(event.target).removeClass("hint");
			}
		}, false);
    }, false);
	// init session
	updateSession();
	// finally, perform initial events query
    queryEvents();
});

// replaces gmaps body.unload attribute setting
$(document).unload(function(){
    GUnload();
});


