parent
691f9495af
commit
d533183b60
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,950 @@ |
||||
function bool(x) { |
||||
return (x === 1 || x === '1' || x === true || x === 'true'); |
||||
} |
||||
|
||||
/** html entities */ |
||||
function e(x) { |
||||
return String(x) |
||||
.replace(/&/g, '&') |
||||
.replace(/"/g, '"') |
||||
.replace(/'/g, ''') |
||||
.replace(/</g, '<') |
||||
.replace(/>/g, '>'); |
||||
} |
||||
|
||||
/** Returns true if argument is array [] */ |
||||
function isArray(obj) { |
||||
return Object.prototype.toString.call(obj) === '[object Array]'; |
||||
} |
||||
|
||||
/** Returns true if argument is object {} */ |
||||
function isObject(obj) { |
||||
return Object.prototype.toString.call(obj) === '[object Object]'; |
||||
} |
||||
|
||||
/** escape a string to have no special meaning in regex */ |
||||
function regexEscape(s) { |
||||
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); |
||||
} |
||||
|
||||
/** Perform a substitution in the given string. |
||||
* |
||||
* Arguments - array or list of replacements. |
||||
* Arguments numeric keys will replace {0}, {1} etc. |
||||
* Named keys also work, ie. {foo: "bar"} -> replaces {foo} with bar. |
||||
* |
||||
* Braces are added to keys if missing. |
||||
* |
||||
* @returns {String} result |
||||
*/ |
||||
String.prototype.format = function () { |
||||
var out = this; |
||||
|
||||
var repl = arguments; |
||||
|
||||
if (arguments.length == 1 && (isArray(arguments[0]) || isObject(arguments[0]))) { |
||||
repl = arguments[0]; |
||||
} |
||||
|
||||
for (var ph in repl) { |
||||
if (repl.hasOwnProperty(ph)) { |
||||
var ph_orig = ph; |
||||
|
||||
if (!ph.match(/^\{.*\}$/)) { |
||||
ph = '{' + ph + '}'; |
||||
} |
||||
|
||||
// replace all occurrences
|
||||
var pattern = new RegExp(regexEscape(ph), "g"); |
||||
out = out.replace(pattern, repl[ph_orig]); |
||||
} |
||||
} |
||||
|
||||
return out; |
||||
}; |
||||
|
||||
/** Module for toggling a modal overlay */ |
||||
var modal = (function () { |
||||
var modal = {}; |
||||
|
||||
modal.show = function (sel) { |
||||
var $m = $(sel); |
||||
$m.removeClass('hidden visible'); |
||||
setTimeout(function () { |
||||
$m.addClass('visible'); |
||||
}, 1); |
||||
}; |
||||
|
||||
modal.hide = function (sel) { |
||||
var $m = $(sel); |
||||
$m.removeClass('visible'); |
||||
setTimeout(function () { |
||||
$m.addClass('hidden'); |
||||
}, 500); // transition time
|
||||
}; |
||||
|
||||
modal.init = function () { |
||||
// close modal by click outside the dialog
|
||||
$('.Modal').on('click', function () { |
||||
modal.hide(this); |
||||
}); |
||||
|
||||
$('.Dialog').on('click', function (e) { |
||||
e.stopImmediatePropagation(); |
||||
}); |
||||
|
||||
// Hide all modals on esc
|
||||
$(window).on('keydown', function (e) { |
||||
if (e.which == 27) { |
||||
modal.hide('.Modal'); |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
return modal; |
||||
})(); |
||||
|
||||
|
||||
/** Wifi page */ |
||||
var wifi = (function () { |
||||
var wifi = {}; |
||||
var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']; |
||||
|
||||
/** Update display for received response */ |
||||
function onScan(resp, status) { |
||||
if (status != 200) { |
||||
// bad response
|
||||
rescan(5000); // wait 5sm then retry
|
||||
return; |
||||
} |
||||
|
||||
resp = JSON.parse(resp); |
||||
|
||||
var done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0); |
||||
rescan(done ? 15000 : 1000); |
||||
|
||||
// clear the AP list
|
||||
var $list = $('#ap-list'); |
||||
// remove old APs
|
||||
$('.AP').remove(); |
||||
|
||||
$list.toggle(done); |
||||
$('#ap-loader').toggle(!done); |
||||
|
||||
// scan done
|
||||
resp.result.APs |
||||
.sort(function (a, b) { |
||||
return b.rssi - a.rssi |
||||
}) |
||||
.forEach(function (ap) { |
||||
ap.enc = parseInt(ap.enc); |
||||
|
||||
if (ap.enc > 4) return; // hide unsupported auths
|
||||
|
||||
var item = document.createElement('div'); |
||||
|
||||
var $item = $(item) |
||||
.data('ssid', ap.essid) |
||||
.data('pwd', ap.enc != 0) |
||||
.addClass('AP'); |
||||
|
||||
// mark current SSID
|
||||
if (ap.essid == wifi.current) { |
||||
$item.addClass('selected'); |
||||
} |
||||
|
||||
var inner = document.createElement('div'); |
||||
var $inner = $(inner).addClass('inner') |
||||
.htmlAppend('<div class="rssi">{0}</div>'.format(Math.round(ap.rssi / 2.55))) |
||||
.htmlAppend('<div class="essid" title="{0}">{0}</div>'.format(e(ap.essid))) |
||||
.htmlAppend('<div class="auth">{0}</div>'.format(authStr[ap.enc])); |
||||
|
||||
$item.on('click', function () { |
||||
var $th = $(this); |
||||
|
||||
// populate the form
|
||||
$('#conn-essid').val($th.data('ssid')); |
||||
$('#conn-passwd').val(''); // clear
|
||||
|
||||
if ($th.data('pwd')) { |
||||
// this AP needs a password
|
||||
modal.show('#psk-modal'); |
||||
} else { |
||||
$('#conn-form').submit(); |
||||
} |
||||
}); |
||||
|
||||
|
||||
item.appendChild(inner); |
||||
$list[0].appendChild(item); |
||||
}); |
||||
} |
||||
|
||||
/** Ask the CGI what APs are visible (async) */ |
||||
function scanAPs() { |
||||
$().get('/wifi/scan.cgi', onScan, true, true); // no cache, no jsonp
|
||||
} |
||||
|
||||
function rescan(time) { |
||||
setTimeout(scanAPs, time); |
||||
} |
||||
|
||||
/** Set up the WiFi page */ |
||||
wifi.init = function () { |
||||
//var ap_json = {
|
||||
// "result": {
|
||||
// "inProgress": "0",
|
||||
// "APs": [
|
||||
// {"essid": "Chlivek", "bssid": "88:f7:c7:52:b3:99", "rssi": "204", "enc": "4", "channel": "1"},
|
||||
// {"essid": "TyNikdy", "bssid": "5c:f4:ab:0d:f1:1b", "rssi": "164", "enc": "3", "channel": "1"},
|
||||
// {"essid": "UPC5616805", "bssid": "08:95:2a:0c:84:3f", "rssi": "164", "enc": "4", "channel": "1"},
|
||||
// {"essid": "Sitovina", "bssid": "20:cf:30:98:cb:3a", "rssi": "166", "enc": "3", "channel": "1"},
|
||||
// {"essid": "Tramp", "bssid": "c4:e9:84:6f:6c:e0", "rssi": "170", "enc": "3", "channel": "2"},
|
||||
// {"essid": "KV2", "bssid": "4c:5e:0c:2c:84:9b", "rssi": "172", "enc": "3", "channel": "3"},
|
||||
// {"essid": "UPC373123", "bssid": "e8:40:f2:ae:0e:f4", "rssi": "164", "enc": "3", "channel": "1"},
|
||||
// {"essid": "www.podoli.org prazak", "bssid": "00:00:00:00:00:00", "rssi": "165", "enc": "0", "channel": "4"},
|
||||
// {"essid": "Medvjedov", "bssid": "00:00:00:00:00:00", "rssi": "181", "enc": "4", "channel": "6"},
|
||||
// {"essid": "MARIAN-PC", "bssid": "f8:d1:11:af:d7:72", "rssi": "175", "enc": "3", "channel": "6"},
|
||||
// {"essid": "UPC3226244", "bssid": "64:7c:34:9a:6f:7c", "rssi": "169", "enc": "4", "channel": "6"},
|
||||
// {"essid": "molly", "bssid": "00:00:00:00:00:00", "rssi": "168", "enc": "3", "channel": "7"},
|
||||
// {"essid": "UPC2607759", "bssid": "88:f7:c7:4e:c1:b2", "rssi": "164", "enc": "4", "channel": "8"},
|
||||
// {"essid": "blondyna", "bssid": "98:fc:11:bd:0f:b8", "rssi": "166", "enc": "4", "channel": "9"},
|
||||
// {"essid": "UPC246587811", "bssid": "80:f5:03:20:6c:85", "rssi": "171", "enc": "3", "channel": "11"},
|
||||
// {"essid": "UPC930648", "bssid": "4c:72:b9:50:6d:38", "rssi": "167", "enc": "3", "channel": "11"},
|
||||
// {"essid": "PRAHA4.NET-R21-2", "bssid": "00:00:00:00:00:00", "rssi": "173", "enc": "0", "channel": "12"},
|
||||
// {"essid": "Internet_B0", "bssid": "5c:f4:ab:11:3b:b3", "rssi": "166", "enc": "3", "channel": "13"}
|
||||
// ]
|
||||
// }
|
||||
//};
|
||||
|
||||
//onScan(ap_json, 200);
|
||||
scanAPs(); |
||||
}; |
||||
|
||||
return wifi; |
||||
})(); |
||||
|
||||
|
||||
/** Global generic init */ |
||||
function initDef() { |
||||
// loader dots...
|
||||
setInterval(function () { |
||||
$('.anim-dots').each(function (x) { |
||||
var $x = $(x); |
||||
var dots = $x.html() + '.'; |
||||
if (dots.length == 5) dots = '.'; |
||||
$x.html(dots); |
||||
}); |
||||
}, 1000); |
||||
|
||||
modal.init(); |
||||
} |
||||
|
||||
/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */ |
||||
(function () { |
||||
'use strict'; |
||||
|
||||
var readyfn = [], |
||||
loadedfn = [], |
||||
domready = false, |
||||
pageloaded = false, |
||||
jsonpcount = 0, |
||||
d = document, |
||||
w = window; |
||||
|
||||
// Fire any function calls on ready event
|
||||
function fireReady() { |
||||
var i; |
||||
domready = true; |
||||
for (i = 0; i < readyfn.length; i += 1) { |
||||
readyfn[i](); |
||||
} |
||||
readyfn = []; |
||||
} |
||||
|
||||
// Fire any function calls on loaded event
|
||||
function fireLoaded() { |
||||
var i; |
||||
pageloaded = true; |
||||
// For browsers with no DOM loaded support
|
||||
if (!domready) { |
||||
fireReady(); |
||||
} |
||||
for (i = 0; i < loadedfn.length; i += 1) { |
||||
loadedfn[i](); |
||||
} |
||||
loadedfn = []; |
||||
} |
||||
|
||||
// Check DOM ready, page loaded
|
||||
if (d.addEventListener) { |
||||
// Standards
|
||||
d.addEventListener('DOMContentLoaded', fireReady, false); |
||||
w.addEventListener('load', fireLoaded, false); |
||||
} else if (d.attachEvent) { |
||||
// IE
|
||||
d.attachEvent('onreadystatechange', fireReady); |
||||
// IE < 9
|
||||
w.attachEvent('onload', fireLoaded); |
||||
} else { |
||||
// Anything else
|
||||
w.onload = fireLoaded; |
||||
} |
||||
|
||||
// Utility functions
|
||||
|
||||
// Loop through node array
|
||||
function nodeLoop(fn, nodes) { |
||||
var i; |
||||
// Good idea to walk up the DOM
|
||||
for (i = nodes.length - 1; i >= 0; i -= 1) { |
||||
fn(nodes[i]); |
||||
} |
||||
} |
||||
|
||||
// Convert to camel case
|
||||
function cssCamel(property) { |
||||
return property.replace(/-\w/g, function (result) {return result.charAt(1).toUpperCase(); }); |
||||
} |
||||
|
||||
// Get computed style
|
||||
function computeStyle(elm, property) { |
||||
// IE, everything else or null
|
||||
return (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null; |
||||
|
||||
} |
||||
|
||||
// Returns URI encoded query string pair
|
||||
function queryPair(name, value) { |
||||
return encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+'); |
||||
} |
||||
|
||||
// Set CSS, important to wrap in try to prevent error thown on unsupported property
|
||||
function setCss(elm, property, value) { |
||||
try { |
||||
elm.style[cssCamel(property)] = value; |
||||
} catch (e) {} |
||||
} |
||||
|
||||
// Show CSS
|
||||
function showCss(elm) { |
||||
elm.style.display = ''; |
||||
// For elements still hidden by style block
|
||||
if (computeStyle(elm, 'display') === 'none') { |
||||
elm.style.display = 'block'; |
||||
} |
||||
} |
||||
|
||||
// Serialize form & JSON values
|
||||
function serializeData(nodes) { |
||||
var querystring = '', subelm, i, j; |
||||
if (nodes.constructor === Object) { // Serialize JSON data
|
||||
for (subelm in nodes) { |
||||
if (nodes.hasOwnProperty(subelm)) { |
||||
if (nodes[subelm].constructor === Array) { |
||||
for (i = 0; i < nodes[subelm].length; i += 1) { |
||||
querystring += '&' + queryPair(subelm, nodes[subelm][i]); |
||||
} |
||||
} else { |
||||
querystring += '&' + queryPair(subelm, nodes[subelm]); |
||||
} |
||||
} |
||||
} |
||||
} else { // Serialize node data
|
||||
nodeLoop(function (elm) { |
||||
if (elm.nodeName === 'FORM') { |
||||
for (i = 0; i < elm.elements.length; i += 1) { |
||||
subelm = elm.elements[i]; |
||||
|
||||
if (!subelm.disabled) { |
||||
switch (subelm.type) { |
||||
// Ignore buttons, unsupported XHR 1 form fields
|
||||
case 'button': |
||||
case 'image': |
||||
case 'file': |
||||
case 'submit': |
||||
case 'reset': |
||||
break; |
||||
|
||||
case 'select-one': |
||||
if (subelm.length > 0) { |
||||
querystring += '&' + queryPair(subelm.name, subelm.value); |
||||
} |
||||
break; |
||||
|
||||
case 'select-multiple': |
||||
for (j = 0; j < subelm.length; j += 1) { |
||||
if (subelm[j].selected) { |
||||
querystring += '&' + queryPair(subelm.name, subelm[j].value); |
||||
} |
||||
} |
||||
break; |
||||
|
||||
case 'checkbox': |
||||
case 'radio': |
||||
if (subelm.checked) { |
||||
querystring += '&' + queryPair(subelm.name, subelm.value); |
||||
} |
||||
break; |
||||
|
||||
// Everything else including shinny new HTML5 input types
|
||||
default: |
||||
querystring += '&' + queryPair(subelm.name, subelm.value); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}, nodes); |
||||
} |
||||
// Tidy up first &
|
||||
return (querystring.length > 0) ? querystring.substring(1) : ''; |
||||
} |
||||
|
||||
// Class helper
|
||||
function classHelper(classes, action, nodes) { |
||||
var classarray, search, i, has = false; |
||||
if (classes) { |
||||
// Trim any whitespace
|
||||
classarray = classes.split(/\s+/); |
||||
nodeLoop(function (elm) { |
||||
for (i = 0; i < classarray.length; i += 1) { |
||||
search = new RegExp('\\b' + classarray[i] + '\\b', 'g'); |
||||
if (action === 'remove') { |
||||
elm.className = elm.className.replace(search, ''); |
||||
} else if (action === 'toggle') { |
||||
elm.className = (elm.className.match(search)) ? elm.className.replace(search, '') : elm.className + ' ' + classarray[i]; |
||||
} else if (action === 'has') { |
||||
if (elm.className.match(search)) { |
||||
has = true; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
}, nodes); |
||||
} |
||||
return has; |
||||
} |
||||
|
||||
// HTML insertion helper
|
||||
function insertHtml(value, position, nodes) { |
||||
var tmpnodes, tmpnode; |
||||
if (value) { |
||||
nodeLoop(function (elm) { |
||||
// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead
|
||||
// Convert string to node. We can't innerHTML on a document fragment
|
||||
tmpnodes = d.createElement('div'); |
||||
tmpnodes.innerHTML = value; |
||||
while ((tmpnode = tmpnodes.lastChild) !== null) { |
||||
// Catch error in unlikely case elm has been removed
|
||||
try { |
||||
if (position === 'before') { |
||||
elm.parentNode.insertBefore(tmpnode, elm); |
||||
} else if (position === 'after') { |
||||
elm.parentNode.insertBefore(tmpnode, elm.nextSibling); |
||||
} else if (position === 'append') { |
||||
elm.appendChild(tmpnode); |
||||
} else if (position === 'prepend') { |
||||
elm.insertBefore(tmpnode, elm.firstChild); |
||||
} |
||||
} catch (e) {break; } |
||||
} |
||||
}, nodes); |
||||
} |
||||
} |
||||
|
||||
// Get nodes and return chibi
|
||||
function chibi(selector) { |
||||
var cb, nodes = [], json = false, nodelist, i; |
||||
|
||||
if (selector) { |
||||
|
||||
// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support
|
||||
if (selector.nodeType && selector.nodeType === 1) { |
||||
nodes = [selector]; // return element as node list
|
||||
} else if (typeof selector === 'object') { |
||||
// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support
|
||||
json = (typeof selector.length !== 'number'); |
||||
nodes = selector; |
||||
} else if (typeof selector === 'string') { |
||||
|
||||
// A very light querySelectorAll polyfill for IE < 8. It suits my needs but is restricted to IE CSS support, is no speed demon, and does leave older mobile browsers in the cold (that support neither querySelectorAll nor currentStyle/getComputedStyle). If you want to use a fuller featured selector engine like Qwery, Sizzle et al, just return results to the nodes array: nodes = altselectorengine(selector)
|
||||
|
||||
// IE < 8
|
||||
if (!d.querySelectorAll) { |
||||
// Polyfill querySelectorAll
|
||||
d.querySelectorAll = function (selector) { |
||||
|
||||
var style, head = d.getElementsByTagName('head')[0], allnodes, selectednodes = [], i; |
||||
|
||||
style = d.createElement('STYLE'); |
||||
style.type = 'text/css'; |
||||
|
||||
if (style.styleSheet) { |
||||
style.styleSheet.cssText = selector + ' {a:b}'; |
||||
|
||||
head.appendChild(style); |
||||
|
||||
allnodes = d.getElementsByTagName('*'); |
||||
|
||||
for (i = 0; i < allnodes.length; i += 1) { |
||||
if (computeStyle(allnodes[i], 'a') === 'b') { |
||||
selectednodes.push(allnodes[i]); |
||||
} |
||||
} |
||||
|
||||
head.removeChild(style); |
||||
} |
||||
|
||||
return selectednodes; |
||||
}; |
||||
} |
||||
|
||||
nodelist = d.querySelectorAll(selector); |
||||
|
||||
// Convert node list to array so results have full access to array methods
|
||||
// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway
|
||||
for (i = 0; i < nodelist.length; i += 1) { |
||||
nodes[i] = nodelist[i]; |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
// Only attach nodes if not JSON
|
||||
cb = json ? {} : nodes; |
||||
|
||||
// Public functions
|
||||
|
||||
// Fire on DOM ready
|
||||
cb.ready = function (fn) { |
||||
if (fn) { |
||||
if (domready) { |
||||
fn(); |
||||
return cb; |
||||
} else { |
||||
readyfn.push(fn); |
||||
} |
||||
} |
||||
}; |
||||
// Fire on page loaded
|
||||
cb.loaded = function (fn) { |
||||
if (fn) { |
||||
if (pageloaded) { |
||||
fn(); |
||||
return cb; |
||||
} else { |
||||
loadedfn.push(fn); |
||||
} |
||||
} |
||||
}; |
||||
// Executes a function on nodes
|
||||
cb.each = function (fn) { |
||||
if (typeof fn === 'function') { |
||||
nodeLoop(function (elm) { |
||||
// <= IE 8 loses scope so need to apply
|
||||
return fn.apply(elm, arguments); |
||||
}, nodes); |
||||
} |
||||
return cb; |
||||
}; |
||||
// Find first
|
||||
cb.first = function () { |
||||
return chibi(nodes.shift()); |
||||
}; |
||||
// Find last
|
||||
cb.last = function () { |
||||
return chibi(nodes.pop()); |
||||
}; |
||||
// Find odd
|
||||
cb.odd = function () { |
||||
var odds = [], i; |
||||
for (i = 0; i < nodes.length; i += 2) { |
||||
odds.push(nodes[i]); |
||||
} |
||||
return chibi(odds); |
||||
}; |
||||
// Find even
|
||||
cb.even = function () { |
||||
var evens = [], i; |
||||
for (i = 1; i < nodes.length; i += 2) { |
||||
evens.push(nodes[i]); |
||||
} |
||||
return chibi(evens); |
||||
}; |
||||
// Hide node
|
||||
cb.hide = function () { |
||||
nodeLoop(function (elm) { |
||||
elm.style.display = 'none'; |
||||
}, nodes); |
||||
return cb; |
||||
}; |
||||
// Show node
|
||||
cb.show = function () { |
||||
nodeLoop(function (elm) { |
||||
showCss(elm); |
||||
}, nodes); |
||||
return cb; |
||||
}; |
||||
// Toggle node display
|
||||
cb.toggle = function (state) { |
||||
if (typeof state != 'undefined') { // ADDED
|
||||
if(state) |
||||
cb.show(); |
||||
else |
||||
cb.hide(); |
||||
} else { |
||||
nodeLoop(function (elm) { |
||||
// computeStyle instead of style.display == 'none' catches elements that are hidden via style block
|
||||
if (computeStyle(elm, 'display') === 'none') { |
||||
showCss(elm); |
||||
} else { |
||||
elm.style.display = 'none'; |
||||
} |
||||
|
||||
}, nodes); |
||||
} |
||||
return cb; |
||||
}; |
||||
// Remove node
|
||||
cb.remove = function () { |
||||
nodeLoop(function (elm) { |
||||
// Catch error in unlikely case elm has been removed
|
||||
try { |
||||
elm.parentNode.removeChild(elm); |
||||
} catch (e) {} |
||||
}, nodes); |
||||
return chibi(); |
||||
}; |
||||
// Get/Set CSS
|
||||
cb.css = function (property, value) { |
||||
if (property) { |
||||
if (value || value === '') { |
||||
nodeLoop(function (elm) { |
||||
setCss(elm, property, value); |
||||
}, nodes); |
||||
return cb; |
||||
} |
||||
if (nodes[0]) { |
||||
if (nodes[0].style[cssCamel(property)]) { |
||||
return nodes[0].style[cssCamel(property)]; |
||||
} |
||||
if (computeStyle(nodes[0], property)) { |
||||
return computeStyle(nodes[0], property); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
// Get class(es)
|
||||
cb.getClass = function () { |
||||
if (nodes[0] && nodes[0].className.length > 0) { |
||||
// Weak IE trim support
|
||||
return nodes[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '').replace(/\s+/,' '); |
||||
} |
||||
}; |
||||
// Set (replaces) classes
|
||||
cb.setClass = function (classes) { |
||||
if (classes || classes === '') { |
||||
nodeLoop(function (elm) { |
||||
elm.className = classes; |
||||
}, nodes); |
||||
} |
||||
return cb; |
||||
}; |
||||
// Add class
|
||||
cb.addClass = function (classes) { |
||||
if (classes) { |
||||
nodeLoop(function (elm) { |
||||
elm.className += ' ' + classes; |
||||
}, nodes); |
||||
} |
||||
return cb; |
||||
}; |
||||
// Remove class
|
||||
cb.removeClass = function (classes) { |
||||
classHelper(classes, 'remove', nodes); |
||||
return cb; |
||||
}; |
||||
// Toggle class
|
||||
cb.toggleClass = function (classes) { |
||||
classHelper(classes, 'toggle', nodes); |
||||
return cb; |
||||
}; |
||||
// Has class
|
||||
cb.hasClass = function (classes) { |
||||
return classHelper(classes, 'has', nodes); |
||||
}; |
||||
// Get/set HTML
|
||||
cb.html = function (value) { |
||||
if (value || value === '') { |
||||
nodeLoop(function (elm) { |
||||
elm.innerHTML = value; |
||||
}, nodes); |
||||
return cb; |
||||
} |
||||
if (nodes[0]) { |
||||
return nodes[0].innerHTML; |
||||
} |
||||
}; |
||||
// Insert HTML before selector
|
||||
cb.htmlBefore = function (value) { |
||||
insertHtml(value, 'before', nodes); |
||||
return cb; |
||||
}; |
||||
// Insert HTML after selector
|
||||
cb.htmlAfter = function (value) { |
||||
insertHtml(value, 'after', nodes); |
||||
return cb; |
||||
}; |
||||
// Insert HTML after selector innerHTML
|
||||
cb.htmlAppend = function (value) { |
||||
insertHtml(value, 'append', nodes); |
||||
return cb; |
||||
}; |
||||
// Insert HTML before selector innerHTML
|
||||
cb.htmlPrepend = function (value) { |
||||
insertHtml(value, 'prepend', nodes); |
||||
return cb; |
||||
}; |
||||
// Get/Set HTML attributes
|
||||
cb.attr = function (property, value) { |
||||
if (property) { |
||||
property = property.toLowerCase(); |
||||
// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway
|
||||
if (typeof value !== 'undefined') {//FIXED BUG HERE
|
||||
nodeLoop(function (elm) { |
||||
if (property === 'style') { |
||||
elm.style.cssText = value; |
||||
} else if (property === 'class') { |
||||
elm.className = value; |
||||
} else { |
||||
elm.setAttribute(property, value); |
||||
} |
||||
}, nodes); |
||||
return cb; |
||||
} |
||||
if (nodes[0]) { |
||||
if (property === 'style') { |
||||
if (nodes[0].style.cssText) { |
||||
return nodes[0].style.cssText; |
||||
} |
||||
} else if (property === 'class') { |
||||
if (nodes[0].className) { |
||||
return nodes[0].className; |
||||
} |
||||
} else { |
||||
if (nodes[0].getAttribute(property)) { |
||||
return nodes[0].getAttribute(property); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
// Get/Set HTML data property
|
||||
cb.data = function (key, value) { |
||||
if (key) { |
||||
return cb.attr('data-'+key, value); |
||||
} |
||||
}; |
||||
// Get/Set form element values
|
||||
cb.val = function (value) { |
||||
var values, i, j; |
||||
if (value || value === '') { |
||||
nodeLoop(function (elm) { |
||||
switch (elm.nodeName) { |
||||
case 'SELECT': |
||||
if (typeof value === 'string' || typeof value === 'number') { |
||||
value = [value]; |
||||
} |
||||
for (i = 0; i < elm.length; i += 1) { |
||||
// Multiple select
|
||||
for (j = 0; j < value.length; j += 1) { |
||||
elm[i].selected = ''; |
||||
if (elm[i].value === value[j]) { |
||||
elm[i].selected = 'selected'; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
break; |
||||
case 'INPUT': |
||||
case 'TEXTAREA': |
||||
case 'BUTTON': |
||||
elm.value = value; |
||||
break; |
||||
} |
||||
}, nodes); |
||||
|
||||
return cb; |
||||
} |
||||
if (nodes[0]) { |
||||
switch (nodes[0].nodeName) { |
||||
case 'SELECT': |
||||
values = []; |
||||
for (i = 0; i < nodes[0].length; i += 1) { |
||||
if (nodes[0][i].selected) { |
||||
values.push(nodes[0][i].value); |
||||
} |
||||
} |
||||
return (values.length > 1) ? values : values[0]; |
||||
case 'INPUT': |
||||
case 'TEXTAREA': |
||||
case 'BUTTON': |
||||
return nodes[0].value; |
||||
} |
||||
} |
||||
}; |
||||
// Return matching checked checkbox or radios
|
||||
cb.checked = function (check) { |
||||
if (typeof check === 'boolean') { |
||||
nodeLoop(function (elm) { |
||||
if (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) { |
||||
elm.checked = check; |
||||
} |
||||
}, nodes); |
||||
return cb; |
||||
} |
||||
if (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) { |
||||
return (!!nodes[0].checked); |
||||
} |
||||
}; |
||||
// Add event handler
|
||||
cb.on = function (event, fn) { |
||||
if (selector === w || selector === d) { |
||||
nodes = [selector]; |
||||
} |
||||
nodeLoop(function (elm) { |
||||
if (d.addEventListener) { |
||||
elm.addEventListener(event, fn, false); |
||||
} else if (d.attachEvent) { |
||||
// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)
|
||||
elm[event + fn] = function () { return fn.apply(elm, arguments); }; |
||||
elm.attachEvent('on' + event, elm[event + fn]); |
||||
} |
||||
}, nodes); |
||||
return cb; |
||||
}; |
||||
// Remove event handler
|
||||
cb.off = function (event, fn) { |
||||
if (selector === w || selector === d) { |
||||
nodes = [selector]; |
||||
} |
||||
nodeLoop(function (elm) { |
||||
if (d.addEventListener) { |
||||
elm.removeEventListener(event, fn, false); |
||||
} else if (d.attachEvent) { |
||||
elm.detachEvent('on' + event, elm[event + fn]); |
||||
// Tidy up
|
||||
elm[event + fn] = null; |
||||
} |
||||
}, nodes); |
||||
return cb; |
||||
}; |
||||
// Basic XHR 1, no file support. Shakes fist at IE
|
||||
cb.ajax = function (url, method, callback, nocache, nojsonp) { |
||||
var xhr, |
||||
query = serializeData(nodes), |
||||
type = (method) ? method.toUpperCase() : 'GET', |
||||
hostsearch = new RegExp('http[s]?://(.*?)/', 'gi'), |
||||
domain = hostsearch.exec(url), |
||||
timestamp = '_ts=' + (+new Date()), |
||||
head = d.getElementsByTagName('head')[0], |
||||
jsonpcallback = 'chibi' + (+new Date()) + (jsonpcount += 1), |
||||
script; |
||||
|
||||
if (query && (type === 'GET' || type === 'DELETE')) { |
||||
url += (url.indexOf('?') === -1) ? '?' + query : '&' + query; |
||||
query = null; |
||||
} |
||||
|
||||
// JSONP if cross domain url
|
||||
if (type === 'GET' && !nojsonp && domain && w.location.host !== domain[1]) { |
||||
|
||||
if (nocache) { |
||||
url += (url.indexOf('?') === -1) ? '?' + timestamp : '&' + timestamp; |
||||
} |
||||
|
||||
// Replace possible encoded ?
|
||||
url = url.replace('=%3F', '=?'); |
||||
|
||||
// Replace jsonp ? with callback
|
||||
if (callback && url.indexOf('=?') !== -1) { |
||||
|
||||
url = url.replace('=?', '=' + jsonpcallback); |
||||
|
||||
w[jsonpcallback] = function (data) { |
||||
try { |
||||
callback(data, 200); |
||||
} catch (e) {} |
||||
|
||||
// Tidy up
|
||||
w[jsonpcallback] = undefined; |
||||
}; |
||||
} |
||||
|
||||
// JSONP
|
||||
script = document.createElement('script'); |
||||
script.async = true; |
||||
script.src = url; |
||||
|
||||
// Tidy up
|
||||
script.onload = function () { |
||||
head.removeChild(script); |
||||
}; |
||||
|
||||
head.appendChild(script); |
||||
|
||||
} else { |
||||
|
||||
if (w.XMLHttpRequest) { |
||||
xhr = new XMLHttpRequest(); |
||||
} else if (w.ActiveXObject) { |
||||
xhr = new ActiveXObject('Microsoft.XMLHTTP'); // IE < 9
|
||||
} |
||||
|
||||
if (xhr) { |
||||
|
||||
if (nocache) { |
||||
url += (url.indexOf('?') === -1) ? '?' + timestamp : '&' + timestamp; |
||||
} |
||||
|
||||
// Douglas Crockford: "Synchronous programming is disrespectful and should not be employed in applications which are used by people"
|
||||
xhr.open(type, url, true); |
||||
|
||||
xhr.onreadystatechange = function () { |
||||
if (xhr.readyState === 4) { |
||||
if (callback) { |
||||
callback(xhr.responseText, xhr.status); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); |
||||
|
||||
if (type === 'POST' || type === 'PUT') { |
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); |
||||
} |
||||
|
||||
xhr.send(query); |
||||
|
||||
} |
||||
} |
||||
return cb; |
||||
}; |
||||
// Alias to cb.ajax(url, 'get', callback, nocache, nojsonp)
|
||||
cb.get = function (url, callback, nocache, nojsonp) { |
||||
return cb.ajax(url, 'get', callback, nocache, nojsonp); |
||||
}; |
||||
// Alias to cb.ajax(url, 'post', callback, nocache)
|
||||
cb.post = function (url, callback, nocache) { |
||||
return cb.ajax(url, 'post', callback, nocache); |
||||
}; |
||||
|
||||
return cb; |
||||
} |
||||
|
||||
// Set Chibi's global namespace here ($)
|
||||
w.$ = chibi; |
||||
|
||||
}()); |
||||
|
||||
//# sourceMappingURL=all.min.js.map
|
@ -0,0 +1,38 @@ |
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||
|
||||
<title>Home - Current analyzer</title> |
||||
|
||||
<link href="/css/app.css" rel="stylesheet"> |
||||
|
||||
<!-- IE8 support (not tested) --> |
||||
<!--[if lt IE 9]> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> |
||||
<![endif]--> |
||||
|
||||
<script src="/js/all.min.js"></script> |
||||
</head> |
||||
<body> |
||||
<div id="outer"> |
||||
<nav id="menu"> |
||||
<div id="brand" onclick="$('#menu').toggleClass('expanded')">Current analyzer</div> |
||||
<a href="/" class="selected">Home</a><a href="/wifi">WiFi config</a><a href="/fft">FFT</a><a href="/spectrogram">Spectrogram</a><a href="/transient">Power-on transient</a><a href="/about">Credits & About</a></nav> |
||||
<div id="content"> |
||||
|
||||
<h1>System Status</h1> |
||||
|
||||
<div class="Box">This page was shown %counter% times.</div> |
||||
|
||||
<script> |
||||
$().ready(initDef); |
||||
</script> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,75 @@ |
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||
|
||||
<title>WiFi config - Current analyzer</title> |
||||
|
||||
<link href="/css/app.css" rel="stylesheet"> |
||||
|
||||
<!-- IE8 support (not tested) --> |
||||
<!--[if lt IE 9]> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> |
||||
<![endif]--> |
||||
|
||||
<script src="/js/all.min.js"></script> |
||||
</head> |
||||
<body> |
||||
<div id="outer"> |
||||
<nav id="menu"> |
||||
<div id="brand" onclick="$('#menu').toggleClass('expanded')">Current analyzer</div> |
||||
<a href="/">Home</a><a href="/wifi" class="selected">WiFi config</a><a href="/fft">FFT</a><a href="/spectrogram">Spectrogram</a><a href="/transient">Power-on transient</a><a href="/about">Credits & About</a></nav> |
||||
<div id="content"> |
||||
|
||||
<h1>Wireless Setup</h1> |
||||
|
||||
<div class="Box"> |
||||
<table> |
||||
<tbody> |
||||
<tr> |
||||
<th>WiFi mode:</th> |
||||
<td>%WiFiMode%</td> |
||||
</tr> |
||||
<tr> |
||||
<th>Note:</th> |
||||
<td>%WiFiapwarn%</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
|
||||
</div> |
||||
|
||||
<div class="Box" id="ap-box"> |
||||
<h2>Select AP to join</h2> |
||||
<div id="ap-loader">Scanning<span class="anim-dots">.</span></div> |
||||
<div id="ap-list" style="display:none"></div> |
||||
</div> |
||||
|
||||
<script> |
||||
// Current SSID |
||||
wifi.current = '%currSsid%'; |
||||
$().ready(wifi.init); |
||||
</script> |
||||
|
||||
<div class="Modal hidden" id="psk-modal"> |
||||
<div class="Dialog"> |
||||
<form action="/wifi/connect.cgi" method="post" id="conn-form"> |
||||
<input type="hidden" id="conn-essid" name="essid"><!-- |
||||
--><label for="psk">Password:</label><!-- |
||||
--><input type="password" id="conn-passwd" name="passwd"><!-- |
||||
--><input type="submit" value="Connect!"> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
<script> |
||||
$().ready(initDef); |
||||
</script> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,38 @@ |
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||
|
||||
<title>Home - Current analyzer</title> |
||||
|
||||
<link href="/css/app.css" rel="stylesheet"> |
||||
|
||||
<!-- IE8 support (not tested) --> |
||||
<!--[if lt IE 9]> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> |
||||
<![endif]--> |
||||
|
||||
<script src="/js/all.min.js"></script> |
||||
</head> |
||||
<body> |
||||
<div id="outer"> |
||||
<nav id="menu"> |
||||
<div id="brand" onclick="$('#menu').toggleClass('expanded')">Current analyzer</div> |
||||
<a href="/" class="selected">Home</a><a href="/wifi">WiFi config</a><a href="/fft">FFT</a><a href="/spectrogram">Spectrogram</a><a href="/transient">Power-on transient</a><a href="/about">Credits & About</a></nav> |
||||
<div id="content"> |
||||
|
||||
<h1>System Status</h1> |
||||
|
||||
<div class="Box">TODO</div> |
||||
|
||||
<script> |
||||
$().ready(initDef); |
||||
</script> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,14 @@ |
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head><title>ESP8266 web server</title> |
||||
<link rel="stylesheet" type="text/css" href="style.css"> |
||||
</head> |
||||
<body> |
||||
<div id="main"> |
||||
<h1>Multipart</h1> |
||||
|
||||
<nav> |
||||
<ul> |
||||
%numbers% |
||||
</ul> |
||||
</body></html> |
@ -0,0 +1,17 @@ |
||||
|
||||
body { |
||||
background-color: #404040; |
||||
font-family: sans-serif; |
||||
} |
||||
|
||||
#main { |
||||
background-color: #d0d0FF; |
||||
-moz-border-radius: 5px; |
||||
-webkit-border-radius: 5px; |
||||
border-radius: 5px; |
||||
border: 2px solid #000000; |
||||
width: 800px; |
||||
margin: 0 auto; |
||||
padding: 20px |
||||
} |
||||
|
@ -0,0 +1,75 @@ |
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||
|
||||
<title>WiFi config - Current analyzer</title> |
||||
|
||||
<link href="/css/app.css" rel="stylesheet"> |
||||
|
||||
<!-- IE8 support (not tested) --> |
||||
<!--[if lt IE 9]> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> |
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> |
||||
<![endif]--> |
||||
|
||||
<script src="/js/all.min.js"></script> |
||||
</head> |
||||
<body> |
||||
<div id="outer"> |
||||
<nav id="menu"> |
||||
<div id="brand" onclick="$('#menu').toggleClass('expanded')">Current analyzer</div> |
||||
<a href="/">Home</a><a href="/wifi" class="selected">WiFi config</a><a href="/fft">FFT</a><a href="/spectrogram">Spectrogram</a><a href="/transient">Power-on transient</a><a href="/about">Credits & About</a></nav> |
||||
<div id="content"> |
||||
|
||||
<h1>Wireless Setup</h1> |
||||
|
||||
<div class="Box"> |
||||
<table> |
||||
<tbody> |
||||
<tr> |
||||
<th>WiFi mode:</th> |
||||
<td>%WiFiMode%</td> |
||||
</tr> |
||||
<tr> |
||||
<th>Note:</th> |
||||
<td>%WiFiapwarn%</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
|
||||
</div> |
||||
|
||||
<div class="Box" id="ap-box"> |
||||
<h2>Select AP to join</h2> |
||||
<div id="ap-loader">Scanning<span class="anim-dots">.</span></div> |
||||
<div id="ap-list" style="display:none"></div> |
||||
</div> |
||||
|
||||
<script> |
||||
// Current SSID |
||||
wifi.current = '%currSsid%'; |
||||
$().ready(wifi.init); |
||||
</script> |
||||
|
||||
<div class="Modal hidden" id="psk-modal"> |
||||
<div class="Dialog"> |
||||
<form action="/wifi/connect.cgi" method="post" id="conn-form"> |
||||
<input type="hidden" id="conn-essid" name="essid"><!-- |
||||
--><label for="psk">Password:</label><!-- |
||||
--><input type="password" id="conn-passwd" name="passwd"><!-- |
||||
--><input type="submit" value="Connect!"> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
<script> |
||||
$().ready(initDef); |
||||
</script> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,2 @@ |
||||
var t=function(a,b){return function(c,d){return a.replace(/#{([^}]*)}/g,function(a,f){return Function("x","with(x)return "+f).call(c,d||b||{})})}},s=function(a,b){return b?{get:function(c){return a[c]&&b.parse(a[c])},set:function(c,d){a[c]=b.stringify(d)}}:{}}(this.localStorage||{},JSON),p=function(a,b,c,d){c=c||document;d=c[b="on"+b];a=c[b]=function(e){d=d&&d(e=e||c.event);return(a=a&&b(e))?b:d};c=this},m=function(a,b,c){b=document;c=b.createElement("p");c.innerHTML=a;for(a=b.createDocumentFragment();b= |
||||
c.firstChild;)a.appendChild(b);return a},$=function(a,b){a=a.match(/^(\W)?(.*)/);return(b||document)["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2])},j=function(a){for(a=0;a<4;a++)try{return a?new ActiveXObject([,"Msxml2","Msxml3","Microsoft"][a]+".XMLHTTP"):new XMLHttpRequest}catch(b){}}; |
@ -0,0 +1,43 @@ |
||||
<html><head><title>Connecting...</title> |
||||
<link rel="stylesheet" type="text/css" href="style.css"> |
||||
<script type="text/javascript" src="140medley.min.js"></script> |
||||
<script type="text/javascript"> |
||||
|
||||
var xhr=j(); |
||||
|
||||
|
||||
function getStatus() { |
||||
xhr.open("GET", "connstatus.cgi"); |
||||
xhr.onreadystatechange=function() { |
||||
if (xhr.readyState==4 && xhr.status>=200 && xhr.status<300) { |
||||
var data=JSON.parse(xhr.responseText); |
||||
if (data.status=="idle") { |
||||
$("#status").innerHTML="Preparing to connect..."; |
||||
window.setTimeout(getStatus, 1000); |
||||
} else if (data.status=="success") { |
||||
$("#status").innerHTML="Connected! Got IP "+data.ip+". If you're in the same network, you can access it <a href=\"http://"+data.ip+"/\">here</a>."; |
||||
} else if (data.status=="working") { |
||||
$("#status").innerHTML="Trying to connect to selected access point..."; |
||||
window.setTimeout(getStatus, 1000); |
||||
} else if (data.status=="fail") { |
||||
$("#status").innerHTML="Connection failed. Check password and selected AP.<br /><a href=\"wifi.tpl\">Go Back</a>"; |
||||
} |
||||
} |
||||
} |
||||
xhr.send(); |
||||
} |
||||
|
||||
window.onload=function(e) { |
||||
getStatus(); |
||||
}; |
||||
</script> |
||||
</head> |
||||
<body> |
||||
<div id="main"> |
||||
<h2>Connecting to AP...</h2> |
||||
<p>Status:<br /> |
||||
<div id="status">...</div> |
||||
</p> |
||||
</div> |
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 714 B |
@ -0,0 +1,24 @@ |
||||
|
||||
body { |
||||
background-color: #404040; |
||||
font-family: sans-serif; |
||||
} |
||||
|
||||
#main { |
||||
background-color: #d0d0FF; |
||||
-moz-border-radius: 5px; |
||||
-webkit-border-radius: 5px; |
||||
border-radius: 5px; |
||||
border: 2px solid #000000; |
||||
width: 800px; |
||||
margin: 0 auto; |
||||
padding: 20px |
||||
} |
||||
|
||||
.icon { |
||||
background-image: url("icons.png"); |
||||
background-color: transparent; |
||||
width: 32px; |
||||
height: 32px; |
||||
display: inline-block; |
||||
} |
Loading…
Reference in new issue