-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
211 lines (182 loc) · 6.59 KB
/
script.js
File metadata and controls
211 lines (182 loc) · 6.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// Get DOM elements
const octet1Input = document.getElementById('octet1');
const octet2Input = document.getElementById('octet2');
const octet3Input = document.getElementById('octet3');
const octet4Input = document.getElementById('octet4');
const cidrPrefixInput = document.getElementById('cidrPrefix');
const binaryContainer = document.getElementById('binaryContainer');
const netmaskElement = document.getElementById('netmask');
const cidrBaseIpElement = document.getElementById('cidrBaseIp');
const broadcastIpElement = document.getElementById('broadcastIp');
const countElement = document.getElementById('count');
const firstUsableIpElement = document.getElementById('firstUsableIp');
const lastUsableIpElement = document.getElementById('lastUsableIp');
const copyCidrButton = document.getElementById('copyCidr');
const copyShareLinkButton = document.getElementById('copyShareLink');
// Add event listeners
octet1Input.addEventListener('input', handleInputChange);
octet2Input.addEventListener('input', handleInputChange);
octet3Input.addEventListener('input', handleInputChange);
octet4Input.addEventListener('input', handleInputChange);
cidrPrefixInput.addEventListener('input', handleInputChange);
copyCidrButton.addEventListener('click', copyCidr);
copyShareLinkButton.addEventListener('click', copyShareLink);
// Initialize the calculator
calculateCIDR();
// Handle input changes
function handleInputChange(event) {
const input = event.target;
const value = parseInt(input.value) || 0;
const min = parseInt(input.min);
const max = parseInt(input.max);
// Clamp value between min and max
input.value = Math.min(max, Math.max(min, value));
calculateCIDR();
}
// Calculate CIDR information
function calculateCIDR() {
// Get IP octets and CIDR prefix
const ipOctets = [
parseInt(octet1Input.value) || 0,
parseInt(octet2Input.value) || 0,
parseInt(octet3Input.value) || 0,
parseInt(octet4Input.value) || 0
];
const cidrPrefix = parseInt(cidrPrefixInput.value) || 0;
// Calculate netmask
const fullMask = 0xffffffff >>> (32 - cidrPrefix) << (32 - cidrPrefix);
const netmaskOctets = [
(fullMask >>> 24) & 255,
(fullMask >>> 16) & 255,
(fullMask >>> 8) & 255,
fullMask & 255
];
const netmask = netmaskOctets.join('.');
// Calculate network address (CIDR Base IP)
const ipNumber = (ipOctets[0] << 24) | (ipOctets[1] << 16) | (ipOctets[2] << 8) | ipOctets[3];
const networkNumber = ipNumber & fullMask;
const networkOctets = [
(networkNumber >>> 24) & 255,
(networkNumber >>> 16) & 255,
(networkNumber >>> 8) & 255,
networkNumber & 255
];
const cidrBaseIp = networkOctets.join('.');
// Calculate broadcast address
const broadcastNumber = networkNumber | (~fullMask & 0xffffffff);
const broadcastOctets = [
(broadcastNumber >>> 24) & 255,
(broadcastNumber >>> 16) & 255,
(broadcastNumber >>> 8) & 255,
broadcastNumber & 255
];
const broadcastIp = broadcastOctets.join('.');
// Calculate count of usable IPs
const count = Math.pow(2, 32 - cidrPrefix);
// Calculate first and last usable IPs
let firstUsableIp = cidrBaseIp;
let lastUsableIp = broadcastIp;
if (count > 2) {
const firstUsableNumber = networkNumber + 1;
const firstUsableOctets = [
(firstUsableNumber >>> 24) & 255,
(firstUsableNumber >>> 16) & 255,
(firstUsableNumber >>> 8) & 255,
firstUsableNumber & 255
];
firstUsableIp = firstUsableOctets.join('.');
const lastUsableNumber = broadcastNumber - 1;
const lastUsableOctets = [
(lastUsableNumber >>> 24) & 255,
(lastUsableNumber >>> 16) & 255,
(lastUsableNumber >>> 8) & 255,
lastUsableNumber & 255
];
lastUsableIp = lastUsableOctets.join('.');
}
// Calculate binary representation of IP octets
const binaryOctets = ipOctets.map(octet =>
octet.toString(2).padStart(8, '0')
);
// Update the UI
updateBinaryDisplay(binaryOctets);
netmaskElement.textContent = netmask;
cidrBaseIpElement.textContent = cidrBaseIp;
broadcastIpElement.textContent = broadcastIp;
countElement.textContent = count;
firstUsableIpElement.textContent = firstUsableIp;
lastUsableIpElement.textContent = lastUsableIp;
}
// Update binary display
function updateBinaryDisplay(binaryOctets) {
binaryContainer.innerHTML = '';
binaryOctets.forEach((binary, octetIndex) => {
const binaryOctetElement = document.createElement('div');
binaryOctetElement.className = 'binary-octet';
binary.split('').forEach((bit, bitIndex) => {
const bitElement = document.createElement('div');
bitElement.className = `binary-bit ${bit === '1' ? `bit-1-${octetIndex + 1}` : 'bit-0'}`;
bitElement.textContent = bit;
binaryOctetElement.appendChild(bitElement);
});
binaryContainer.appendChild(binaryOctetElement);
});
}
// Copy CIDR to clipboard
function copyCidr() {
const ipOctets = [
octet1Input.value,
octet2Input.value,
octet3Input.value,
octet4Input.value
].join('.');
const cidrPrefix = cidrPrefixInput.value;
const cidrNotation = `${ipOctets}/${cidrPrefix}`;
navigator.clipboard.writeText(cidrNotation)
.then(() => {
alert('CIDR notation copied to clipboard!');
})
.catch(err => {
console.error('Failed to copy: ', err);
});
}
// Copy share link to clipboard
function copyShareLink() {
const ipOctets = [
octet1Input.value,
octet2Input.value,
octet3Input.value,
octet4Input.value
].join('.');
const cidrPrefix = cidrPrefixInput.value;
const url = new URL(window.location.href);
url.search = `?ip=${ipOctets}&cidr=${cidrPrefix}`;
navigator.clipboard.writeText(url.toString())
.then(() => {
alert('Share link copied to clipboard!');
})
.catch(err => {
console.error('Failed to copy: ', err);
});
}
// Parse URL parameters on page load
function parseUrlParams() {
const urlParams = new URLSearchParams(window.location.search);
const ipParam = urlParams.get('ip');
const cidrParam = urlParams.get('cidr');
if (ipParam) {
const ipParts = ipParam.split('.');
if (ipParts.length === 4) {
octet1Input.value = parseInt(ipParts[0]) || 0;
octet2Input.value = parseInt(ipParts[1]) || 0;
octet3Input.value = parseInt(ipParts[2]) || 0;
octet4Input.value = parseInt(ipParts[3]) || 0;
}
}
if (cidrParam) {
cidrPrefixInput.value = parseInt(cidrParam) || 0;
}
calculateCIDR();
}
// Run on page load
parseUrlParams();