var dragButton = 0;
var tStart  = null;
var tDiff=0;

function updateTimer() {

   tDiff = new Date().getTime() - tStart.getTime();

   var sec = Math.floor(tDiff/1000);
   var min = Math.floor(sec/60);
   sec = sec%60;
   var hour = Math.floor(min/60);
   min = min%60;

   $( "#timerField" ).html( (hour==0?"":(hour+":")) +(min<10?"0":"")+ min+":"+(sec<10?"0":"")+sec  );
}

function applyValue( obj, val){
 if( val=="" ){
   val="n" ;
 }  
  obj.removeClass( "cn" );
 for (x in palette)
 {
  obj.removeClass( "c"+palette[x] );
 } 
 obj.addClass( "c"+val ); 
 obj.attr("abbr",val );

}

function selectColor( event ){
 if( event.which==2 ){return false;} 
 var btn = $("#m"+event.which);
 var val = event.target.getAttribute( "abbr" );
 
 applyValue( btn,val);
 event.preventDefault();
 event.stopPropagation();
 
}

function startDraw( event ){
 event.preventDefault();
 event.stopPropagation();
   if( solved ) return;
 var btn = $("#m"+event.which);
 var val = btn.attr( "abbr" );
 dragButton=event.which;
 applyValue( jQuery( event.target ),val);
 event.preventDefault();
 event.stopPropagation();
 return false; 
}
function continueDraw( event ){
   if( solved ) return;
  if( dragButton==-1 ){
    return;
  }  
 var btn = $("#m"+dragButton);
 var val = btn.attr( "abbr" );
 
 applyValue( jQuery( event.target ),val);
 return false;
}

function stopDraw( event ){
  var tgt = event.relatedTarget;
  if( tgt==null || tgt.id.substring(0,2)!='b_' ){
    dragButton=-1;
    validatePuzzle();
  }
 return false;  
}

function buttonUp( event ){
    dragButton=-1;
    validatePuzzle();
}

function validatePuzzle(){
   if( solved ) return;
   var good = true;

   for(  row =0 ; row<pheight ; row=row+1 ){
      var rowcode = "";
      var lastC = '0';
      var count = '0';
      for(col=0 ; col<pwidth;col=col+1 ){
        var c = $("#b_"+col+"_"+row ).attr("abbr");
        if( c=='n' )c='0';
        if( c==lastC ){
          count++;
        }else{
          if( lastC!='0' ){
            rowcode = rowcode+lastC+":"+count+",";
          }
          lastC=c;
          count=1;
        }
      }
      if( lastC!='0' ){
         rowcode = rowcode+lastC+":"+count+",";
      }
      if( leftCodes[row]==rowcode ){
        $( "#ls_"+row ).addClass("greenbg" );
      }else{
      	$( "#ls_"+row ).removeClass("greenbg" );
		good = false;
      }
   }

   for(  col =0 ; col<pwidth ; col=col+1 ){
      var rowcode = "";
      var lastC = '0';
      var count = '0';
      for(row=0 ; row<pheight;row=row+1 ){
        var c = $("#b_"+col+"_"+row ).attr("abbr");
        if( c=='n' )c='0';
        if( c==lastC ){
          count++;
        }else{
          if( lastC!='0' ){
            rowcode = rowcode+lastC+":"+count+",";
          }
          lastC=c;
          count=1;
        }
      }
 
      if( lastC!='0' ){
         rowcode = rowcode+lastC+":"+count+",";
      }
      if( topCodes[col]==rowcode ){
        $( "#ts_"+col ).addClass("greenbg" );
      }else{
      	$( "#ts_"+col ).removeClass("greenbg" );
		good = false;
      }
   }
	if( good ){
	   solved = true;
   	   if(timerID) {
      	clearInterval(timerID);
      	timerID  = 0;
   		}
   		updateTimer();
   		var result="";
   		for(  col =0 ; col<pwidth ; col=col+1 ){
      	for(row=0 ; row<pheight;row=row+1 ){
          var c = $("#b_"+col+"_"+row ).attr("abbr");
          if( c=='n' ){
            applyValue( $("#b_"+col+"_"+row ),"0");
            c="0";
          }
          result=result+c;	   
	    }
	   }
	   $("#puzzletable").addClass( "solved" );
	   notifySolved(result);
	}
}

function doNothing(){
  return false;
} 

$(document).ready(function(){
  dragButton = -1;
  tStart   = new Date();

  $("#leftHeader td").bind("mousedown",  selectColor );
  $("#topHeader td").bind("mousedown",  selectColor );
  $("#palette td").bind("mousedown",  selectColor );
  $("#puzzBody td").bind("mousedown",  startDraw );
  $("#puzzBody td").bind("mousemove",  continueDraw );
  $("#puzzBody td").bind("mouseup",  buttonUp );
  $("#puzzBody td").bind("mouseout",  stopDraw );
 

  timerID = setInterval("updateTimer()", 1000); 
}) 
