/*
0:demo
1:heavy
2:medic
3:pyro
4:scout
5:sniper
6:soldier
7:spy
8:engie - :( poor engie. always last
*/

/*
0:primary
1:secondary
2:melee
3:PDA
4:misc
*/

/*
3.5714% chance every 4 hours 20 minutes for hat
20% chance every 25 minutes for item
*/

Array.prototype.random=function(){
 return this[Math.floor(Math.random()*this.length)]
}

var hatnames=[
 ["Demoman's Fro","Glengarry Bonnet","Scotsman's Stovepipe","Hustler's Hallmark","Tippler's Tricorne"],
 ["Tough Guy's Toque","Officer's Ushanka","Football Helmet","The Hound Dog","The Heavy Duty Rag"],
 ["Prussian Pickelhaube","Vintage Tyrolean","Otolaryngologist's Mirror","Physician's Procedure Mask","Gentleman's Gatsby","Ze Goggles"],
 ["Brigade Helmet","Respectless Rubber Glove","Pyro's Beanie","Triboniophorus Tyrannus","Whiskered Gentleman","Vintage Merryweather"],
 ["Baseball Bill's Sports Shine","Bonk Helmet","Batter's Helmet","Ye Olde Baker Boy","Troublemaker's Tossle Cap","Whoopee Cap"],
 ["Master's Yellow Belt","Ritzy Rick's Hair Fixative","Professional's Panama","Trophy Belt","Shooter's Sola Topi","Bloke's Bucket Hat"],
 ["Soldier's Stash","Stainless Pot","Tyrant's Helm","Killer's Kabuto","Sergeant's Drill Hat"],
 ["Backbiter's Billycock","Fancy Fedora","Magistrate's Mullet","Camera Beard","Frenchman's Beret"],
 ["Texas Ten Gallon","Texas Slim's Dome Shine","Engineer's Cap","Mining Light","Hotrod","Safe'N'Sound"],
 ["Modest Pile of Hat","Noble Amassment of Hats","Towering Pillar of Hats"]
];

var itemnames=[
 ['Scottish Resistance','Chargin Targe','Eyelander',"The Scotsman's Skullcutter"],
 ['Killing Gloves of Boxing','Sandvich','Natascha',"The Dalokohs Bar"],
 ['Blutsauger','Kritzkrieg','Ubersaw'],
 ['Axtinguisher','Backburner','Flare Gun',"The Homewrecker"],
 ['Force-a-Nature','Bonk! Atomic Punch','Sandman','Crit-a-cola'],
 ['Huntsman','Razorback','Jarate!',"The Tribalman's Shiv"],
 ['Buff Banner','Direct Hit','Equalizer','Gunboats'],
 ['Ambassador','Cloak and Dagger','Dead Ringer'],
 ['Frontier Justice','The Wrangler','The Southern Hospitality','The Golden Wrench','Gunslinger'],
 ["The Wrinklefucker","The Pain Train"]
];
 

var items=[
 [['0_0','0_1'],[],['0_2','0_3']],
 [['1_2'],['1_1','1_3'],['1_0']],
 [['2_0'],['2_1'],['2_2']],
 [['3_1'],['3_2'],['3_0','3_3']],
 [['4_0'],['4_1','4_3'],['4_2']],
 [['5_0'],['5_1','5_2'],['5_3']],
 [['6_1'],['6_0','6_3'],['6_2']],
 [[],['7_0'],[],['7_1','7_2']],
 [['8_0'],['8_1'],['8_2','8_4']], //engie
 [[],[],['9_1']]
];

var craftnames=[
 ['Scrap Metal','Reclaimed Metal','Refined Metal'],
 ['Demo Token','Heavy Token','Medic Token','Pyro Token','Scout Token','Sniper Token','Soldier Token','Spy Token','Engineer Token'],
 ['Primary Weapon Token','Secondary Weapon Token','Melee Weapon Token','PDA2 Token']
];

function $(a){
 return document.getElementById(a)
}

