function fetch(obj_name) {return document.getElementById(obj_name)}

function rate(upRate,mode)
{
 if(!mode)
  {fetch("rate1").value = Math.round(upRate/8) }
 else
  {fetch("rate0").value = upRate*8 }
 
 
 calc()
}

function calc()
{
 upRate = fetch("rate0").value/8
 maxUp           = Math.floor(upRate*0.8)
 
 dis            = false
 maxTorr        = false
 maxDlTorr      = false
 maxSlotsTorr   = false
 avgSlotUp      = false
 prefs          = fetch("adv").checked
 SlotAvgManual  = fetch("adv0a").checked
 DlTorrManual   = fetch("adv0b").checked
 SlotsNumManual = fetch("adv0c").checked
 
 for(i=1;i<=3;i++){with(fetch("adv"+i)) {disabled="";previousSibling.disabled=""}}
 
 if(prefs && SlotAvgManual)  {avgSlotUp    = fetch("adv1").value*1}
 if(prefs && DlTorrManual)   {maxDlTorr    = fetch("adv2").value*1;maxTorr = maxDlTorr + Math.floor(1/3*maxDlTorr)}
 if(prefs && SlotsNumManual) {maxSlotsTorr = fetch("adv3").value*1}
 
 // userdefined overrides
 
 switch(true) {
  case (prefs && SlotAvgManual && DlTorrManual):
   maxSlotsTorr = Math.floor(maxUp/(maxTorr*avgSlotUp));
   dis=3
   break;
   
  case (prefs && SlotAvgManual && SlotsNumManual):
   maxTorr = Math.round(maxUp/(avgSlotUp*maxSlotsTorr))
   maxDlTorr = Math.ceil(maxTorr * 2/3)
   dis=2
   break;
   
  case (prefs && DlTorrManual && SlotsNumManual):
   avgSlotUp = (maxUp/(maxSlotsTorr*maxTorr)).toFixed(2)
   dis=1
   break;
  
  case (prefs && SlotsNumManual):
   avgSlotUp = Math.max(Math.pow(maxUp/3.5,0.55),4).toFixed(2) // basis to calculate the number of torrents
   maxTorr = Math.round(maxUp/(avgSlotUp*maxSlotsTorr))
   maxDlTorr = Math.ceil(maxTorr * 2/3)
   avgSlotUp = (maxUp/(maxSlotsTorr*maxTorr)).toFixed(2) // real number after the slots have been multiplied with the torrents
   break;
   
  default:

   break;
 }
 
 if(dis){with(fetch("adv"+dis)) {disabled="disabled";previousSibling.checked="";previousSibling.disabled="disabled"}}
  
 if(!maxTorr) {
  maxTorr   = Math.round(Math.pow(maxUp/4,0.3))
  maxDlTorr = Math.ceil(maxTorr * 2/3)
 }
 
 if(!avgSlotUp) {
  avgSlotUp = Math.max(Math.pow(maxUp/3.5,0.55),4).toFixed(2) 
 }
 
 if(!maxSlotsTorr) {
  maxSlotsTorr = Math.floor(maxUp/(maxTorr*avgSlotUp))
 }
 
 maxConn         = Math.round(Math.min(Math.pow(upRate*8,0.8)+50,1200))
 maxTorrConn  = Math.round(Math.min(maxConn * 1.2 / maxTorr,maxConn))
 
 
 fetch("res0").value = maxUp
 fetch("res1").value = 0
 fetch("res2").value = maxSlotsTorr
 fetch("res2a").firstChild.data = avgSlotUp
 fetch("res3").value = maxTorrConn
 fetch("res4").value = maxConn
 
 fetch("res5").value = maxDlTorr
 fetch("res6").value = maxTorr
}

function advOpt(obj){fetch("advset").style.display = obj.checked ? "block" : "none";calc()}