var specialcase = ((navigator.userAgent.indexOf('Mac') != -1) || document.all);

var down = 0;
var startX = 0;
var startY = 0;
var endX = 0;
var endY = 0;
var statesH = new Array();
var statesV = new Array();
var puzzleW = 0;
var puzzleH = 0;
var arrCells = new Array();
var helper;
var opos = new Array();
var helperpos = new Array();
var tablepos = new Array();

var lastAns = 'y';
var lastRightClick = false;
var ResizeTimeout = false;
function initPos(){
  $('#ShikakuTable td.s').each(
    function(){
			var $this = $(this);
      //alert(this.id);
      var ar = getXY(this.id);
      //var pos = $this.offset();
      
      //var pos = this.offsetLeft;
      
      //alert(pos.left + ':' + pos.top);
      if (arrCells[ar[0]] == undefined)
        arrCells[ar[0]] = new Array();
      arrCells[ar[0]][ar[1]] = {
				left: this.offsetLeft,
				top: this.offsetTop,
				right: this.offsetLeft + $this.width(),
				bottom: this.offsetTop + $this.height()
      };
    }
  );
}
function init() {

	if (!(document.getElementById || document.all || document.layers)) return;
	document.getElementById("puzzleContainer").onselectstart = new Function ("return false");
	document.onselectstart = new Function ("return false");
	document.ondragstart = new Function ("return false");
	//document.getElementById("puzzleContainer").onmousedown = d;
	//document.onmouseup = u;
	
	document.ondragstart = function() {return false};
	/*
	window.onresize = function(){
	  if (ResizeTimeout)
	    clearTimeout(ResizeTimeout);
	  ResizeTimeout = window.setTimeout("initPos()", 500);
	};
	*/
	// $('img.l').mousedown(c);
	// $('#ShikakuTable td').mousedown(d).mouseover(ov).mouseup(u);
  puzzleW = document.answerForm.w.value*1;
	puzzleH = document.answerForm.h.value*1;
  initPos();
  
  $('#puzzleContainer').mousedown(d);
  $('body').mousemove(mv);
  $('body').mouseup(u);
  document.onkeypress = kp;
  
	var sV = document.answerForm.ansV.value;
	var sH = document.answerForm.ansH.value;
  statesH = new Array();
  statesV = new Array();
  for (var i = 0; i < puzzleH; i++){
    for (var j = 0; j < puzzleW; j++){
      if (j < puzzleW - 1){
        // has vertical
        if (statesV[i] == undefined) statesV[i] = new Array();
		    n = i * (1 * puzzleW - 1) + (j * 1);
		    statesV[i][j] = sV.substr(n, 1);
      }
      if (i < puzzleH - 1){
        if (statesH[i] == undefined) statesH[i] = new Array();
        // has horizontal
		    n = n = i * puzzleW + j * 1;
		    statesH[i][j] = sH.substr(n, 1);
      }
    }
  }
  helper = $(document.createElement('div')).css({border:'1px dotted black'});
	timer();
  
}


function g(id){
  return document.getElementById(id);
}
function kp(e){
  if (down){
    var kC  = (window.event) ?    // MSIE or Firefox?
               event.keyCode : e.keyCode;
    var Esc = (window.event) ?   
              27 : e.DOM_VK_ESCAPE // MSIE : Firefox
    if(kC==Esc){
       down = 0;
       helper.remove();
    }
  }

}
function d(e){
  tablepos = $('#ShikakuTable').offset();
  
  down = 1;
  e.preventDefault();
	var rightclick = (e.which == 3 || e.ctrlKey || e.shiftKey || e.metaKey);
  lastRightClick = rightclick;
  //opos = [e.pageX, e.pageY];
  helperpos = [e.pageX, e.pageY];
  opos = [e.pageX-tablepos.left, e.pageY-tablepos.top];
	$('body').append(helper);
	// position helper (lasso)
	helper.css({
		"z-index": 100,
		"position": "absolute",
		"left": e.pageX,
		"top": e.pageY,
		"width": 0,
		"height": 0,
		"overflow": "hidden",
		"border": "1px dashed " + (rightclick ? "#CC3333" : "#000000")
	});

}
function mv(e){
  if (down){
		var x1 = helperpos[0], y1 = helperpos[1], x2 = e.pageX, y2 = e.pageY;
		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
		//alert(x1 + '-' + y1 + '-' + (x2-x1) + '-' + (y2-y1));
		helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
  }
}
function u(e){
  if (down){
    
		var x1 = opos[0], y1 = opos[1], x2 = e.pageX-tablepos.left, y2 = e.pageY-tablepos.top;
		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
		
		var endElement = false;
		var startElement = false;
    startX = startY = 100;
    endX = endY = -1;
    for (var i = 0; i < puzzleH; i++){
      for (var j = 0; j < puzzleW; j++){

    			if (!(arrCells[i][j].left > x2 || arrCells[i][j].right < x1 || arrCells[i][j].top > y2 || arrCells[i][j].bottom < y1)) {
    			  if (i < startX || j < startY){
    			    startX = i;
    			    startY = j;
    			  }
    			  if (i > endX || j > endY){
    			    endX = i;
    			    endY = j;
    			  }
    			}
        
      }
    }
    helper.remove();
    if ((startX != endX || startY != endY) && startX != 100 && endX != -1){
      if (lastRightClick){
        removeLines();
      } else {
        addLines();
      }
    }
  }
  down = 0;
}

