// (c)2010 Michael Holtstrom

var rules=Array();function Mod(src,val,tag,caveat)
{dbg('Mod.constructor');this.src=src;this.val=val;this.tag=tag;this.caveat=caveat;this.done=false;};function Attribute(tag,ary,stat)
{dbg('Attribute.constructor');this.tag=tag;this.ary=ary;this.base=0;this.mods=Array();this.im=0;this.obj=null;this.stat=stat;this.psh=Array();if(stat)
{var mod=new Mod(stat,stat.emin,stat.tag,'');stat.psh[stat.psh.length]=[this,mod];this.add(mod);}
this.refresh(false);};Attribute.prototype.add=function(mod)
{dbg('Attribute.add');this.mods[this.im++]=mod;this.refresh(true);};Attribute.prototype.remove=function(mod)
{dbg('Attribute.remove');for(var i=0;i<this.im;i++)
{if(this.mods[i]==mod)
{if(i==this.im-1)
{this.mods[i]=null;this.im--;}
else
{this.mods[i]=this.mods[this.im-1];this.mods[this.im-1]=null;this.im--;}
break;}}
this.refresh(true);};Attribute.prototype.refresh=function(push)
{dbgx('Attribute.refresh');this.tmax=this.tmin=this.base;for(var i=0;i<this.im;i++)
{if(this.mods[i].caveat=='')
{this.tmax+=this.mods[i].val;}
this.tmin+=this.mods[i].val;}
if(this.tmax==this.tmin)
{this.tstr=this.tmax;}
else
{this.tstr=this.tmax+'/'+this.tmin;}
if(this.ary[1]==1)
{var oldemin=this.emin;this.emax=this.tmax-10;this.emin=this.tmin-10;if((this.emax%2)!=0){this.emax--;}
if((this.emin%2)!=0){this.emin--;}
this.emax=this.emax/2;this.emin=this.emin/2;if(this.emax==this.emin)
{this.estr=util.signed(this.emax);}
else
{this.estr=util.signed(this.emax)+'/'+util.signed(this.emin);}
if(this.emin!=oldemin)
{for(var i=0;i<this.psh.length;i++)
{if(this.psh[i][0].ary[1]==1)
{err.msg('Bug. Prevent infinite loop');break;}
this.psh[i][1].val=this.emin;this.psh[i][0].refresh(true);}}}
else
{this.emax=this.tmax;this.emin=this.tmin;this.estr='';}
if(push&&this.obj!=null)
{this.obj.sleft.innerHTML=this.sleft();this.obj.sright.innerHTML=this.sright();}};Attribute.prototype.sleft=function()
{dbgx('Attribute.sleft');var s=' [';if(this.ary[0]==0&&this.im==0){s='';}
var e='';if(this.estr!=''){e='&nbsp;('+this.estr+')';}
return'<strong>'+this.tag+':&nbsp;'+this.tstr+e+'</strong>'+s;};Attribute.prototype.sright=function()
{dbgx('Attribute.sright');var c=',';var s=' ';var str='';if(this.ary[0]==1)
{if(this.im==0){c='';}
str='&nbsp;<sub>Base'+c+'</sub>';}
else{s='';}
for(var i=0;i<this.im;i++)
{this.mods[i].done=false;}
for(var i=0;i<this.im;i++)
{if(this.mods[i].done){continue;}
var val=this.mods[i].val;for(var j=i+1;j<this.im;j++)
{if(this.mods[i].tag==this.mods[j].tag&&this.mods[i].caveat==this.mods[j].caveat)
{val+=this.mods[j].val;this.mods[j].done=true;}}
c='';for(var j=i+1;j<this.im;j++)
{if(!this.mods[j].done){c=',';break;}}
str+=s+util.signed(val)+'&nbsp;<sub>'+this.mods[i].tag;if(this.mods[i].caveat!=''){str+=' ('+this.mods[i].caveat+')';}
str+=c+'</sub>';s=' ';this.mods[i].done=true;}
if(str!=''){str+=']';}
return str;};Attribute.prototype.format=function()
{dbg('Attribute.format');this.obj.sleft.innerHTML=this.sleft();this.obj.sright.innerHTML=this.sright();this.obj.txt.value=this.base;this.obj.setInl();};Attribute.prototype.validate=function()
{dbgx('Attribute.validate');var o=this.obj;var val=parseInt(o.txt.value);var trim=util.trim(o.txt.value);if(isNaN(val)||((''+val)!=trim&&('+'+val)!=trim))
{if(o.validity!='invalid')
{this.base=0;this.refresh(false);o.sleft.innerHTML=this.sleft();o.validity='invalid';o.setVstl();}}
else
{if(val!=this.base)
{this.base=val;this.refresh(false);o.sleft.innerHTML=this.sleft();}
if(o.validity!='')
{o.validity='';o.setVstl();}}};function Modifier(obj,hide)
{dbg('Modifier.constructor');this.txtval=obj.txt.value;this.obj=obj;this.isjunk=true;this.tag='';this.mods=Array();this.spnval='';this.hide=hide;var t=util.trim(obj.txt.value);var c=t.indexOf(':');var s=t.indexOf(';');this.tag=t.substr(0,c);var o=rules[this.tag.toLowerCase()];var mess=t.substr(c+1);var ary=mess.split(';');do
{if(c<3){break;}
if(s>=0&&s<c){break;}
if(o==undefined)
{for(var i=0;i<ary.length;i++)
{var good=false;var p1;var p2;var num;do
{p1=ary[i].indexOf('(');p2=ary[i].lastIndexOf(')');if(p1>=0)
{if(p1<5||p2<p1+2||p2!=ary[i].length-1){break;}
p2=ary[i].substr(p1+1,p2-p1-1);p1=ary[i].substr(0,p1);}
else
{p1=ary[i];p2='';}
p1=util.trim(p1);var t=p1.lastIndexOf(' ');var t1=util.trim(p1.substr(0,t).replace(/:/g,' '));var t2=p1.substr(t);if(t1.length<1){break;}
o=rules[t1.toLowerCase()];if(o==undefined){break;}
num=parseInt(t2);if(isNaN(num)){break;}
good=true;}
while(0);if(!good)
{ary[i]=util.trim(ary[i]);if(ary[i]!='')
{this.mods[this.mods.length]=[null,ary[i]];}}
else
{var mod=new Mod(this,num,this.tag,p2);this.mods[this.mods.length]=[o,mod];o.add(mod);this.isjunk=false;}}}}
while(0);if(!this.isjunk)
{if(this.hide)
{if(this.obj.fet==2)
{var str='<strong>Skills:</strong> ';var ttl=0;for(var i=0;i<this.mods.length;i++)
{if(this.mods[i][0]!=null)
{ttl+=this.mods[i][1].val;}}
if(ttl!=this.obj.sp)
{str+='('+(this.obj.sp-ttl)+' points available) ';}
this.obj.sleft.innerHTML=str;}}
else{this.spnval='<strong>'+this.tag+':</strong>';}
for(var i=0;i<this.mods.length;i++)
{if(i!=0){this.spnval+=';';}
if(this.mods[i][0]==null){this.spnval+=' <span class="invalid">'+this.mods[i][1]+'</span>';}
else
{var caveat='';if(this.mods[i][1].caveat!=''){caveat=' ('+this.mods[i][1].caveat+')';}
this.spnval+=' <span>'+this.mods[i][0].tag+' '+util.signed(this.mods[i][1].val)+caveat+'</span>';}}
this.obj.spn.innerHTML=this.spnval;}};Modifier.prototype.validate=function()
{dbg('Modifier.validate');for(var i=0;i<this.mods.length;i++)
{if(this.mods[i][0]!=null)
{this.mods[i][0].remove(this.mods[i][1]);}}
var nmod=new Modifier(this.obj,this.hide);if(nmod.isjunk)
{this.obj.mod=null;this.obj.smpl=true;this.obj.spn.innerHTML=util.toBR(this.obj.txt.value);}
else
{this.obj.mod=nmod;this.obj.spn.innerHTML=nmod.spnval;}};