+
-
Your IPv4 is
-
loading...
+
Your IPv4 address is
+
loading...
-
+
-
Your IPv6 is
-
loading...
+
Your IPv6 address is
+
loading...
diff --git a/public/index.php b/public/index.php
deleted file mode 100644
index 86b2958..0000000
--- a/public/index.php
+++ /dev/null
@@ -1,82 +0,0 @@
- $address,
- 'h' => $packed,
- 'v' => $version,
- ]);
- return;
- }
-
- if($reqPath === '/xml') {
- header('Access-Control-Allow-Origin: *');
- header('Cache-Control: no-cache');
- header('Content-Type: application/xml; charset=utf-8');
- $document = new DOMDocument('1.0', 'utf-8');
- $root = $document->appendChild(new DOMElement('IPAddress'));
- $root->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
- $root->setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
-
- $root->setAttribute('version', $version);
- $root->setAttribute('packed', $packed);
- $root->appendChild(new DOMText($address));
-
- echo $document->saveXML();
- return;
- }
-
- if($reqPath === '/packed') {
- header('Access-Control-Allow-Origin: *');
- header('Cache-Control: no-cache');
- header('Content-Type: text/plain');
- echo $packed;
- return;
- }
-
- if($reqPath === '/') {
- header('Access-Control-Allow-Origin: *');
- header('Cache-Control: no-cache');
- header('Content-Type: text/plain');
- echo $address;
- return;
- }
-} else {
- if($reqPath === '/style.css') {
- header('Content-Type: text/css; charset=utf-8');
- echo file_get_contents(__DIR__ . '/../style.css');
- return;
- }
-
- if($reqPath === '/script.js') {
- header('Content-Type: application/javascript; charset=utf-8');
- echo file_get_contents(__DIR__ . '/../script.js');
- return;
- }
-
- if($reqPath === '/') {
- header('Content-Type: text/html; charset=utf-8');
- echo file_get_contents(__DIR__ . '/../index.html');
- return;
- }
-}
-
-http_response_code(404);
-header('Content-Type: text/plain');
-echo 'Path not found.';
diff --git a/public/script.js b/public/script.js
new file mode 100644
index 0000000..5158f36
--- /dev/null
+++ b/public/script.js
@@ -0,0 +1,90 @@
+var createXHR = function() {
+ if('all' in document && !('atob' in window) && 'XDomainRequest' in window)
+ return new XDomainRequest;
+
+ if('XMLHttpRequest' in window)
+ return new XMLHttpRequest;
+
+ if('ActiveXObject' in window)
+ try {
+ return new ActiveXObject('Msxml2.XMLHTTP');
+ } catch(e) {
+ try {
+ return new ActiveXObject('Microsoft.XMLHTTP');
+ } catch(e) {}
+ }
+
+ return null;
+}
+
+var getRemoteString = function(url, callback) {
+ var xhr = createXHR();
+ xhr.onload = function(ev) {
+ callback({ success: true, info: ev, text: xhr.responseText });
+ };
+ xhr.onerror = function(ev) {
+ callback({ success: false, info: ev });
+ };
+ xhr.open('GET', url);
+ xhr.send();
+};
+
+var selectTextInElement = function(target) {
+ // MSIE
+ if(document.body.createTextRange) {
+ var range = document.body.createTextRange();
+ range.moveToElementText(target);
+ range.select();
+ return;
+ }
+
+ // Mozilla
+ if(window.getSelection) {
+ var select = window.getSelection(),
+ range = document.createRange();
+ range.selectNodeContents(target);
+ select.removeAllRanges();
+ select.addRange(range);
+ return;
+ }
+};
+
+var copySelectedText = function() {
+ if(document.execCommand) {
+ document.execCommand('copy');
+ return;
+ }
+};
+
+(function() {
+ var fields = [
+ { target: 'ipv4', ext: 'v4', clickTarget: 'ipv4-click' },
+ { target: 'ipv6', ext: 'v6', clickTarget: 'ipv6-click' },
+ ];
+
+ for(var i in fields)
+ (function(field) {
+ var host = location.host.split('.');
+ host[0] += field.ext;
+ var url = location.protocol + '//' + host.join('.') + '/';
+
+ getRemoteString(url, function(info) {
+ var target = document.getElementById(field.target),
+ prop = 'textContent' in target ? 'textContent' : 'innerText';
+
+ if(info.success) {
+ target[prop] = info.text;
+
+ if(field.clickTarget) {
+ var clickTarget = document.getElementById(field.clickTarget);
+ if(clickTarget)
+ clickTarget.onclick = function() {
+ selectTextInElement(target);
+ copySelectedText();
+ };
+ }
+ } else
+ target[prop] = 'not available';
+ });
+ })(fields[i]);
+})();
diff --git a/style.css b/public/style.css
similarity index 93%
rename from style.css
rename to public/style.css
index 2d82533..7847e04 100644
--- a/style.css
+++ b/public/style.css
@@ -37,8 +37,8 @@ code {
align-items: center;
}
-.ipv4 { --ipv-colour: #437675; /*margin-left: 22px !important;*/ }
-.ipv6 { --ipv-colour: #66678d; /*margin-left: -22px !important;*/ }
+.ipv4 { --ipv-colour: #437675; margin-left: 22px !important; }
+.ipv6 { --ipv-colour: #66678d; margin-left: -22px !important; }
.ipbox {
max-width: 600px;
diff --git a/script.js b/script.js
deleted file mode 100644
index 0fac93c..0000000
--- a/script.js
+++ /dev/null
@@ -1,87 +0,0 @@
-window.fwip = (function() {
- this.ipv4s = document.querySelectorAll('[data-ipv="4"]');
- this.ipv6s = document.querySelectorAll('[data-ipv="6"]');
-
- this.doAddressLookup = function(version, callback) {
- version = parseInt(version || 4).toString();
- var url = '//ipv' + version + '.flash.moe/json';
-
- fetch(url)
- .then(resp => resp.json())
- .then(data => callback(data))
- .catch(err => callback({error: 'not available'}));
- };
-
- var lookupCallback = function(set) {
- return function(result) {
- for(var i = 0; i < set.length; ++i) {
- if(!result.a)
- set[i].classList.add('ip-lookup-failed');
- else {
- var copyTarget = set[i],
- clickTarget = set[i].parentNode.parentNode;
- clickTarget.onclick = function() { this.doAddressCopy(copyTarget) }.bind(this);
- }
- set[i].textContent = result.a || result.error || 'gone';
- }
- }.bind(this);
- }.bind(this);
-
- this.doAddressLookup(4, lookupCallback(this.ipv4s));
- this.doAddressLookup(6, lookupCallback(this.ipv6s));
-
- this.selectTextInElement = function(elem) {
- // MSIE
- if(document.body.createTextRange) {
- var range = document.body.createTextRange();
- range.moveToElementText(elem);
- range.select();
- return;
- }
-
- // Mozilla
- if(window.getSelection) {
- var select = window.getSelection(),
- range = document.createRange();
- range.selectNodeContents(elem);
- select.removeAllRanges();
- select.addRange(range);
- return;
- }
-
- console.warn('Unable to select text.');
- };
-
- this.copySelectedText = function() {
- if(document.execCommand) {
- document.execCommand('copy');
- return;
- }
-
- console.warn('Unable to copy text.');
- };
-
- this.selectNothing = function() {
- // MSIE
- if(document.body.createTextRange) {
- document.body.createTextRange().select();
- return;
- }
-
- // Mozilla
- if(window.getSelection) {
- window.getSelection().removeAllRanges();
- return;
- }
-
- console.warn('Unable to select text.');
- };
-
- this.doAddressCopy = function(elem) {
- this.selectTextInElement(elem);
- this.copySelectedText();
- //this.selectNothing();
- };
-
- return this;
-}).call(window.fwip || {});