/* Global variables */

/* Drawing Canvas */
var canvas=null;

/* Martian status messages array */

/* Current track */
var currentTrack=null;

/* Current logged user */
var user=null;

/* Name of the path to load */
var nameToLoad=null;

/* layers dragging management variables */
var draggingWindow=null;
var dragPoint=null;
var dragStartPos=null;

/* layers resizing management variables */
var resizingWindow=null;
var resizingSpacer=null;
var resizePoint=null;
var resizeStartHeight=null;
var resizeStartWidth=null;
var resizeSpacerStartWidth=null;
var dy=null;
var dx=null;
var resizingDirection=null;

/**
 * Application initialization.
 * Called after user login.
 */
function init() {
	// Create the manual move web control
	Martian.slider = new Slider(document.getElementById("slider"),
                   document.getElementById("slider-input"));
	Martian.slider.onchange=manualMoveMartian;

	// default toolbar: no control panel, profile or save (no track loaded)
	disableButton('controlbutton');
	disableButton('profilebutton');
	disableButton('savetrackbutton');

	// user name entered
	user=document.getElementById('userName').value;

	if(user) {
		// GUI change
		document.getElementById('globalDiv').style.visibility='visible';
		document.getElementById('userTable').style.visibility='hidden';

		/* Browser dependent initialization: Layers Dragging and canvas technology */
		if(is_ie5up) {
			canvas=new Canvas('VML','drawDiv');
			document.getElementById('profileDragElement').onmousedown=new Function('beginDrag(event,\'profileWindow\')');
			document.getElementById('controlPanelDragElement').onmousedown=new Function('beginDrag(event,\'controlPanelDiv\')');
			
			
		} else {
			canvas=new Canvas('JSGraphics','drawDiv');
			document.getElementById('profileDragElement').addEventListener('mousedown',beginDragProfile,true);
			document.getElementById('controlPanelDragElement').addEventListener('mousedown',beginDragControlPanel,true);
		}

		/* Last path saved on cookies */
		var name=GetCookie('track');
		
		/* Try to load previously used path */
		if(name) {
			currentTrack=loadTrack(name);
			if(currentTrack!=null) {
				if(calcProfile())
					enableButton('profilebutton');
				else {
					alert('Errore nel calcolo del profilo altimetrico.');
				}
				currentTrack.initMartian(checkMartianStatus(currentTrack.name));
			}
			else
				DeleteCookie('track','/',null);
			
			
		} else
			newTrack();
		
		
		
	} else
		alert('Immettere un nome valido');
}

/**
 * Toolbar buttons management functions: disable/enable button
 */
function disableButton(button) {
	var img=document.getElementById(button);
	img.src="immagini/"+button+"_disabled.gif";
	img.onmouseover=null;
	img.onmouseout=null;
	img.style.cursor='default';
}

function enableButton(button) {
	var img=document.getElementById(button);
	img.src="immagini/"+button+".gif";
	img.onmouseover=new Function('this.src=\'immagini/'+button+'_over.gif\'');
	img.onmouseout=new Function('this.src=\'immagini/'+button+'.gif\'');
	img.style.cursor='pointer';
}

function initGUI() {
	closeProfile();
}

/**
 * Loads a track, given the name.
 */
function loadTrack(name) {
	canvas.clear();
	// asks web service for the new path
	var xmlhttp=new XMLHttpRequest();
	xmlhttp.open("GET", "loadtrack.php?name="+name+"&time="+(new Date()).getTime(), false);
	xmlhttp.send(null);
	if(xmlhttp.responseText.substring(0,3)=='OK:') {
		// path loaded
		var track=xmlhttp.responseText.substring(3).replace(/\\/g,"");
		
		var loadedTrack=new Track(name,JSON.parse(track),'currentTrack');
		canvas.drawTrack(loadedTrack);
		
		
		setMessage('Percorso '+name+' caricato. Richiedi il profilo altimetrico.');
		return loadedTrack;
	} else if(xmlhttp.responseText=='NOTFOUND') {
		alert('Il percorso '+name+' non esiste piu\'');
	} else {
		alert('Errore: '+xmlhttp.responseText);
		return null;
	}

}


