/* Javascript IP subnet calculator � Andy Povey 2000 */

function calculate(form) {

/* Input */

var ipaddress = (form.ipinput.value);
var smmask = (form.sminput.value)

/* Check for valid characters */

var validchars = "0123456789.";
var test = false;
for (i=0; i<ipaddress.length; i++) {
var c = 0; 
test = false;
while ((c<11) && (test == false)){
if (ipaddress.charAt(i) == validchars.charAt(c)){
test = true};
c = c+1;
}   
if (test == false){form.reportbox.value = "Nie prawidłowy adres. Adresy IP mogą składać się jedynie z cyfr i znaków kropki."; return;};
}		

for (i=0; i<smmask.length; i++) {
var c = 0; 
test = false;
while ((c<11) && (test == false)){
if (smmask.charAt(i) == validchars.charAt(c)){
test = true};
c = c+1;
}   
if (test == false){form.reportbox.value = "Nie prawidłowy adres. Adresy IP mogą składać się jedynie z cyfr i znaków kropki."; return;};
}

/* Strip numerical data from input string */

var dotpos = new Array(3);
dotpos[0] = 0;
dotpos[1] = 0;
dotpos[2] = 0;    
var c = -1;   
for (i = 0; i < ipaddress.length; i++){   
if (ipaddress.charAt(i) == "."){
c = ( c + 1);	   
dotpos[c] = i + 1;
}   		
}     

var val1 = parseInt(ipaddress.substring(0,dotpos[0]),10);
var val2 = parseInt(ipaddress.substring(dotpos[0],dotpos[1]),10);
var val3 = parseInt(ipaddress.substring(dotpos[1],dotpos[2]),10);
var val4 = parseInt(ipaddress.substring(dotpos[2],ipaddress.length),10);

dotpos[0] = 0;
dotpos[1] = 0;
dotpos[2] = 0;    
var c = -1;   
for (i = 0; i < smmask.length; i++){   
if (smmask.charAt(i) == "."){
c = ( c + 1);	   
dotpos[c] = i + 1;
}            		
}

var val5 = parseInt(smmask.substring(0,dotpos[0]),10);
var val6 = parseInt(smmask.substring(dotpos[0],dotpos[1]),10);
var val7 = parseInt(smmask.substring(dotpos[1],dotpos[2]),10);
var val8 = parseInt(smmask.substring(dotpos[2],smmask.length),10);  


/* Initialize fields */

form.starthost.value = "0.0.0.0"
form.endhost.value = "0.0.0.0"
form.numofhosts.value = "0"
form.subnetaddress.value = "0.0.0.0"
form.broadcastaddress.value = "0.0.0.0"
form.networkclass.value = "-"
form.subsizebits.value = "0"
form.hostsizebits.value = "0"

/* Declaration of variables */

var val9 = val1
var val10 = 0  
var val11 = 0
var val12 = 0   
var val13 = val1
var val14 = 0   
var val15 = 0
var val16 = 0
var val17 = "-" 
var x = 0
var ipdec = 0
var smdec = 0 
/*
var startdec = 0
var enddec = 0
var message1 = "Dotted decimal values must be between 0 and 255"
var message2 = "The subnet mask is invalid"
var message3 = "The IP address is unusable as a host address with this subnet mask"
var message4 = "The subnet mask is invalid"
var message5 = "The IP address is invalid"
var message6 = " "
var message7 = "IP addresses of type 127.x.x.x are unusable as host addresses"    
var message9 = "Note: "+val1+"."+val2+"."+val3+"."+val4+" is a class B IP address and is normally used with a subnet mask of type 255.255.x.x"
var message10 = "Note: "+val1+"."+val2+"."+val3+"."+val4+" is a class C IP address and is normally used with a subnet mask of type 255.255.255.x"
var message11 = "Programming and design by Andy Povey. Email: andypovey@excite.com"
var message12 = "IP addresses of type 0.x.x.x are unusable as host addresses"
var message13 = "This is a class D address. It is unusable as a host address."
var message14 = "This is a class E address. It is unusable as a host address."   
*/
var startdec = 0
var enddec = 0
var message1 = "Dziesiętne wartości rozdzielone kropkami muszą być w zakresie od 0 do 255 np.: 192.168.1.1 dla adresu IP oraz 255.255.255.128 dla maski sieci."
var message2 = "Nieprawidłowa maska sieciowa."
var message3 = "Podany adres IP wraz ze wskazaną maską sieci nie jest użytecznym adresem IP hosta."
var message4 = "Nieprawidłowa maska sieciowa."
var message5 = "Nie prawidłowy adres IP."
var message6 = " "
var message7 = "Adres IP typu 127.x.x.x jest nieużyteczny jako realny adres IP."    
var message9 = "Uwaga: "+val1+"."+val2+"."+val3+"."+val4+" jest adresem IP klasy B i jest zazwyczaj używany z maską sieci postaci 255.255.x.x."
var message10 = "Uwaga: "+val1+"."+val2+"."+val3+"."+val4+" jest adresem IP klasy C i jest zazwyczaj używany z maską sieci postaci 255.255.255.x."
var message11 = "Zaprojektowane i oprogramowane przez Andy Povey. Email: andypovey@excite.com."
var message12 = "Adresy IP typu 0.x.x.x jest nieużyteczny jako realny adres IP."
var message13 = "Adres klasy D. Adresy klasy D nie są wykorzystywane jako adresy hostów."
var message14 = "Adres klasy E. Adresy klasy E nie są wykorzystywane jako adresy hostów."   
var output = message11	



/* Input validation */

if (val1 == 127){form.reportbox.value = message7;return}; 
if (val1 == 0){form.reportbox.value = message12;return};

if ((val1 > 255) || (val2 > 255) || (val3 > 255) || (val4 > 255)
|| (val5 > 255) || (val6 > 255) || (val7 > 255) || (val8 > 255))
{form.reportbox.value = message1; return};      

if (val5 != 255){form.reportbox.value = message2;return};

if ((val6!=00)&&(val6!=128)&&(val6!=192)&&(val6!=224)&&(val6!=240)&&(val6!=248)&&(val6!=252)&&(val6!=254)&&(val6!=255)){form.reportbox.value = message2;return};   
if ((val7!=00)&&(val7!=128)&&(val7!=192)&&(val7!=224)&&(val7!=240)&&(val7!=248)&&(val7!=252)&&(val7!=254)&&(val7!=255)){form.reportbox.value = message2;return};
if ((val8!=00)&&(val8!=128)&&(val8!=192)&&(val8!=224)&&(val8!=240)&&(val8!=248)&&(val8!=252)&&(val8!=254)&&(val8!=255)){form.reportbox.value = message2;return};      

if (val6!=255){if ((val7!=0)||(val8!=0)){form.reportbox.value = message4;return}};
if (val7!=255){if (val8!=0){form.reportbox.value = message4;return}};
if (val8> 252){form.reportbox.value = message4;return};

/* Conversion from dotted decimal notation to decimal */

smdec = (val6 * 65536) + (val7 * 256) + val8;
ipdec = (val2 * 65536) + (val3 * 256) + val4;

/* Determination of network address size (n) */

for (t = 2; t < 25; t = t + 1)
{if (smdec == (16777216 - Math.pow(2,t))) 
{(n = 32 - t)}}

/* Determination of network class */

if (val1 < 127) {val17 = "A"}
if ((val1 > 127) && (val1 < 192)) {val17 = "B"}
if ((val1 > 191) && (val1 < 224)) {val17 = "C"} 
if ((val1 > 223) && (val1 < 240)) {val17 = "D"}
if ((val1 > 239) && (val1 < 256)) {val17 = "E"}

/* Validation of IP address according to class */

if ((val17 == "B") && (n <16)){output = message9};
if ((val17 == "C") && (n <24)){output = message10};
if (val17 == "D"){form.reportbox.value = message13; return};
if (val17 == "E"){form.reportbox.value = message14; return};

/* Calculation of range for n >23 */

if (n > 23){
x = Math.pow(2,(32 - n));
for (i = - 1;  i < (256 - x);  i = (i + x))
{if ((val4 >= (i + 1)) && (val4 <= (i + x))) 
{val12 = (i + 2);
val16 = (i + (x - 1));
}     
}   
val10 = val2
val11 = val3
val14 = val2
val15 = val3   
if ((String(String(val2)+val3+(val4)) == String(String(val10)+val11+(val12 - 1))) || (String(String(val2)+val3+(val4)) == String(String(val14)+val15+(val16 + 1))))
{output = "UWAGA: adres IP "+val1+"."+val2+"."+val3+"."+val4+" nie może być wykorzystany jako adres hosta z maską sieci "+val5+"."+val6+"."+val7+"."+val8};
}  

/* Calculation of range for n >=16 AND <24 */

if ((n >= 16) && (n < 24)){
x = Math.pow(2,(24 - n)); 
for (i = 0;  i <= (256 - x);  i = (i + x))
{if ((val3 >= (i)) && (val3 <= (i + x))) 
{val11 = (i);
val15 = (i + (x - 1));
}
}
val10 = val2
val14 = val2
val12 = 1
val16 = 254
if ((String(String(val2)+val3+(val4)) == String(String(val10)+val11+(val12 - 1))) || (String(String(val2)+val3+(val4)) == String(String(val14)+val15+(val16 + 1))))
{output = "UWAGA: adres IP "+val1+"."+val2+"."+val3+"."+val4+" nie może być wykorzystany jako adres hosta z maską sieci "+val5+"."+val6+"."+val7+"."+val8};
}

/* Calculation of range for n >=8 AND <16 */

if ((n >= 8) && (n < 16)){
x = Math.pow(2,(16 - n));
for (i = 0;  i <= (256 - x);  i = (i + x))
{if ((val2 >= (i)) && (val2 <= (i + x))) 
{val10 = (i);
val14 = (i + (x - 1));
}
}
val11 = 0
val15 = 255
val12 = 1
val16 = 254
if ((String(String(val2)+val3+(val4)) == String(String(val10)+val11+(val12 - 1))) || (String(String(val2)+val3+(val4)) == String(String(val14)+val15+(val16 + 1))))
{output = "UWAGA: adres IP "+val1+"."+val2+"."+val3+"."+val4+" nie może być wykorzystany jako adres hosta z maską sieci "+val5+"."+val6+"."+val7+"."+val8};
}     

/* Conversion back to dotted decimal notation 

val15 = Math.floor(startdec/65536)
val16 = Math.floor((startdec % 65536)/256)
val11 = Math.floor(startdec % 256)
val12 = Math.floor(enddec/65536)
val13 = Math.floor((enddec % 65536)/256)
val14 = Math.floor(enddec % 256)           */

/* Output */

form.starthost.value = val9+"."+val10+"."+val11+"."+val12
form.endhost.value = val13+"."+val14+"."+val15+"."+val16
form.numofhosts.value = (Math.pow(2,(32 - n))-2)
form.subnetaddress.value = val9+"."+val10+"."+val11+"."+((val12)-1)
form.broadcastaddress.value = val13+"."+val14+"."+val15+"."+((val16)+1)
form.subsizebits.value = n
form.hostsizebits.value = 32 - n
form.networkclass.value = val17
form.reportbox.value = output 

}

/* Javascript subnet calculator � Andy Povey 2000 */
