MC_env = {};
MouseCapture = function(){
	var self = this;
	this.mousePos = {x: 0, y: 0};
	this.pagePos = 0;
	var mouseDown = false;	
	var mouseDownSeen = true;
	var scrollSeen = true;
	var first_movement = false;
		
	Utils.getWindowSize();
	this.xml = "<?xml version='1.0' encoding='utf-8'?>" +						  
				  "<mousecoords>"+
				  	"<function>save_mouse_track</function>"+
					"<datetime>"+Utils.getDateTimeAsString(new Date())+"</datetime>"+								
					"<win_width>"+Globals.win_width+"</win_width>"+
					"<win_height>"+Globals.win_height+"</win_height>"+
					"<browser>"+BrowserDetect.browser+"</browser>"+
					"<browser_ver>"+BrowserDetect.version+"</browser_ver>"+
					"<browser_os>"+BrowserDetect.OS+"</browser_os>";
	var timer;
	var timer_play = 0;
	var play_frame = 0;
	var num_frames = 0;
	
	this.start = function(e_){		
		Handler.add(document, "mousemove", setMousePos);
		Handler.add(document, "mousedown", function(){
			mouseDown = true;
			mouseDownSeen = false;
		});
		Handler.add(document, "mouseup", function(){
			mouseDown = false;
		});
		Handler.add(document, "scroll", function(){
			self.pagePos = (document.all) ? document.body.scrollTop : window.pageYOffset;
			scrollSeen = false;
		})
		

		timer = setInterval(capture, 20);		
	}
	this.stop = function(){
		Handler.remove(document, "mousemove", setMousePos);
		clearInterval(timer);
		
	}
	
	var capture = function(){		
		self.xml += "<frame>" +
					"<x>"+ self.mousePos.x+"</x>" +
					"<y>"+self.mousePos.y+"</y>";
		if(!mouseDownSeen){
			self.xml += "<click>1</click>";
			if(!mouseDown)
				mouseDownSeen = true;	
		}			
		if(!scrollSeen){
			self.xml += "<scroll>"+self.pagePos+"</scroll>";
			scrollSeen = true;
		}	
		self.xml += "</frame>";
		num_frames++;
		if(num_frames > 3*60*50) //Stop after 3 minutes 
			self.stop();
	}
	var setMousePos = function(e){			
		self.mousePos = Utils.mousePos(e);
		if(!first_movement){			
			self.xml += "<frame>" +
						"<x>"+self.mousePos.x+"</x>" +
						"<y>"+self.mousePos.y+"</y>"+
						"<click>2</click>"+
					"</frame>";					
			first_movement = true;
		}
				
	}
	this.getXML = function(){
		return self.xml + "<datetime_end>"+Utils.getDateTimeAsString(new Date())+"</datetime_end>" +
							"<frames>"+num_frames+"</frames>"+
							"</mousecoords>";
	}

	this.getTrackList = function(){		
		Ajax.get("list_mouse_tracks", null, function(json){
			
			var inner = "";			
			for(var i in json.files){
				inner += "<li><a href='/cgi-bin/mygeolog.cgi?f=frontpage_playtrack&track="+json.files[i]+"'>"+json.files[i]+"</a></li>";
			}
			Utils.ge("tracklist").innerHTML = inner;
		});
	}
	this.playTrack = function(){
		if(!MouseTrack){
			alert("No track loaded:(");
			return;
		}			
		clearInterval(timer_play);
		play_frame = 0;			
		timer_play = setInterval(self.playFrame, 20);
	}
	this.stopTrack = function(){
		clearInterval(timer_play);
		Utils.ge("tracklist").innerHTML = "Track finished";
	}
	var prevX = 0;
	var prevY = 0;
	var prevClick  = 0;
	this.playFrame = function(){
		if(!MouseTrack.frames[play_frame]){
			self.stopTrack();		
			return;
		}
		var playPos = MouseTrack.frames[play_frame];		 
		playPos.click = playPos.click*1 || 0;
		if(prevX != playPos.x || prevY != playPos.y || prevClick != playPos.click){
			prevX = playPos.x;
			prevY = playPos.y;
			prevClick = playPos.click;
			var color;  
			switch(playPos.click){
				case 0: color = "#F00; z-index: 1; ";break;
				case 1: color = "#0F0; z-index: 2; ";break;
				case 2: color = "#00F; z-index: 3; ";break;
			}
			var pos = document.createElement("div");		
			pos.style.cssText = "position: absolute; top: "+playPos.y+"px; left: "+(MC_env.left+(playPos.x*1))+"px; background-color: "+color+"; width: 5px; height: 5px; ";
			document.body.appendChild(pos);
		}
		Utils.ge("frame_count").innerHTML = "frame: "+(play_frame)+" x: "+playPos.x+" y: "+playPos.y;
		if(playPos.scroll){
			Utils.ge("browser_frame").style.top = ((playPos.scroll*1)-2)+"px";
			scroll(0, playPos.scroll);
		}
		play_frame++; 
	}
	
	
	this.makeMenu = function(){		
		var div = document.createElement("div");
		div.id = "tracks";
		div.style.cssText = " background: #DDD; padding: 10px; border: 1px solid #000; position: absolute; top: 10px; left: 10px; ";
		
		var inner = "";
		inner += "<input type='button' value='List files' onclick = 'self.mc.getTrackList();' />";
		inner += "<input type='button' value='Play' onclick = 'self.mc.playTrack();' />";
		inner += "<input type='button' value='Stop' onclick = 'self.mc.stopTrack();' />";		
		inner += "<div id='frame_count' style='border: 1px solid #000; min-height: 15px; '>";
		if(MouseTrack){
			inner += "Loaded track:<bR>" +
					"start time: "+MouseTrack.start_time+"<br>" +
					"end_time: "+MouseTrack.end_time+"<br>" +
					"frames: "+MouseTrack.frames.length+"<br>"+			
					"IP: "+MouseTrack.ip_addr+"<br>"+
					"Using: "+MouseTrack.browser+" "+MouseTrack.browser_ver+" on "+MouseTrack.browser_os+"<br>";			
			MC_env.left = (((Globals.win_width*1)-(MouseTrack.win_width*1))/2)-2;
			var browser_frame = document.createElement("div");
			browser_frame.id = "browser_frame";
			browser_frame.style.cssText = "border: 2px solid #F00; position: absolute; top: -2px; width: "+MouseTrack.win_width+"px; height: "+MouseTrack.win_height+"px; left: "+MC_env.left+"px";
			document.body.appendChild(browser_frame);
		}
		inner += "</div>";
		inner += "<ol id='tracklist'></ol>";
		div.innerHTML = inner;		
		document.body.appendChild(div);		
	}
}


var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

