Event.observe(window,'load',function(){
	selectPointer();
	addEvents();
	getSession();
	
});
var sessionId=-1;
var PEN=1,ERASER=0,POINTER=-1,tool=POINTER;
var draw=false,canvas,lastX,lastY,currentX,currentY,di=0,pool=[];
var grid=2,spells=[],redos=[],counter,v=0,current={s:0,v:[]};
var bufferAfter=0,absMax=20000,$t=null,maxP=0,buffer=2000;
var URL = "/polite/";

function addEvents(){
	Event.observe(document,"mousedown",m_dn);
	Event.observe(document,"mouseup",m_up);
	Event.observe(document,"mousemove",m_mv);
	canvas=$('content');
	counter=$('counter');
	$t=window.setInterval(lazyLoad,1);
	$t2 = window.setInterval(nextFrame,75);
}
function lazyLoad(){
	if(!draw && di>bufferAfter && di>pool.length-buffer && pool.length<absMax){
		for(var i=0;i<20;i++)
			appendDab();
	}
}
function appendDab(){
	var el=document.createElement("SPAN"); 
	el.className="dab";
	var dab=el.style;
	dab.top=(-100)+"px";
	pool.push(dab);
	canvas.appendChild(el);
	return dab;
}
function createDab(){
		var dab;
		if(di<pool.length){
			dab=pool[di];
		}else{
			dab=appendDab();
		}
		di++;
		if(di>maxP)
			maxP=di;
		if(di>absMax)
			di=0;
		return dab;
}
function m_dn(e){
	var t=e.element();
	if(tool!=POINTER && !isButton(t)){
		 if(!draw){
			lastX=scale(e.pointerX());
			lastY=scale(e.pointerY());
			draw=true;
		 }
	 	e.stop();
	}
}
function m_mv(e){
	var t=e.element();
	if(tool==POINTER || isButton(t)){
		lastX=null;
		lastY=null;
	}else{
		currentX=scale(e.pointerX());
		currentY=scale(e.pointerY());
		e.stop();
	}
}
function isButton(t){
	return (t.tagName=="BUTTON" || (t.parentNode && t.parentNode.tagName=="BUTTON"));
}
function m_up(){
	if(draw&&current.s>0){
		spells.push(current);
		sendData();
		newSpell();
	}
	draw=false;
	return false;	
}
function nextFrame(){
	if(draw){
	 	if(!lastY)
			lastY=currentY;
		 if(!lastX)
			lastX=currentX;
		 if(tool==PEN){
			drawLine(lastX,lastY,currentX,currentY);
			redos=[];
	 	}
	 }
	lastY=currentY;
	lastX=currentX;
}
function scale(px){
	return Math.floor(px/grid);
}
function drawPoint(x,y){
	var dab=createDab();
	current.s++;
	dab.left=(x*grid-4)+"px";
	dab.top=(y*grid-6)+"px";
}
function erasePoint(dab){
	dab.left=(-100)+"px";
	dab.top=(-100)+"px";
}
function drawLine(x0,y0,x1,y1){
     current.v.push([x0,y0,x1,y1]);
     var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0)
     var tmp;
     if(steep){
     	tmp=x0;
     	x0=y0;
     	y0=tmp;
        tmp=x1;
        x1=y1;
        y1=tmp;
     }
     if(x0 > x1){
     	 tmp=x0;
     	 x0=x1;
     	 x1=tmp;
     	 tmp=y0;
     	 y0=y1;
     	 y1=tmp;
     }
     var deltax = x1 - x0;
     var deltay = Math.abs(y1 - y0);
     var error = 0;
     var deltaerr = deltay / deltax;
     var ystep;
     var y = y0;
     if (y0 < y1) 
     	ystep = 1 ;
     else ystep = -1;
     
     for (var x = x0 ; x<x1; x++){
         if(steep) {
         	drawPoint(y,x);
         } else {
         	drawPoint(x,y);
         }
         error += deltaerr;
         if(error >= 0.5){
             y += ystep;
             error -= 1.0;
         }
     }
}
function redraw(spell){
	var v,s=spell.v;
	for(var j=0;j<s.length;j++){
		v=s[j];
		drawLine(v[0],v[1],v[2],v[3]);
	}
	spells.push(current);
}
function undo(){
	var s=spells.pop();
	sendUndo(s);
	redos.push(s);
	var undoTo=s.s;
	for(var i=0;i<undoTo;i++){
		di--;
		if(di<0)
			di=maxP-1;
		erasePoint(pool[di]);
	}
	v-=s.v.length;
	newSpell();	
}
function redo(){
	var s;
	if(s=redos.pop()){
		redraw(s);
		sendData();
		newSpell();
	}
}
function newSpell(){
	current={s:0,v:[]};
}
//function nextVector(vec,spell){
//	var vspan= document.createElement("span");
//	vspan.style.position="absolute";
//	vspan.style.left=vec[0]+"px";
//	vspan.style.top=vec[1]+"px";
//	vspan.style.width=(vec[2]-vec[0])+"px";
//	vspan.style.height=(vec[3]-vec[1])+"px";
//	Event.observe(vspan,"mouseover",getEraseF(spell));
//}
//function getEraseF(spell,vec){
//	if(draw&&tool==ERASER)
//	spell.v=sell.v.(vec);
//}
function sendData(){
	var url=URL+"SaveDrawing.action?sessionId="+sessionId+"&data=";
	url+=serialise(current);
	new Ajax.Request(url, {
	  method: 'get',
	  onSuccess: function(transport) {}
	});
}
function sendUndo(spell){
	var url=URL+"SaveDrawing.action?undo&sessionId="+sessionId+"&data=";
	url+=serialise(spell);
	new Ajax.Request(url, {
	  method: 'get',
	  onSuccess: function(transport) {}
	});
}
function serialise(spell){
	var s = spell.v,v=null;
	var p="";
	for(var i=0;i<s.length;i++){
		v=s[i];
		p+=v[0]+","+v[1]+","+v[2]+","+v[3];
		p+=";";
	}
	return p;
}
function setCookie(c_name, value, expiredays) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate() + expiredays);
	document.cookie = c_name + "=" + escape(value)
			+ ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