function addLines(){
    var minX = startX;
    var maxX = endX;
    var minY = startY;
    var maxY = endY;
    //alert(minX+':'+minY+' - '+maxX+':'+maxY);
		// set the state of the boundries 
    for (var i = minX; i <= maxX; i++){
      if (minY && statesV[i][(minY-1)] != 'y') 
        setImg(g('v_'+i+'_'+(minY-1)), 'y');
      if (maxY < puzzleW-1 && statesV[i][maxY] != 'y') {
        setImg(g('v_'+i+'_'+maxY), 'y');
      }
    }
    for (var j = minY; j <= maxY; j++){
      
      if (minX && statesH[(minX - 1)][j] != 'y') 
        setImg(g('h_'+(minX - 1)+'_'+j), 'y');
      if (maxX < puzzleH-1 && statesH[maxX][j] != 'y') 
        setImg(g('h_'+maxX+'_'+j), 'y');
    }
    for (var i = minX; i <= maxX; i++){
      for (var j = minY; j <= maxY; j++){
        if (i < maxX){
          if (statesH[i][j] != 'n') setImg(g('h_'+ i +'_'+j), 'n');
        }
        if (j < maxY){
          if (statesV[i][j] != 'n') setImg(g('v_'+ i +'_'+j), 'n');
        }
      }
    }
}

function removeLines(){
    var minX = startX;
    var maxX = endX;
    var minY = startY;
    var maxY = endY;

    for (var i = minX; i <= maxX; i++){
      for (var j = minY; j <= maxY; j++){
        if (i < maxX){
          if (statesH[i][j] != 'n') setImg(g('h_'+ i +'_'+j), 'n');
        }
        if (j < maxY){
          if (statesV[i][j] != 'n') setImg(g('v_'+ i +'_'+j), 'n');
        }
      }
    }
}


function setImg(sender, ans){
	if (sender && sender.id){
		var ar = new Array();
		ar = sender.id.split('_');
		dir = ar[0];
		var i = ar[1];
		var j = ar[2];

		if (sender.src != eval(ans + dir).src){
  		sender.src = eval(ans + dir).src;
  		if (dir == 'v'){
    			var s = document.answerForm.ansV.value;
    			n = i * (1 * puzzleW - 1) + (j * 1);
    			l = s.length;
    			s = s.substr(0,n) + ans + s.substr(n + 1, l);
    			document.answerForm.ansV.value = s;
    			statesV[i][j] = ans;
  		}else{
    			var s = document.answerForm.ansH.value;
    			n = i * puzzleW + j * 1;
    			l = s.length;
    			s = s.substr(0,n) + ans + s.substr(n + 1, l);
    			document.answerForm.ansH.value = s;
    			statesH[i][j] = ans;
  		}
  	}
	}
}

function getstatus(s){
	var ar = new Array();
	ar = s.split('/');
	return ar[ar.length-1].charAt(2);
}
function getdirection(s){
	var ar = new Array();
	ar = s.split('_');
	return ar[0];
}
function getXY(s){
	var ar = new Array();
	ar = s.split('_');
	return new Array(ar[1], ar[2]);
}




var xh = new Image();
xh.src = 'shxh.gif';
var xv = new Image();
xv.src = 'shxv.gif';
var yh = new Image();
yh.src = 'shyh.gif';
var yv = new Image();
yv.src = 'shyv.gif';
var nh = new Image();
nh.src = 'shnh.gif';
var nv = new Image();
nv.src = 'shnv.gif';