/**
 * Answers to a click event during track drawing.
 */
function clickTrack(evt) {
	canvas.click(evt);
}

/**
 * Follows mouse movement
 * during lines drawing.
 */
function mouseMoveTrack(evt) {
	canvas.mouseMove(evt);
	
}

/**
 * Opens the loading window.
 */
function preLoadTrack() {
	document.getElementById('internalLoadDiv').innerHTML='';
	document.getElementById('loadDiv').style.visibility='visible';
	// asks web service for track list
	var xmlhttp=new XMLHttpRequest();
	xmlhttp.open("GET", "tracklist.php?time="+(new Date()).getTime(), false);
	xmlhttp.send(null);
	var response=xmlhttp.responseText;
	var trackList=response.split(',');
	var html='';
	for(var pos in trackList) {
		if(trackList[pos])
			html+='<span style="font-family:Tahoma;font-size:14px;cursor:pointer" onclick="this.style.backgroundColor=\'blue\';nameToLoad=\''+trackList[pos]+'\'">'+trackList[pos]+'</span><br/>';
	}
	document.getElementById('internalLoadDiv').innerHTML=html;

}

/**
 * Do Load the track choosen by the user.
 */
function doLoad() {
	initGUI();
	var name=nameToLoad;
	if(name=='') {
		alert('Inserisci un nome');
	} else {
		if(currentTrack && currentTrack.martian)
			currentTrack.martian.reset();
		document.getElementById('loadDiv').style.visibility='hidden';
		currentTrack=loadTrack(name);
		if(currentTrack!=null) {
			
			if(calcProfile())
				enableButton('profilebutton');
			else {
				alert('Errore nel calcolo del profilo altimetrico.');
				disableButton('profilebutton');
			}
			
			var expires=new Date();
			expires.setTime(expires.getTime()+(2 * 24 * 60 * 60 * 1000));
			SetCookie('track',name,expires,"/",null,false);
			
			disableButton('savetrackbutton');
			currentTrack.initMartian(checkMartianStatus(currentTrack.name));
			
		}
	}
		
	
}

/**
 * Undo tracking load.
 */
function cancelLoadTrack(evt) {
	nameToLoad=null;
	document.getElementById('loadDiv').style.visibility='hidden';
	
}

/**
 * Opens saving window
 */
function preSaveTrack() {
	if(canvas.mode==Canvas.modeDrawing) {
		canvas.preSave();
		
		document.getElementById('saveDiv').style.visibility='visible';
		
	}
}


/**
 * Do save the current track.
 */
 function doSave() {
	
		
	var name=document.getElementById('saveName').value;
	if(name=='') {
		alert('Inserisci un nome');
	} else {
		document.getElementById('saveDiv').style.visibility='hidden';
		currentTrack=canvas.save(name);
		currentTrack.objName='currentTrack';
		
		
		var toSave=JSON.stringify(currentTrack.lines);
		
		var expires=new Date();
		expires.setTime(expires.getTime()+(2 * 24 * 60 * 60 * 1000));
		var xmlhttp=new XMLHttpRequest();
		xmlhttp.open("GET", "savetrack.php?name="+name+"&data="+toSave+'&time='+(new Date()).getTime(), false);
		xmlhttp.send(null);
		if(xmlhttp.responseText=='OK') {
			SetCookie('track',name,expires,"/",null,false);
			enableButton('profilebutton');
			disableButton('savetrackbutton');
			if(calcProfile())
				enableButton('profilebutton');
			else {
				alert('Errore nel calcolo del profilo altimetrico.');
				disableButton('profilebutton');
			}
			
			
			setMessage('Percorso '+name+' salvato. Richiedi il profilo altimetrico.');
			currentTrack.initMartian(Martian.modeFree);
			
		} else
			alert('Errore: '+xmlhttp.responseText);

	}
		
	
}

