// Copyright 2005 David Caldwell <david@porkrind.org> -*- c -*-
// Copyright 2005 Jim Radford <radford@blackbean.org>
var level_string=document.URL.split('?')[1];if(level_string==undefined)
level_string="1,3:5:3:5:2,1:1_1,3:5:3:4:2,2:1";var levels=[{name:"bat",data:"1,3:5:3:5:2,1:1_1,3:5:3:4:2,2:1"},{name:"balloon?",data:"2:4:1,4:4,1:2,1:1_3:2,2:5:3:1,1:3"},{name:"Penguin?",data:"1,2:2,1,1:1,5:6:2,1:1_2:2,1:2:4:1,4:1,2:4"},{name:"key",data:"1:4:2,1:3:1:1:1:3:2,2:3_1:3:8,1:3,3:1,1,1:2"},{name:"syringe",data:"1:1:4:1,1:1,1:1,1:1,1:2,2:2:4_1:6,1:3,2:1,2:6,1:1"},{name:"Flower from the Netherlands",data:"3,3:3,2:9:3,1:3,1:2_1,1,1:5:5:3:1:1,1:1,1,2:1,2:3:1"},{name:"Cereal bowl?",data:"4:2:1,2:1,1:1:1,1:1:1,1,2:2:4_1,1,1:1,1,1,1:1,1,1:2,1,2:2,2:6"},{name:"Mushroom",data:"3,2:1,2,1,1:1,2,2,1:5,1:2,4:3_2:1,2:1,4:4,1:2,3:1,1:1,1:1,1:1,1:3"},{name:"Dog",data:"2:3:1,2:5:2:1_1:2:1,3:4:3:1,1"},{name:"Lighter",data:"2:3:3:6:1,1:2,1,1:1,2,1:2,5_1:2,1,1:3,1,1:3,1:6:1,1:1,1:1,1:5"},{name:"House",data:"1:5:2,1:2,3:2,1,1:5:1_1:3:2,2:2,2:5:1,1,1:1,3"},{name:"Plug",data:"1,1,1:1,1,2:5,1:1,1,1:1,1,2:3,1:1,1:6_3:3,1:1,3:3,1,1:3,1:1:4,1:2,4"},{name:"Elvis/Face",data:"2:2,2:5,3:2,1,1:2,1:7,1:4,1:7:2_7:8:1,3:2,3:1,1,1:1,1,2:2,1,2:1,1:5"},{name:"Pitcher",data:"2,4,1:1,1,3:4,2:1,1:4,2:1,1,3:6,1:2,1:1,1:3_6:1,1,1,2:1,1,2,1:2,3,1:1,1,1:1,1,1:1,2:2,2:2,2:7"},{name:"Dog",data:"2:2:3:8,1:8:4,1:5:4:1,3:4_1:1:3:5:6,1:4,1:5,1:7:1,4:6"},{name:"Cupid's arrow",data:"3:1,1:1,1:1,1,1:1,1,1:1,2:3:1:3:1,1_2,2:1,1,1:1,1,2:1,6:1,1,2:3"},{name:"High Heeled Shoe",data:"2:1,1:2,1:3,2:2,2:1,2:1,1:1,5:8_3:1,1:2,1:1,1:2,3:1,1,2:1,2,2:1,2,2:4,2"},{name:"??? bombomb?",data:"9:9:9:6,1:5,1,1:4,1,1:3,1,1:2,1,2:2,2:5_1:8:9:7,2:6,1:5,1,1:4,1,1:3,1,1,2:3,2:7"},{name:"Church",data:"4:2:2,1:2:2,1:6:1,3:5,3:1,3:6_1:3:1:3:5:6,2:6,1:1,1,1,1:1,1,2,1,1:1,1,1,1"},{name:"Fish",data:"4,3:5,4:3,3:1,1,1:1,1:2,2:3,1,3:4,4:1,3,4:2,6_2,6:3,3,1:4,4:3,2:1,1,2:1:1,3:3,4:4,5:3,6"},{name:"Runner",data:"3,1:1,3:1,1,2:7:7:1,2:1,1:3,1:1:2_2:1,3:1,2:8:2,1:2,1:4,2:2,3,1:1:2"},{name:"Cat",data:"1,2:4,1,1:3,6:7:3,6:4,4:1,3:2:3,1:2,3_1,1:2,2:5:2,1,2,1:5,2:3,1:6,2:1,5,1:8:2,4"},{name:"Mailbox",data:"4:1,1:1,1,1:1,1:2,1:1,3,6:6,1:2,1,1:2,1,1:5_3:3:1:7:1,1,1,1:1,2,1:1,1,1,1:1,1,1:5,4:1:1:1:1:1:1"},{name:"Dog doing \"shake\"",data:"4:1,3:4:5:4,1:1,7:7,1:3,1:2,1:2,2_2:2:4:1,5:1,3:1,7:1,5,1:6:3,1:6"},{name:"Apple",data:"7:9:9:7:8:1,1,2:1,2,1:1,2:2,2:6_1:2,1,2:3,1,1,2:6,1:5,1:5,1,1:5,1,1:5,2:6,2:3,3"},{name:"pin-wheel",data:"5,1:4,2:3,1,1:3,1:4,4:1,3:1,1,3:2,4:1,5_1,5:2,1,1:3,1,1:6:4,4:6:1,1,3:1,1,2:5,1"},{name:"Bread",data:"4:2,2:2,9:1,1:1,1:1,1:1,1:1,1:1,1:2,9:3,2,1:7,1:7,1:14:4_11:2,5:2,5:1,4:1,4:2,5:2,5:1,1,1:1,1,1:1,1,1:1,1,1:1,1,1:1,1,1:1,1,1:12"},{name:"Pumpkin",data:"8:10:3,4:2,3:1,2:1,9:1,3,5:2,2,3:4,2:1,2:3,2:1,9:1,3:1,5:9_2:2:1:4,2,3:3,5,1:3,1,1,1:2,2,1,1:2,1,1,1:2,1,1,1:2,2,1,1:2,2,1,2:3,2,1,2:4,3,5:14:4,3,3"},{name:"trick?",data:"5:2,1:1,1:1,1:1,1:1,1:1,1:8:12,1:12,2:4,22:3,2,3,3,2,9:3,4,3,3,7:2,1,1,1,1,4,5,1:1,2,3,13,1:2,1,2,9,7:5,4,9:22:4,6,2:4,6,1:3,6:3,4:4,3:3,5:3,1,1:1,1,2,1:1,1,1,4:1,2,9:3,10:11_5:4,2:3,1:1,2,1:1,1,1:1,1:5,7:1,1,7,1:16,2:5,8,3:4,2,4:3,1,2:2,3,3,1,1:2,9,4,6:1,14,7,3:1,9,7,3:11,2,7,4:5,2,5,7:9,4,4:4,4,1,4:2,1,4,1,3:2,2,2,3:2,2,2,2:3,3,1:8,1:3,3:3,3:3,3:4,4:5,5"},{name:"Bulldog",data:"13,5:3,6,3:2,5,2:2,9:2,2,2:3,3,6:2,1,2,2,1,2,5:1,2,1,6,1,3:2,6,2,4,4:1,1,1,2,1,1,4:4,1,1,3,4:3,6,1,1,1,4:1,4,1,1,3,4:1,1,1,2,1,1,4:2,6,1,3,4:2,1,1,2,2,1,4:1,2,3,4,3:4,1,2,1,5:1,6:2,4,1:5,1,1,2:2,13,2:2,10,3:2,5,4:3,6,6:13,6,3:19,2:16:16:17,1_8,2,12:7,1,11:2,1,1,1,6:1,1,1,5:1,2,3,3,2,5:1,1,2,2,2,5:4,3,9:4,1,5,1,9:4,1,1,3,1,1,9:4,2,1,3,1,2,9:4,1,2,1,2,1,9:2,1,1,1,3,1,1,2,6:1,2,2,2,1,3,5:5,3,1,2,4:3,7,4:1,2,2,2,1,4:5,3,4,1,1:1,1,5,2,1,1:4,5,2:1,9,1,1:2,1,1,1,2,1:9,1:1:1,1,1:1,1,1:1,2,2,2:1,12,4:2,12,5:3,8,4:3,8,4,1"},];function create_level_list(){var url=document.URL.match(/^([^?]*)(\?.*)?$/)[1];print("url="+url+"\n");var span=document.getElementById("levels");var ul=document.createElement("ul");for(var i in levels){var li=document.createElement("li");var a=document.createElement("a");a.href=url+"?"+levels[i].data;a.appendChild(document.createTextNode(levels[i].name));li.appendChild(a);ul.appendChild(li);}
span.appendChild(ul);}
create_level_list();function level(level_string){print("level_string=\""+level_string+"\"\n");var _=level_string.split("_");this.col=_[0].split(":");this.row=_[1].split(":");this.col_max=0;this.row_max=0;var col_sum=0;for(var i in this.col){this.col[i]=this.col[i].split(",");this.col_max=Math.max(this.col_max,this.col[i].length);for(var j in this.col[i])
col_sum+=this.col[i][j]=Number(this.col[i][j]);}
var row_sum=0;for(var i in this.row){this.row[i]=this.row[i].split(",");this.row_max=Math.max(this.row_max,this.row[i].length);for(var j in this.row[i])
row_sum+=this.row[i][j]=Number(this.row[i][j]);}
if(col_sum!=row_sum)
alert("Bad sums: "+row_sum+"(row) != "+col_sum+"(col)");this.grid=new Array(this.col.length);for(var i=0;i<this.col.length;i++)
this.grid[i]=new Array(this.row.length);this.undo=new Array();}
level.prototype.create_board=function(div){var me=this;this.table=document.createElement("table");var tbody=document.createElement("tbody");this.table.cellSpacing=0;this.table.style.cursor="crosshair";this.cell=new Array();for(var x=0;x<this.col.length+this.row_max;x++)
this.cell[x]=new Array(this.row.length+this.col_max);for(var y=-this.col_max;y<this.row.length;y++){var tr=document.createElement("tr");for(var x=-this.row_max;x<this.col.length;x++){var td=document.createElement("td");this.cell[x+this.row_max][y+this.col_max]=td;td.style.border="solid";td.style.borderWidth=1;td.style.borderTop="none";td.style.borderLeft="none";if((x+1)%5==0)
td.style.borderRightWidth=3;if((y+1)%5==0)
td.style.borderBottomWidth=3;if(x<0&&y<0){td.bgColor="#555555";}else if(x<0||y<0){td.bgColor="#999999";}else
this.update(x,y);td.style.borderColor="#555555";td.align="center";var s=".";if(x<0&&y>=0&&this.row[y][x+this.row[y].length]!=undefined)
s=this.row[y][x+this.row[y].length];if(y<0&&x>=0&&this.col[x][y+this.col[x].length]!=undefined)
s=this.col[x][y+this.col[x].length];if(s==".")
td.style.color=td.bgColor;td.appendChild(document.createTextNode(s));tr.appendChild(td);if(x>=0&&y>=0)
this.install_handers(td,x,y);}
tbody.appendChild(tr);}
this.table.appendChild(tbody);div.appendChild(this.table);var w=-1;for(var x in this.cell)
for(var y in this.cell[x])
w=Math.max(w,Math.max(this.cell[x][y].width,this.cell[x][y].height));print("w="+w+"\n");var size=Math.max(this.cell.length,this.cell[0].length)>=20?20:35;for(var x in this.cell)
for(var y in this.cell[x])
this.cell[x][y].style.width=this.cell[x][y].style.height=px(size);}
level.prototype.install_handers=function(td,x,y){var _this=this;td.onmouseover=function(event){if(_this.dragging_x!=undefined&&_this.dragging_y!=undefined){_this.grid[x][y]=_this.grid[_this.dragging_x][_this.dragging_y];_this.update(x,y);}
return false;}
td.onmouseup=function(event){_this.dragging_x=_this.dragging_y=undefined;_this.won()&&print("you've won!!!\n");return false;}
td.onmousedown=function(event){_this.push_state();_this.grid[x][y]={undefined:1,1:0,0:undefined}[_this.grid[x][y]];_this.update(x,y);_this.dragging_x=x;_this.dragging_y=y;_this.old_onmouseup=document.onmouseup;document.onmouseup=function(){if(_this.dragging_x!=undefined&&_this.dragging_x!=undefined)
_this.pop_state();_this.dragging_x=_this.dragging_y=undefined;document.onmouseup=_this.old_onmouseup;};return false;}}
level.prototype.update=function(x,y){var td=this.cell[x+this.row_max][y+this.col_max];td.bgColor=td.style.color={undefined:"#888888",0:"#ffffff",1:"#000000"}[this.grid[x][y]];}
level.prototype.update_all=function(){for(var y=0;y<this.grid[0].length;y++)
for(var x=0;x<this.grid.length;x++)
this.update(x,y);}
level.prototype.push_state=function(){var current=this.grid.concat();for(var x=0;x<this.grid.length;x++)
current[x]=this.grid[x].concat();this.undo.push(current);}
level.prototype.pop_state=function(){if(this.undo.length>0){this.grid=this.undo.pop();this.update_all();}else
print("nothing to undo!\n");}
level.prototype.line_match=function(line,clumps){var re=[];for(var i=0;i<clumps.length;i++)
re.push("b{"+clumps[i]+"}");re="^w*"+re.join("w+")+"w*$";var state="";for(var i=0;i<line.length;i++)
state+={undefined:"_",1:"b",0:"w"}[line[i]];return state.match(re);}
level.prototype.won=function(){for(var y=0;y<this.grid[0].length;y++){var line=[];for(var x=0;x<this.grid.length;x++)line.push(this.grid[x][y]);if(!this.line_match(line,this.row[y]))
return false;}
for(var x=0;x<this.grid.length;x++)
if(!this.line_match(this.grid[x],this.col[x]))
return false;return true;}
on_load(function(){l=new level(level_string);var undo=document.getElementById("undo");undo.onclick=function(){l.pop_state();};l.create_board(document.getElementById("board"));});
