<!--

function toDotDec(x) {
  n = 0xffffffff & x
  o4 = n % 256;   n = n>>>8;  if (o4 < 0) o4 += 256
  o3 = n % 256;   n = n>>>8
  o2 = n % 256;   n = n>>>8
  o1 = n
  return "" + o1 + "." + o2 + "." + o3 + "." + o4
}

function toDecimal(ddString) {
  var octets = new Array(4)
  octets = ddString.split(".",4)
  addr = 0
  for (i=0; i<=3; i++) {
  	o = (0xFFFFFFFF & parseInt(octets[i]))
    if (o < 0){ 
      o=0x0
      alert("Think you're sneaky, eh? I'll set that octet to zero.")
    }
    if (o > 255) {
      o=0xff
      alert("Now, you know that 255 is the maximum value of an octet!\nI'll just use 255 instead.")
    }
    addr = (0xffffffff & (addr<<8)) + (0xffffffff & o)
  }
  return addr;
}

function calc(form) {
  
  form.results.value = ""
  startingAddress = toDecimal(form.saddr.value)
  endingAddress = toDecimal(form.eaddr.value)
  if (endingAddress < startingAddress) {
    alert("The starting address must be smaller than the ending address.\nTry again")
    form.saddr.value=""
    form.eaddr.value=""
    return
  }
  numberOfAddresses = (0xffffffff & endingAddress) - (0xffffffff & startingAddress)
  numberOfAddresses++
  
  form.saddr.value = toDotDec(startingAddress)
  form.eaddr.value = toDotDec(endingAddress)

  while (numberOfAddresses > 0) {

    bits = 33
    do  {
      blocksize = Math.pow(2,--bits)
    }
    while (((startingAddress % blocksize) != 0) || (blocksize > numberOfAddresses))

    prefix = 32 - bits
    wildcard = (1<<(bits)) - 1

    addr = toDotDec(startingAddress) + "/" + prefix + "                 "
    form.results.value += addr.substring(addr,19) + "(" + toDotDec(wildcard) + ")\n"

    startingAddress += blocksize
    numberOfAddresses -= blocksize
  }

  
}


function sorter(a,b) {
  return(b-a)
}

function pad(str,len) {
  output = str + "                                                      "
  output = output.substr(0,len)
  return output
}

function VLSMcalc(form) {
  
  var mask = ["0.0.0.0",
              "128.0.0.0",
              "192.0.0.0",
              "224.0.0.0",
              "240.0.0.0",
              "248.0.0.0",
              "252.0.0.0",
              "254.0.0.0",
              "255.0.0.0",
              "255.128.0.0",
              "255.192.0.0",
              "255.224.0.0",
              "255.240.0.0",
              "255.248.0.0",
              "255.252.0.0",
              "255.254.0.0",
              "255.255.0.0",
              "255.255.128.0",
              "255.255.192.0",
              "255.255.224.0",
              "255.255.240.0",
              "255.255.248.0",
              "255.255.252.0",
              "255.255.254.0",
              "255.255.255.0",
              "255.255.255.128",
              "255.255.255.192",
     	      "255.255.255.224",
     	      "255.255.255.240",
              "255.255.255.248",
              "255.255.255.252",
              "255.255.255.254"]
  	                         
  var pieces = new Array(2)
  var netSizes = new Array
  
  pieces = form.startingBlock.value.split("/",2)
  fullNet = pieces[0]
  startingAddress = toDecimal(fullNet)
  
  prefix = 24
  if (pieces.length > 1) prefix  = parseInt(pieces[1])
  if ((prefix < 1) || (prefix > 29)) {
    prefix = 24
    alert("Unreasonable prefix. Using /24")
  }
  numberOfAddresses = Math.pow(2,(32-prefix))
  startingAddress = startingAddress >> (32-prefix)
  startingAddress = startingAddress << (32-prefix)
  remainingAddresses = numberOfAddresses
  addressesAllocated = 0
  
  if (form.subnetString.value.length < 1) {
    form.results.value = "No subnets specified."
    return
  }

  netSizes = form.subnetString.value.split(",")
  numberOfNets = netSizes.length
  for (i=1; i<numberOfNets; i++) netSizes[i] = Math.abs(parseInt(netSizes[i]))
  netSizes.sort(sorter)

  if (netSizes[0] < 2) {
    form.results.value = "Subnet size too small."
    return
  }
  
  form.results.value = "Full Net: " + toDotDec(startingAddress) + "/" + prefix + 
          " (" + numberOfAddresses + " total addresses) " + numberOfNets + " subnets\n\n"
  form.results.value += "Size Needed   Subnet Addr     Broadcast Addr   Mask\n"

  for (i=0; i<numberOfNets; i++) {
    rawSize = parseInt(netSizes[i])
    if (rawSize < 2) {
      form.results.value += rawSize + " is too small for a subnet; skipped.\n"
      continue
    }
    if (form.C1.checked) rawSize += 2   

    allocSize = 1
    prefix = 32
    while (allocSize < rawSize) {
      allocSize = allocSize << 1 
      prefix--
    }
    
    if (allocSize > remainingAddresses) {
      form.results.value += "Too few addresses to continue.\n"
      i = numberOfNets
    }
    else {
    
      form.results.value += "    " + pad(""+rawSize,10)
	  form.results.value += pad(toDotDec(startingAddress),16)
      form.results.value += pad(toDotDec(startingAddress + allocSize - 1),17)
      form.results.value += mask[prefix] + "\n"
            
      startingAddress += allocSize
      addressesAllocated += allocSize
      remainingAddresses -= allocSize
    }
  }
  remainingAddresses = numberOfAddresses - addressesAllocated
  form.results.value += "\n" + addressesAllocated + " addresses allocated, " + remainingAddresses + " remaining addresses."
}

//-->

