nGlobal=0;
function ClearBroadcast(f) {
  f.Broadcast.value = "";
  f.Network.value = "";
}
function Len2MaskCalc(nMask) {
  if (nMask < 1) { return 0; }
  nCalc = 0;
  for (nX = 7;nX > -1 ; nX--) {
    nCalc=nCalc + raiseP(2 , nX);
    nMask = nMask -1;
    nGlobal=nMask;
    if (nMask <1) { return nCalc; }
  } return nCalc;
}
function raiseP(x,y) {
  total=1;
  for (j=0; j < y; j++) { total*=x; } return total; //result of x raised to y power
}
function CalcLen2Mask(f) {
  if ((f.MaskLen.value < 0)|| (f.MaskLen.value>32)) {
    alert("Your mask length can only be 0 - 32");
    return 0;
  }
  nMaskLen = f.MaskLen.value;
  f.IP1.value=Len2MaskCalc(nMaskLen);
  f.IP2.value=Len2MaskCalc(nGlobal);
  f.IP3.value=Len2MaskCalc(nGlobal);
  f.IP4.value=Len2MaskCalc(nGlobal);
}
function CalcMask2Len(f) {
  var m = new Array(1,2,3,4);
  m[0] = f.IP1.value; m[1] = f.IP2.value;
  m[2] = f.IP3.value; m[3] = f.IP4.value;
  ipcheck=TestSN(m[0],m[1],m[2],m[3]);
  if (ipcheck > 0) { alert("Subnet mask is not legal!"); return 0; }
  mask = 0;
  for (loop=0; loop<4; loop++) {
    div = 256;
    while (div > 1) {
      div = div/2;
      test = m[loop]-div;
      if ( test >-1) { mask=mask+1; m[loop]=test; } else { break; }
    }
  } f.MaskLen.value = mask;
}
function CalcBroadcast(f) {
  ClearBroadcast(f);
  var ipcheck=TestIP(f.IP1.value,f.IP2.value,f.IP3.value,f.IP4.value);
  if (ipcheck > 0) { alert("IP address is not legal!"); return 0; }
  ipcheck=TestSN(f.SN1.value,f.SN2.value,f.SN3.value,f.SN4.value);
  if (ipcheck > 0) { alert("Subnet mask is not legal!" ); return 0; }
  // This calculates net address
  var nOctA1=f.IP1.value & f.SN1.value
  var nOctA2=f.IP2.value & f.SN2.value
  var nOctA3=f.IP3.value & f.SN3.value
  var nOctA4=f.IP4.value & f.SN4.value
  // This calculates broadcast address
  var nOctB1=f.IP1.value | (f.SN1.value ^ 255)
  var nOctB2=f.IP2.value | (f.SN2.value ^ 255)
  var nOctB3=f.IP3.value | (f.SN3.value ^ 255)
  var nOctB4=f.IP4.value | (f.SN4.value ^ 255)
  f.Broadcast.value = nOctB1+"."+nOctB2+"."+nOctB3+"."+nOctB4
  f.Network.value = nOctA1+"."+nOctA2+"."+nOctA3+"."+nOctA4
}
function CalcOnNetwork(f) {
  var ipcheck=TestIP(f.IP1.value,f.IP2.value,f.IP3.value,f.IP4.value);
  if (ipcheck > 0) { alert("IP address 1 is not legal!"); return 0; }
  ipcheck=TestSN(f.SN1.value,f.SN2.value,f.SN3.value,f.SN4.value);
  if (ipcheck > 0) { alert("Subnet mask is not legal!"); return 0; }
  ipcheck=TestIP(f.SP1.value,f.SP2.value,f.SP3.value,f.SP4.value);
  if (ipcheck > 0) { alert("IP address 2 is not legal!"); return 0; }
  var nOctA1=f.IP1.value & f.SN1.value
  var nOctA2=f.IP2.value & f.SN2.value
  var nOctA3=f.IP3.value & f.SN3.value
  var nOctA4=f.IP4.value & f.SN4.value
  var nOctB1=f.SP1.value & f.SN1.value
  var nOctB2=f.SP2.value & f.SN2.value
  var nOctB3=f.SP3.value & f.SN3.value
  var nOctB4=f.SP4.value & f.SN4.value
  if ((nOctA1==nOctB1) && (nOctA2==nOctB2) && (nOctA3==nOctB3) && (nOctA4==nOctB4)) {
    f.Answer.value ="on the same network"
  } else {
    f.Answer.value ="not on the same network"
  }
}
function CalcNetworks(f) {
  // Check IP validity
  var ipcheck=TestIP(f.IP1.value,f.IP2.value,f.IP3.value,f.IP4.value);
  if (ipcheck > 0) { alert("IP address is not legal!"); return 0; }
  alert("ai address are ok");	
}
function TestIP(IP1, IP2, IP3, IP4) {
  // alert(IP1+"."+IP2+"."+IP3+"."+IP4)
  if ((IP1 > 255) || (IP1 < 1)) { return 1; }
  if ((IP2 > 255) || (IP2 < 0)) { return 2; }
  if ((IP3 > 255) || (IP3 < 0)) { return 3; }
  if ((IP4 > 255) || (IP4 < 0)) { return 4; }
  return 0;
}
function TestSN(IP1, IP2, IP3, IP4) {
  // alert(IP1+"."+IP2+"."+IP3+"."+IP4)
  if ((IP1 > 255) || (IP1 < 0)) { return 1; }
  if ((IP2 > 255) || (IP2 < 0)) { return 2; }
  if ((IP3 > 255) || (IP3 < 0)) { return 3; }
  if ((IP4 > 255) || (IP4 < 0)) { return 4; }
  var IPX =5;
  // Determine where IP changes
  if (IP1 < 255) {
    if((IP2 > 0) || (IP3 > 0) || (IP4 > 0)) { return 5; }
    IPX = IP1;
    } else {
      if (IP2 < 255) {
        if((IP3 > 0) || (IP4 > 0)) { return 6; }
        IPX = IP2;
      } else {
        if (IP3 < 255) {
          if ((IP4 > 0)) { return 7; }
	  IPX = IP3;
        } else { IPX = IP4; }
      }
    }
    // Determine if IPX is good
    switch (IPX) {
      case "255":
      case "128":
      case "192":
      case "224":
      case "240":
      case "248":
      case "252":
      case "254":
      case "0":
        return 0;
      default:
        return 8;
    } return 0;
  }