var game=new function(){
 var me=this;
 var score=0
 me.pause=function(){
  var win=new JAX.window;
  win.title="Game Paused"
  win.useoverlay=true
  win.content="<a class='button' href='#' onclick='JAX.window.close(this);game.unpause()'>Unpause!</a><br /><br />&nbsp;"
  win.create()
  clearInterval(me.interval)
 }
 me.unpause=function(){
  if(!me.gameover) me.interval=setInterval(me.timer,me.difficulty)
 }
 me.start=function(difficulty){
  var x;
  this.difficulty=difficulty
  me.backpackLength=100
  me.w=0
  me.bp=$('backpack').getElementsByTagName('div')
  me.interval=setInterval(me.timer,difficulty);
  me.seconds=0;
  me.hatssingular=[]
  me.itemssingular=[]

  ;(new JAX.drag).drops(me.bp).addListener({
   ondrop:function(a){
    b=a.droptarget;
    a=a.el;
    if(b&&b!=a){
     if(a.className.match('selected')) game.select(a)
     tmp=[a.innerHTML,a.type,a.src];
     a.innerHTML=b.innerHTML;a.src=b.src;a.type=b.type;
     b.innerHTML=tmp[0];b.type=tmp[1];b.src=tmp[2];
    } else game.select(a);
    a.style.top=a.style.left='0px';
   }}).apply(me.bp);

  for(x=0;x<me.backpackLength;x++) me.bp[x].onmouseover=me.showDescription;

  for(x=0;x<hatnames.length;x++) for(var y=0;y<hatnames[x].length;y++) me.hatssingular.push(x+'_'+y)

  for(x=0;x<items.length;x++) for(y=0;y<items[x].length;y++) for(var z=0;z<items[x][y].length;z++) if(items[x][y][z]) me.itemssingular.push(items[x][y][z])
 }
 me.timer=function(){
  me.seconds++
  if(Math.random()<.2) insertItem('item',me.getrandomitem())
  if(me.seconds%10==0&&Math.random()<.035714) {insertItem('hat',me.getrandomhat());me.score(500);}
  var secs=me.seconds*25
  $('time').innerHTML=Math.floor(secs/60)+":"+secs%60;
 }
 me.submitScore=function(name){;(new JAX.ajax).load('?',me.submitCallback,"score="+score+"&rand="+(score-928472)+"&name="+escape(name)+"&hash="+me.seconds+"&w="+me.w,1);}
 me.submitCallback=function(){alert("Score successfully submitted.");}
 me.getrandomitem=function(){return me.itemssingular.random();}
 me.getrandomhat=function(klass){
  return klass!=undefined?klass+'_'+Math.floor(hatnames[klass].length*Math.random()):me.hatssingular.random();
 }
 me.getHatInfo=function(a){return {klass:a.split('_').shift()};}
 me.getCraftInfo=function(a){
  r={klass:' ',position:' '};
  a=a.split('_');
  switch(a[0]){
   case '0':
    r.klass='-'
   case '2':
    r.position=a[1];
   break;
   case '1':
    r.klass=a[1];
   break;
  }
  return r;
 }
 me.getItemInfo=function(a){
  if(a=="9_0") return {position:0,klass:9}
  var code=a.split('_').shift(),x,y;
  for(x=0;x<items[code].length;x++) for(y=0;y<items[code][x].length;y++) if(items[code][x][y]==a) return {position:x,klass:code};
 }
 var insertItem=function(type,src){
  for(var x=0;x<me.backpackLength;x++) if(me.bp[x].innerHTML=='') {
   me.bp[x].type=type;me.bp[x].src=src;
   return me.bp[x].innerHTML='<img src="http://seanj.jcink.com/craft/'+type+'s/'+src+'.png" />'
  }
  me.gameover=true
  clearInterval(me.interval)
  var win=new JAX.window
  win.useoverlay=true
  win.title="YOU LOSE!"
  win.content="<div class='finalscore'>Final Score: <span class='score'>"+score+"</span></div><br /><br /><form onsubmit='JAX.window.close(this);return false;'>Your name: <input type='text' name='name' maxlength='100' /><br /><br /><br /><input type='submit' class='button' value='Submit Score' onclick='game.submitScore(this.form.name.value)' /> <input type='submit' class='button delete' value='Dont Submit' />"
  win.create()
 }
 me.select=function(t){
  if(!t.innerHTML) return;
  t.className=t.className.match('selected')?t.className.replace(' selected',''):t.className+' selected'
 }
 me.showDescription=function(){
  if(!this.src) return $('description').innerHTML='&nbsp;'
  var coords=this.src.split("_"),type=this.type
  $('description').innerHTML=(type=='hat'?hatnames[coords[0]][coords[1]]:(type=='craft'?craftnames[coords[0]][coords[1]]:itemnames[coords[0]][coords[1]]))
 }
 me.craft=function(){
  var selected=me.getSelected(),x,l=selected.length,
      classes=[],classes2=[],
      positions=[],positions2=[],
      types=[],types2=[],
	  codes=[],
      el,info;
  for(x=0;x<l;x++) {
   el=selected[x];
   codes.push(el.type.charAt(0)+el.code)
   switch(el.type){
    case "hat":
     positions.push(' ')
     classes.push(me.getHatInfo(el.code).klass)
    break;
    case "item":
     info=me.getItemInfo(el.code);
     positions.push(info.position)
     classes.push(info.klass)
    break;
    case "craft":
     info=me.getCraftInfo(el.code)
     positions.push(info.position)
     classes.push(info.klass)
    break;
   }
   types.push(el.type.charAt(0))
  }
  classes=classes.sort();positions=positions.sort();types=types.sort();codes=codes.sort().join(',');
  for(x=0;x<classes.length;x++){
   if(classes2[classes2.length-1]!=classes[x]) classes2.push(classes[x])
   if(positions2[positions2.length-1]!=positions[x]) positions2.push(positions[x])
   if(types2[types2.length-1]!=types[x]) types2.push(types[x])
  }
  classes=classes.join('');positions=positions.join('');types=types.join('');
  classes2=classes2.join('');positions2=positions2.join('');types2=types2.join('');
  el=false;
  switch(l){
   case 2:
    //random hat
    if(types2=='h') {
     el=['hat',me.getrandomhat(),100]
     while(el[1]==selected[0].code||el[1]==selected[1].code) el[1]=me.getrandomhat() //credit goes to Murre for pointing this out in the update news
    }
    //another class token
    if(types2=='ci'&&classes2.match(/^\d\d$/)) el=['craft','1_'+me.getItemInfo(selected[0].type=='craft'?selected[1].code:selected[0].code).klass,1]
    //nasty fix for pain train
    if(el[1]=='1_9') el[1]='1_6'
    //another slot token
    if(types2=='ci'&&classes2.match(/^ \d$/)) {
     //fixed "undefined" token when crafting with camera beard, thanks Imnotbanned
     var pos=me.getItemInfo(selected[0].type=='craft'?selected[1].code:selected[0].code).position
     if(pos<4) el=['craft','2_'+pos,1]
    }
    //scrap metal
    if(types2=='i'&&classes2.length==1) el=['craft','0_0',10];
	
    //???
    if(types2=='i'&&classes2=='16'&&positions2=='2') el=['item','9_0',0]
    //crit-a-cola
    if(codes=='i2_1,i4_1') el=['item','4_3',10]
    //dalokohs bar
    if(codes=='i1_1,i4_1') el=['item','1_3',10]
    //gunboats
    if(codes=='i0_1,i5_1') el=['item','6_3',10]
    //homewrecker
    if(codes=='i0_2,i6_2') el=['item','3_3',10]
    //paintrain
    if(codes=='c0_0,i4_2'&&classes2=='-4') el=['item','9_1',10]
    //skullcutter
    if(codes=='i3_0,i5_2') el=['item','0_3',10]
    //shiv
    if(codes=='i5_0,i7_2') el=['item','5_3',10]
    //southern hospitality
    if(codes=='c0_0,i7_0') el=['item','8_2',10]
   break;
   case 3:
    //reclaimed metal
    if(types2=='c'&&((positions2=='0'&&classes2=='-')||positions2==' ')) el=['craft','0_1',20]

    //refined metal
    if(types2=='c'&&positions2=='1'&&classes2=='-') el=['craft','0_2',30]

    //hat!
    if(types2=='c'&&positions2=='2'&&classes2=='-') el=['hat',me.getrandomhat(),1000]

    //weapon token
    if(types2=='i'&&positions2.length==1) el=['craft','2_'+positions2,40]

    //class token -- updated with pain train fix
    if(types2=='i'&&classes2.length==1) el=['craft','1_'+(classes2==9?6:classes2),40]
	
    //bonk helm
    if(codes=='h4_2,i4_1,i4_1') el=['hat','4_1',10]

    if(types2=='c'&&classes2.length==3) el=['craft','0_1',20]

    //craft specific weapon
    if(types2=='c'&&(x=classes2.match(/ -(\d)/))&&positions2.match(/ 0(\d)/)&&items[x[1]][RegExp.$1].length) el=['item',items[x[1]][RegExp.$1].random(),60]
   break;
   case 5:

    //class specific hat
    if(types2=='c'&&classes.match(/^\-\-\-\-\d$/)&&positions2==' 2') el=['hat',me.getrandomhat(parseFloat(classes2.replace('-',''))),1500]
   break;
  }
  if(!me.w&&Math.floor(Math.random()*10000)==0) {el=['item','8_3',50000];me.w=1;}
  if(el) {
   me.score(el[2])
   me.deleteSelected();
   insertItem(el[0],el[1])
  }
 }
 me.score=function(a){
  score+=a
  $('score').innerHTML=score
 }
 me.getSelected=function(){
  var r=[],x;
  for(x=0;x<me.backpackLength;x++) if(me.bp[x].className.match(' selected')) {
   r.push({position:x,type:me.bp[x].type,code:me.bp[x].src.split('/').pop()})
  }
  return r;
 }
 me.deleteSelected=function(takeoffpoints){
  var s=me.getSelected(),l=s.length,el,score=0;
  for(var x=0;x<l;x++) {
   if(takeoffpoints) score-=100;
   el=me.bp[s[x].position];
   me.select(el)
   el.type=el.src=el.innerHTML='';
  }
  if(takeoffpoints) me.score(score);
 }
}