function getCookie(c_name) {
	if (document.cookie.length > 0) {
		c_start = document.cookie.indexOf(c_name + "=");
		if (c_start != -1) {
			c_start = c_start + c_name.length + 1;
			c_end = document.cookie.indexOf(";", c_start);
			if (c_end == -1)
				c_end = document.cookie.length;
			return unescape(document.cookie.substring(c_start, c_end));
		}
	}
	return null;
}
function getSession(){
	sessionId = getCookie("sessionId");
	var url=URL+"Session.action";
	if(sessionId)
		url+="?sessionId="+sessionId;
	new Ajax.Request(url, {
	  method: 'get',
	  onSuccess: function(transport) {
	  	var response = eval("("+transport.responseText+")");
	  	sessionId=response.sessionId;
	  	setCookie("sessionId",sessionId,365);
	  	getData();
	  }
	});
}
function getData(){
	var url=URL+"LoadDrawing.action?sessionId="+sessionId+"";
	new Ajax.Request(url, {
	  method: 'get',
	  onSuccess: function(transport) {
	  	var dwg = eval("("+transport.responseText+")");
	  	var v= null,s=null;
	  	for(var i=0;i<dwg.length;i++){
	  		s=dwg[i];
	  		redraw({v:s});
			newSpell();
	  	}
	  }
	});	
}


function selectPen(){
	unselect();
	tool=PEN;
	$('pen').addClassName('selected');
	document.body.style.cursor='crosshair';
}
function selectEraser(){
	unselect();
	tool=ERASER;
	$('eraser').addClassName('selected');
}
function selectPointer(){
	unselect();
	tool=POINTER;
	$('pointer').addClassName('selected');
}
function unselect(){
	$('pen').removeClassName('selected');
	$('pointer').removeClassName('selected');
	document.body.style.cursor='auto';
}