
// CLASS ZangShui : Zangerland Client interface and data
function ZangShui(zangServerUrl){
 this.zangClient=new ZangClient(zangServerUrl);
 var self=this;
 setEventHandler(window,'load',function(){self.initialize()});
 this.character=[];
 this.room=[];
 this.roomitems=[];
 this.mobs=[];
 this.inventory=[];
}

ZangShui.prototype={

// METHOD ZangClient.initialize : Execute initialization cod on window.onload
 initialize:function(){
  var self=this;
  
  var callbacks={
   say:{window:"chat",style:"say"}
  ,bellow:{window:"chat",style:"bellow"}
  ,tell:{window:"chat",style:"tell"}
  ,emote:{window:"chat",style:"emote"}
  };
  for(c in callbacks){
   this.zangClient.registerEventListener(c,function(response){
    writeToWindow(callbacks[response['message_type']].window,callbacks[response['message_type']].style,response['message']);
   });
  }
  this.zangClient.registerEventListener('timetic',function(response){
    var gdayspergweek=13;
    var ghoursperrday=(32*gdayspergweek)/24;
    var ghourspergday=32;

//    response['msgtime']=response['msgtime']*30;
    var ghourtime=response['msgtime']/(1000*60*60)*ghoursperrday;
    var gsec=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)*60*60))%60;
    var gmin=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)*60))%60;
    var ghour=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)*1))%ghourspergday;
    var gweekday=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)/ghourspergday))%gdayspergweek+1;
    var gmonthday=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)/ghourspergday))%32+1;
    var gday=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)/ghourspergday))%330+1;
    var gmonth=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)/ghourspergday/33))%13+1;
    var gyear=Math.floor(((response['msgtime']/(1000*60*60)*ghoursperrday)/(ghourspergday*330)))+5400;

    var daytimeDom=document.getElementById("daytime");
    daytimeDom.innerHTML='';