/**
 * Undo saving.
 */
function cancelSaveTrack(evt) {
	document.getElementById('saveDiv').style.visibility='hidden';
	newTrack();
}


/**
 * Closes profile window.
 */
function closeProfile() {
	document.getElementById('profileWindow').style.visibility='hidden';
}

/**
 * Begins a new track.
 */
function newTrack() {
	
	if(currentTrack && currentTrack.martian)
		currentTrack.martian.clear();
	
	initGUI();
	setMessage('Disegna un percorso tracciando delle linee sul territorio marziano. Salva per terminare.');
	
	disableButton('savetrackbutton');
	disableButton('profilebutton');
	disableButton('controlbutton');
	
	//currentTrack=null;
	canvas.clear();
	
}


/**
 * Gets profile image.
 */
function openProfile(isNew) {
	document.getElementById('waiting').style.visibility='visible';
	document.getElementById('profileWindow').style.visibility='visible';
	
	var param=JSON.stringify(currentTrack.lines);
	var encoded=encodeBase64(param);
	
	var div=document.getElementById('profileDiv');
	
	div.innerHTML='<img src="profile.php?lines='+encoded+'&time='+(new Date()).getTime()+'+&type=image/gif&height='+Profile.Height+'" onload="profileLoaded()"/>';	
}

/**
 * Profile image loaded event.
 */
function profileLoaded() {
	document.getElementById('waiting').style.visibility='hidden';
}

/**
 * Layer dragging management functions.
 */
function beginDragProfile(evt) {
	beginDrag(evt,'profileWindow');
}

function beginDragControlPanel(evt) {
	beginDrag(evt,'controlPanelDiv');
}

function beginDrag(evt,name) {
	
	draggingWindow=name;
	dragPoint=getAbsolutePoint(evt);
	var div=document.getElementById(name);
	var left=div.style.left;
	var top=div.style.top;
	dragStartPos=new Point(parseInt(left.substring(0,left.length-2)),parseInt(top.substring(0,top.length-2)));
	
	if(is_ie) {
		document.onmousemove=drag;
		document.onmouseup=endDrag;
	} else if(is_nav) {
		document.addEventListener('mousemove',drag,true);
		document.addEventListener('mouseup',endDrag,true);
	}
	
}

function drag(evt) {
	
	if(draggingWindow) {
		
		var div=document.getElementById(draggingWindow);
		var p=getAbsolutePoint(evt);
		var dx=p.x-dragPoint.x;
		var dy=p.y-dragPoint.y;
		div.style.left=(dragStartPos.x+dx)+'px';
		div.style.top=(dragStartPos.y+dy)+'px';
	}
}

function endDrag(evt) {
	
	if(draggingWindow) {
		
		if(is_ie) {
			document.onmousemove=null;
			document.onmouseup=null;
		} else if(is_nav) {
			document.removeEventListener('mousemove',drag,true);
			document.removeEventListener('mouseup',endDrag,true);
		}
		draggingWindow=null;
	}
}

/**
 * Layer resizing management functions.
 */
function beginResize(evt,name,direction) {
	resizingWindow=name;
	resizingSpacer=document.getElementById(name+'Spacer');
	resizingDirection=direction;
	resizePoint=getAbsolutePoint(evt);
	var div=document.getElementById(name);
	var height=div.style.height;
	var width=div.style.width;
	
	resizeStartHeight=parseInt(height.substring(0,height.length-2));
	resizeStartWidth=parseInt(width.substring(0,width.length-2));
	
	if(resizingSpacer)
		resizeSpacerStartWidth=resizingSpacer.width;
		
	document.onmousemove=resize;
	document.onmouseup=endResize;
	return false;
}

function resize(evt) {
	if(resizingWindow) {
		var div=document.getElementById(resizingWindow);
		var p=getAbsolutePoint(evt);
		
		dy=p.y-resizePoint.y;
		dx=p.x-resizePoint.x;
		
		//if((resizingDirection=='vertical' || resizingDirection=='both') && (resizeStartHeight+dy)>50) {
			div.style.height=(resizeStartHeight+dy)+'px';
			document.getElementById('waiting').style.top=((resizeStartHeight+dy-50)/2)+'px';
			
		//}
		
		//if((resizingDirection=='horizontal' || resizingDirection=='both') && (resizeStartWidth+dx)>200) {
			if(resizingSpacer)
				resizingSpacer.width=(resizeSpacerStartWidth+dx);
			div.style.width=(resizeStartWidth+dx)+'px';
			document.getElementById('waiting').style.left=((resizeStartWidth+dx-300)/2)+'px';
		//}
	}
}

function endResize(evt) {
	
	if(resizingWindow) {
	
		document.onmousemove=null;
		document.onmouseup=null;
		resizingWindow=null;
		if(resizingDirection=='vertical' || resizingDirection=='both')
			Profile.Height+=dy;
		dy=null;
		dx=null;
		if(resizingDirection=='vertical' || resizingDirection=='both') {
			calcProfile();
			openProfile(false);
		}
	}
}

/**
 * Control panel layer management (open/close)
 */
function openControlPanel() {
	if(currentTrack && currentTrack.martian && currentTrack.martian.mode==Martian.modeMine)
		document.getElementById('controlPanelDiv').style.visibility='visible';
}

function closeControlPanel() {
	document.getElementById('controlPanelDiv').style.visibility='hidden';
}

/**
 * Control panel function. Linear movement (costant speed).
 */
function motoLineare() {
	if(currentTrack && currentTrack.martian && currentTrack.martian.mode==Martian.modeMine) {
		currentTrack.martian.walk();
	}
	
}


/**
 * Control panel function. Manual movement (via slider).
 */
function manualMoveMartian() {
	if(currentTrack && currentTrack.martian && currentTrack.martian.mode==Martian.modeMine)
		currentTrack.martian.manualMove();
	
}

/**
 * Take martian control.
 */
function takeMartian() {
	if(currentTrack && currentTrack.martian)
		currentTrack.martian.take();
}

/**
 * Release martian control.
 */
function releaseMartian() {
	
	if(currentTrack && currentTrack.martian && currentTrack.martian.mode==Martian.modeMine) {
		
		currentTrack.martian.release();
		closeControlPanel();
		disableButton('controlbutton');
	}
}

/**
 * Gets current path length (in pixels), summing all lines length.
 */
function calcProfile() {
	// Gets new profile from web service
	var param=JSON.stringify(currentTrack.lines);
	var encoded=encodeBase64(param);
	var xmlhttp=new XMLHttpRequest();
	xmlhttp.open("GET", "profile.php?lines="+encoded+'&time='+(new Date()).getTime()+'&height='+Profile.Height, false);
	xmlhttp.send(null);
	try	{
		currentTrack.initProfile(JSON.parse(xmlhttp.responseText));
		return true;
	}
	catch (e) {
		return false;
	}
	
	
}

/**
 * Checks martian status and updates user interface.
 */
function checkMartianStatus(name) {
	
	var xmlhttp=new XMLHttpRequest();
	xmlhttp.open("GET", "martianstatus.php?action=get&user="+user+"&name="+name+"&time="+(new Date()).getTime(), false);
	xmlhttp.send(null);
	var response=xmlhttp.responseText;
	if(response=='FREE') {	
		return Martian.modeFree;
	} else if(response.substring(0,7)=='LOCKED:') {
			return Martian.modeLocked;
	} else if(response=='YOURS') {
		return Martian.modeMine;
		
	} else if(response=='SKIP') {
		return Martian.modeLocked;
	} else {
		alert('Errore nella lettura dello stato: '+response);
		return Martian.modeLocked;
	}
	
	
}

/**
 * Updates martian status message.
 */
function setMessage(msg) {
	document.getElementById('message').innerHTML=msg;
}