//    daytimeDom.style.backgroundColor=daytimecolors[ghour-1];
    var sunclockDom=document.getElementById("sunclock");
    sunclockDom.style.backgroundPosition = "0px "+(Math.round((32-ghour+15)/ghourspergday*16)%16*30)+"px";		
    
    var timestring='';
    timestring+="date: "+gmonthday+"/"+gmonth+"/"+gyear;
    timestring+=" day of "+weekdays[gweekday-1];
    timestring+=" time: "+(""+ghour).lpad(2,'0')+":"+(""+gmin).lpad(2,'0');
    writeToWindow('daytime','roomtitle',timestring);
  });  
  this.zangClient.registerEventListener('charenter',function(response){
   writeToWindow('log','playermove',response.message);
  });
  this.zangClient.registerEventListener('charleave',function(response){
   writeToWindow('log','playermove',response.message);
  });
  this.zangClient.registerEventListener('refreshclient',function(response){
   window.location.reload(true);
  });
  this.zangClient.registerEventListener('refreshcharacter',function(response){self.doRefreshCharacter(response)});
  this.zangClient.registerEventListener('refreshroom',function(response){self.doRefreshRoom(response)});
  this.zangClient.registerEventListener('refreshmobs',function(response){self.doRefreshMobs(response)});
  this.zangClient.registerEventListener('refreshroomitems',function(response){self.doRefreshRoomItems(response)});
  this.zangClient.registerEventListener('refreshinventory',function(response){self.doRefreshInventory(response)});
  this.refresh();
  setEventHandler(document,"keydown",function(e){self.doKeyShortcuts(e)});
 },

 doKeyShortcuts:function(e){
  switch(e.keyCode){
  case 36:this.move('nw');break;
  case 38:this.move('n');break;
  case 33:this.move('ne');break;
  case 37:this.move('w');break;
  case 39:this.move('e');break;
  case 35:this.move('sw');break;
  case 40:this.move('s');break;
  case 34:this.move('se');break;
  }
 },

 doRefreshCharacter:function(response){
  this.character=response.character;
  document.title=this.character.name;
 },
 doRefreshRoom:function(response){
//  writeToWindow('env','roomtitle',response.room.name+' ('+response.room.x+'/'+response.room.y+'/'+response.room.z+')');
//  writeToWindow('env','roomdesc',response.room.description);
  minimapDom=document.getElementById('minimap');
  minimapDom.src="minimap.php?anticache="+parseInt(Math.random()*99999999);
  for(var i=0;i < dirs.length;i++){
   var dirbtnDom=document.getElementById(dirs[i]);
   dirbtnDom.disabled=(response.room[dirs[i]]==0);
  }
 },
 doRefreshMobs:function(response){
  var mobs=response.mobs;
  document.getElementById('mobs').innerHTML='';
  for(var i=0;i < mobs.length;i++)if(mobs[i].char_id!=this.character.char_id){
   writeToWindow('mobs','playermove',mobs[i].name+' is here.');
  }
 },
 doRefreshRoomItems:function(response){
  this.roomitems=response.roomitems;
  document.getElementById('items').innerHTML='';
  for(var i=0;i < this.roomitems.length;i++){
   writeToWindow('items','playermove'
   ,'You see a <a href="#" onclick="zangShui.get(\''+this.roomitems[i].label+'\');false;" style="cursor:hand;">'+this.roomitems[i].label+'</a> here.');
  }
 },
 doRefreshInventory:function(response){
  this.inventory=response.inventory;
  document.getElementById('inventory').innerHTML='';
  for(var i=0;i < this.inventory.length;i++){
   writeToWindow('inventory','playermove'
   ,'You have a <a href="#" onclick="zangShui.drop(\''+this.inventory[i].label+'\');false">'+this.inventory[i].label+'</a>.');
  }
 },
 

 refresh:function(){
  this.zangClient.sendCommandToServer('refresh');
 },
 move:function(direction){
  writeToWindow('log','system',' You set off to the '+direction+'');
  this.zangClient.sendCommandToServer('move '+direction);
 },
 say:function(message){
  this.zangClient.sendCommandToServer(escape('say '+message));
  writeToWindow('chat','yousay','You say "'+message+'"');
 },
 tell:function(target,message){
  this.zangClient.sendCommandToServer(escape('tell '+target+' '+message));
  writeToWindow('chat','youtell','You tell '+target+' "'+message+'"');
 },
 bellow:function(message){
  this.zangClient.sendCommandToServer(escape('bellow '+message));
  writeToWindow('chat','youbellow','You bellow "'+message+'"');
 },
 laugh:function(message){
  this.zangClient.sendCommandToServer(escape('emote laugh'));
  writeToWindow('chat','yousay','You bellow out an echoing laugh.');
 },
 setchar:function(char_id){
  this.zangClient.sendCommandToServer(escape('setchar '+char_id));
  writeToWindow('log','system',' Setting character id to "'+char_id+'"');
  this.refresh();
 },
 look:function(target){
//  alert(this.roomitems.length);
  re=new RegExp("^"+target+".*","i");
  var found=false;
  for(var i=0;i < this.roomitems.length;i++){
//   alert(this.roomitems[i].label.match(re));
   if(this.roomitems[i].label.match(re)){
    writeToWindow('chat','youtell','You look at '+this.roomitems[i].label+' and see '+this.roomitems[i].description);
    found=true;
    break
   }
  }
  if(!found)
   writeToWindow('chat','youtell','You don\'t see that here.');
//  alert('u look');
 },
 get:function(message){
  this.zangClient.sendCommandToServer(escape('get '+message));
  writeToWindow('chat','youget','You get "'+message+'"');
 },
 drop:function(message){
  this.zangClient.sendCommandToServer(escape('drop '+message));
  writeToWindow('chat','youdrop','You drop "'+message+'"');
 }

}