New Addon
Google BK
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
/*! URI.js v1.19.2 http://medialize.github.io/URI.js/ */
|
||||
/* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URITemplate.js */
|
||||
(function(f,n){"object"===typeof module&&module.exports?module.exports=n():"function"===typeof define&&define.amd?define(n):f.IPv6=n(f)})(this,function(f){var n=f&&f.IPv6;return{best:function(h){h=h.toLowerCase().split(":");var k=h.length,b=8;""===h[0]&&""===h[1]&&""===h[2]?(h.shift(),h.shift()):""===h[0]&&""===h[1]?h.shift():""===h[k-1]&&""===h[k-2]&&h.pop();k=h.length;-1!==h[k-1].indexOf(".")&&(b=7);var q;for(q=0;q<k&&""!==h[q];q++);if(q<b)for(h.splice(q,1,"0000");h.length<b;)h.splice(q,0,"0000");
|
||||
for(q=0;q<b;q++){k=h[q].split("");for(var f=0;3>f;f++)if("0"===k[0]&&1<k.length)k.splice(0,1);else break;h[q]=k.join("")}k=-1;var n=f=0,g=-1,p=!1;for(q=0;q<b;q++)p?"0"===h[q]?n+=1:(p=!1,n>f&&(k=g,f=n)):"0"===h[q]&&(p=!0,g=q,n=1);n>f&&(k=g,f=n);1<f&&h.splice(k,f,"");k=h.length;b="";""===h[0]&&(b=":");for(q=0;q<k;q++){b+=h[q];if(q===k-1)break;b+=":"}""===h[k-1]&&(b+=":");return b},noConflict:function(){f.IPv6===this&&(f.IPv6=n);return this}}});
|
||||
(function(f){function n(b){throw new RangeError(w[b]);}function h(b,e){for(var g=b.length,h=[];g--;)h[g]=e(b[g]);return h}function k(b,e){var g=b.split("@"),f="";1<g.length&&(f=g[0]+"@",b=g[1]);b=b.replace(C,".");g=b.split(".");g=h(g,e).join(".");return f+g}function b(b){for(var e=[],g=0,h=b.length,f,a;g<h;)f=b.charCodeAt(g++),55296<=f&&56319>=f&&g<h?(a=b.charCodeAt(g++),56320==(a&64512)?e.push(((f&1023)<<10)+(a&1023)+65536):(e.push(f),g--)):e.push(f);return e}function q(b){return h(b,function(b){var e=
|
||||
"";65535<b&&(b-=65536,e+=t(b>>>10&1023|55296),b=56320|b&1023);return e+=t(b)}).join("")}function z(b,e){return b+22+75*(26>b)-((0!=e)<<5)}function u(b,g,h){var f=0;b=h?e(b/700):b>>1;for(b+=e(b/g);455<b;f+=36)b=e(b/35);return e(f+36*b/(b+38))}function g(b){var g=[],h=b.length,f=0,k=128,a=72,c,d;var l=b.lastIndexOf("-");0>l&&(l=0);for(c=0;c<l;++c)128<=b.charCodeAt(c)&&n("not-basic"),g.push(b.charCodeAt(c));for(l=0<l?l+1:0;l<h;){c=f;var m=1;for(d=36;;d+=36){l>=h&&n("invalid-input");var x=b.charCodeAt(l++);
|
||||
x=10>x-48?x-22:26>x-65?x-65:26>x-97?x-97:36;(36<=x||x>e((2147483647-f)/m))&&n("overflow");f+=x*m;var p=d<=a?1:d>=a+26?26:d-a;if(x<p)break;x=36-p;m>e(2147483647/x)&&n("overflow");m*=x}m=g.length+1;a=u(f-c,m,0==c);e(f/m)>2147483647-k&&n("overflow");k+=e(f/m);f%=m;g.splice(f++,0,k)}return q(g)}function p(g){var h,f,k,p=[];g=b(g);var a=g.length;var c=128;var d=0;var l=72;for(k=0;k<a;++k){var m=g[k];128>m&&p.push(t(m))}for((h=f=p.length)&&p.push("-");h<a;){var x=2147483647;for(k=0;k<a;++k)m=g[k],m>=c&&
|
||||
m<x&&(x=m);var q=h+1;x-c>e((2147483647-d)/q)&&n("overflow");d+=(x-c)*q;c=x;for(k=0;k<a;++k)if(m=g[k],m<c&&2147483647<++d&&n("overflow"),m==c){var r=d;for(x=36;;x+=36){m=x<=l?1:x>=l+26?26:x-l;if(r<m)break;var A=r-m;r=36-m;p.push(t(z(m+A%r,0)));r=e(A/r)}p.push(t(z(r,0)));l=u(d,q,h==f);d=0;++h}++d;++c}return p.join("")}var D="object"==typeof exports&&exports&&!exports.nodeType&&exports,A="object"==typeof module&&module&&!module.nodeType&&module,B="object"==typeof global&&global;if(B.global===B||B.window===
|
||||
B||B.self===B)f=B;var E=/^xn--/,r=/[^\x20-\x7E]/,C=/[\x2E\u3002\uFF0E\uFF61]/g,w={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},e=Math.floor,t=String.fromCharCode,y;var v={version:"1.3.2",ucs2:{decode:b,encode:q},decode:g,encode:p,toASCII:function(b){return k(b,function(b){return r.test(b)?"xn--"+p(b):b})},toUnicode:function(b){return k(b,function(b){return E.test(b)?g(b.slice(4).toLowerCase()):
|
||||
b})}};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return v});else if(D&&A)if(module.exports==D)A.exports=v;else for(y in v)v.hasOwnProperty(y)&&(D[y]=v[y]);else f.punycode=v})(this);
|
||||
(function(f,n){"object"===typeof module&&module.exports?module.exports=n():"function"===typeof define&&define.amd?define(n):f.SecondLevelDomains=n(f)})(this,function(f){var n=f&&f.SecondLevelDomains,h={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",
|
||||
bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",
|
||||
ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ","do":" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",
|
||||
es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",
|
||||
id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ","in":" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",
|
||||
kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",
|
||||
mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",
|
||||
ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",
|
||||
ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",
|
||||
tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",
|
||||
rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",
|
||||
tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",
|
||||
us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",
|
||||
org:"ae",de:"com "},has:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return!1;var k=f.lastIndexOf(".",b-1);if(0>=k||k>=b-1)return!1;var n=h.list[f.slice(b+1)];return n?0<=n.indexOf(" "+f.slice(k+1,b)+" "):!1},is:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1||0<=f.lastIndexOf(".",b-1))return!1;var k=h.list[f.slice(b+1)];return k?0<=k.indexOf(" "+f.slice(0,b)+" "):!1},get:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return null;var k=f.lastIndexOf(".",b-1);
|
||||
if(0>=k||k>=b-1)return null;var n=h.list[f.slice(b+1)];return!n||0>n.indexOf(" "+f.slice(k+1,b)+" ")?null:f.slice(k+1)},noConflict:function(){f.SecondLevelDomains===this&&(f.SecondLevelDomains=n);return this}};return h});
|
||||
(function(f,n){"object"===typeof module&&module.exports?module.exports=n(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],n):f.URI=n(f.punycode,f.IPv6,f.SecondLevelDomains,f)})(this,function(f,n,h,k){function b(a,c){var d=1<=arguments.length,l=2<=arguments.length;if(!(this instanceof b))return d?l?new b(a,c):new b(a):new b;if(void 0===a){if(d)throw new TypeError("undefined is not a valid argument for URI");
|
||||
a="undefined"!==typeof location?location.href+"":""}if(null===a&&d)throw new TypeError("null is not a valid argument for URI");this.href(a);return void 0!==c?this.absoluteTo(c):this}function q(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function z(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function u(a){return"Array"===z(a)}function g(a,c){var d={},b;if("RegExp"===z(c))d=null;else if(u(c)){var m=0;for(b=c.length;m<b;m++)d[c[m]]=!0}else d[c]=
|
||||
!0;m=0;for(b=a.length;m<b;m++)if(d&&void 0!==d[a[m]]||!d&&c.test(a[m]))a.splice(m,1),b--,m--;return a}function p(a,c){var d;if(u(c)){var b=0;for(d=c.length;b<d;b++)if(!p(a,c[b]))return!1;return!0}var m=z(c);b=0;for(d=a.length;b<d;b++)if("RegExp"===m){if("string"===typeof a[b]&&a[b].match(c))return!0}else if(a[b]===c)return!0;return!1}function D(a,c){if(!u(a)||!u(c)||a.length!==c.length)return!1;a.sort();c.sort();for(var d=0,b=a.length;d<b;d++)if(a[d]!==c[d])return!1;return!0}function A(a){return a.replace(/^\/+|\/+$/g,
|
||||
"")}function B(a){return escape(a)}function E(a){return encodeURIComponent(a).replace(/[!'()*]/g,B).replace(/\*/g,"%2A")}function r(a){return function(c,d){if(void 0===c)return this._parts[a]||"";this._parts[a]=c||null;this.build(!d);return this}}function C(a,c){return function(d,b){if(void 0===d)return this._parts[a]||"";null!==d&&(d+="",d.charAt(0)===c&&(d=d.substring(1)));this._parts[a]=d;this.build(!b);return this}}var w=k&&k.URI;b.version="1.19.2";var e=b.prototype,t=Object.prototype.hasOwnProperty;
|
||||
b._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,preventInvalidHostname:b.preventInvalidHostname,duplicateQueryParameters:b.duplicateQueryParameters,escapeQuerySpace:b.escapeQuerySpace}};b.preventInvalidHostname=!1;b.duplicateQueryParameters=!1;b.escapeQuerySpace=!0;b.protocol_expression=/^[a-z][a-z0-9.+-]*$/i;b.idn_expression=/[^a-z0-9\._-]/i;b.punycode_expression=/(xn--)/i;b.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
|
||||
b.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
|
||||
b.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;b.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g};b.defaultPorts={http:"80",https:"443",ftp:"21",
|
||||
gopher:"70",ws:"80",wss:"443"};b.hostProtocols=["http","https"];b.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/;b.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"};b.getDomAttribute=function(a){if(a&&a.nodeName){var c=a.nodeName.toLowerCase();if("input"!==c||"image"===a.type)return b.domAttributes[c]}};b.encode=E;b.decode=decodeURIComponent;b.iso8859=
|
||||
function(){b.encode=escape;b.decode=unescape};b.unicode=function(){b.encode=E;b.decode=decodeURIComponent};b.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@",
|
||||
"%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}};b.encodeQuery=function(a,c){var d=b.encode(a+"");void 0===c&&(c=b.escapeQuerySpace);return c?d.replace(/%20/g,"+"):d};b.decodeQuery=
|
||||
function(a,c){a+="";void 0===c&&(c=b.escapeQuerySpace);try{return b.decode(c?a.replace(/\+/g,"%20"):a)}catch(d){return a}};var y={encode:"encode",decode:"decode"},v,F=function(a,c){return function(d){try{return b[c](d+"").replace(b.characters[a][c].expression,function(d){return b.characters[a][c].map[d]})}catch(l){return d}}};for(v in y)b[v+"PathSegment"]=F("pathname",y[v]),b[v+"UrnPathSegment"]=F("urnpath",y[v]);y=function(a,c,d){return function(l){var m=d?function(a){return b[c](b[d](a))}:b[c];
|
||||
l=(l+"").split(a);for(var e=0,g=l.length;e<g;e++)l[e]=m(l[e]);return l.join(a)}};b.decodePath=y("/","decodePathSegment");b.decodeUrnPath=y(":","decodeUrnPathSegment");b.recodePath=y("/","encodePathSegment","decode");b.recodeUrnPath=y(":","encodeUrnPathSegment","decode");b.encodeReserved=F("reserved","encode");b.parse=function(a,c){c||(c={preventInvalidHostname:b.preventInvalidHostname});var d=a.indexOf("#");-1<d&&(c.fragment=a.substring(d+1)||null,a=a.substring(0,d));d=a.indexOf("?");-1<d&&(c.query=
|
||||
a.substring(d+1)||null,a=a.substring(0,d));"//"===a.substring(0,2)?(c.protocol=null,a=a.substring(2),a=b.parseAuthority(a,c)):(d=a.indexOf(":"),-1<d&&(c.protocol=a.substring(0,d)||null,c.protocol&&!c.protocol.match(b.protocol_expression)?c.protocol=void 0:"//"===a.substring(d+1,d+3)?(a=a.substring(d+3),a=b.parseAuthority(a,c)):(a=a.substring(d+1),c.urn=!0)));c.path=a;return c};b.parseHost=function(a,c){a||(a="");a=a.replace(/\\/g,"/");var d=a.indexOf("/");-1===d&&(d=a.length);if("["===a.charAt(0)){var l=
|
||||
a.indexOf("]");c.hostname=a.substring(1,l)||null;c.port=a.substring(l+2,d)||null;"/"===c.port&&(c.port=null)}else{var m=a.indexOf(":");l=a.indexOf("/");m=a.indexOf(":",m+1);-1!==m&&(-1===l||m<l)?(c.hostname=a.substring(0,d)||null,c.port=null):(l=a.substring(0,d).split(":"),c.hostname=l[0]||null,c.port=l[1]||null)}c.hostname&&"/"!==a.substring(d).charAt(0)&&(d++,a="/"+a);c.preventInvalidHostname&&b.ensureValidHostname(c.hostname,c.protocol);c.port&&b.ensureValidPort(c.port);return a.substring(d)||
|
||||
"/"};b.parseAuthority=function(a,c){a=b.parseUserinfo(a,c);return b.parseHost(a,c)};b.parseUserinfo=function(a,c){var d=a.indexOf("/"),l=a.lastIndexOf("@",-1<d?d:a.length-1);-1<l&&(-1===d||l<d)?(d=a.substring(0,l).split(":"),c.username=d[0]?b.decode(d[0]):null,d.shift(),c.password=d[0]?b.decode(d.join(":")):null,a=a.substring(l+1)):(c.username=null,c.password=null);return a};b.parseQuery=function(a,c){if(!a)return{};a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,"");if(!a)return{};for(var d={},l=a.split("&"),
|
||||
m=l.length,e,g,f=0;f<m;f++)if(e=l[f].split("="),g=b.decodeQuery(e.shift(),c),e=e.length?b.decodeQuery(e.join("="),c):null,t.call(d,g)){if("string"===typeof d[g]||null===d[g])d[g]=[d[g]];d[g].push(e)}else d[g]=e;return d};b.build=function(a){var c="",d=!1;a.protocol&&(c+=a.protocol+":");a.urn||!c&&!a.hostname||(c+="//",d=!0);c+=b.buildAuthority(a)||"";"string"===typeof a.path&&("/"!==a.path.charAt(0)&&d&&(c+="/"),c+=a.path);"string"===typeof a.query&&a.query&&(c+="?"+a.query);"string"===typeof a.fragment&&
|
||||
a.fragment&&(c+="#"+a.fragment);return c};b.buildHost=function(a){var c="";if(a.hostname)c=b.ip6_expression.test(a.hostname)?c+("["+a.hostname+"]"):c+a.hostname;else return"";a.port&&(c+=":"+a.port);return c};b.buildAuthority=function(a){return b.buildUserinfo(a)+b.buildHost(a)};b.buildUserinfo=function(a){var c="";a.username&&(c+=b.encode(a.username));a.password&&(c+=":"+b.encode(a.password));c&&(c+="@");return c};b.buildQuery=function(a,c,d){var l="",m,e;for(m in a)if(t.call(a,m))if(u(a[m])){var g=
|
||||
{};var f=0;for(e=a[m].length;f<e;f++)void 0!==a[m][f]&&void 0===g[a[m][f]+""]&&(l+="&"+b.buildQueryParameter(m,a[m][f],d),!0!==c&&(g[a[m][f]+""]=!0))}else void 0!==a[m]&&(l+="&"+b.buildQueryParameter(m,a[m],d));return l.substring(1)};b.buildQueryParameter=function(a,c,d){return b.encodeQuery(a,d)+(null!==c?"="+b.encodeQuery(c,d):"")};b.addQuery=function(a,c,d){if("object"===typeof c)for(var l in c)t.call(c,l)&&b.addQuery(a,l,c[l]);else if("string"===typeof c)void 0===a[c]?a[c]=d:("string"===typeof a[c]&&
|
||||
(a[c]=[a[c]]),u(d)||(d=[d]),a[c]=(a[c]||[]).concat(d));else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");};b.setQuery=function(a,c,d){if("object"===typeof c)for(var l in c)t.call(c,l)&&b.setQuery(a,l,c[l]);else if("string"===typeof c)a[c]=void 0===d?null:d;else throw new TypeError("URI.setQuery() accepts an object, string as the name parameter");};b.removeQuery=function(a,c,d){var l;if(u(c))for(d=0,l=c.length;d<l;d++)a[c[d]]=void 0;else if("RegExp"===z(c))for(l in a)c.test(l)&&
|
||||
(a[l]=void 0);else if("object"===typeof c)for(l in c)t.call(c,l)&&b.removeQuery(a,l,c[l]);else if("string"===typeof c)void 0!==d?"RegExp"===z(d)?!u(a[c])&&d.test(a[c])?a[c]=void 0:a[c]=g(a[c],d):a[c]!==String(d)||u(d)&&1!==d.length?u(a[c])&&(a[c]=g(a[c],d)):a[c]=void 0:a[c]=void 0;else throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter");};b.hasQuery=function(a,c,d,l){switch(z(c)){case "String":break;case "RegExp":for(var m in a)if(t.call(a,m)&&c.test(m)&&
|
||||
(void 0===d||b.hasQuery(a,m,d)))return!0;return!1;case "Object":for(var e in c)if(t.call(c,e)&&!b.hasQuery(a,e,c[e]))return!1;return!0;default:throw new TypeError("URI.hasQuery() accepts a string, regular expression or object as the name parameter");}switch(z(d)){case "Undefined":return c in a;case "Boolean":return a=!(u(a[c])?!a[c].length:!a[c]),d===a;case "Function":return!!d(a[c],c,a);case "Array":return u(a[c])?(l?p:D)(a[c],d):!1;case "RegExp":return u(a[c])?l?p(a[c],d):!1:!(!a[c]||!a[c].match(d));
|
||||
case "Number":d=String(d);case "String":return u(a[c])?l?p(a[c],d):!1:a[c]===d;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter");}};b.joinPaths=function(){for(var a=[],c=[],d=0,l=0;l<arguments.length;l++){var m=new b(arguments[l]);a.push(m);m=m.segment();for(var e=0;e<m.length;e++)"string"===typeof m[e]&&c.push(m[e]),m[e]&&d++}if(!c.length||!d)return new b("");c=(new b("")).segment(c);""!==a[0].path()&&"/"!==a[0].path().slice(0,
|
||||
1)||c.path("/"+c.path());return c.normalize()};b.commonPath=function(a,c){var d=Math.min(a.length,c.length),b;for(b=0;b<d;b++)if(a.charAt(b)!==c.charAt(b)){b--;break}if(1>b)return a.charAt(0)===c.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(b)||"/"!==c.charAt(b))b=a.substring(0,b).lastIndexOf("/");return a.substring(0,b+1)};b.withinString=function(a,c,d){d||(d={});var l=d.start||b.findUri.start,e=d.end||b.findUri.end,g=d.trim||b.findUri.trim,f=d.parens||b.findUri.parens,h=/[a-z0-9-]=["']?$/i;
|
||||
for(l.lastIndex=0;;){var k=l.exec(a);if(!k)break;var p=k.index;if(d.ignoreHtml){var n=a.slice(Math.max(p-3,0),p);if(n&&h.test(n))continue}var r=p+a.slice(p).search(e);n=a.slice(p,r);for(r=-1;;){var q=f.exec(n);if(!q)break;r=Math.max(r,q.index+q[0].length)}n=-1<r?n.slice(0,r)+n.slice(r).replace(g,""):n.replace(g,"");n.length<=k[0].length||d.ignore&&d.ignore.test(n)||(r=p+n.length,k=c(n,p,r,a),void 0===k?l.lastIndex=r:(k=String(k),a=a.slice(0,p)+k+a.slice(r),l.lastIndex=p+k.length))}l.lastIndex=0;return a};
|
||||
b.ensureValidHostname=function(a,c){var d=!!a,l=!1;c&&(l=p(b.hostProtocols,c));if(l&&!d)throw new TypeError("Hostname cannot be empty, if protocol is "+c);if(a&&a.match(b.invalid_hostname_characters)){if(!f)throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');if(f.toASCII(a).match(b.invalid_hostname_characters))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-:_]');}};b.ensureValidPort=function(a){if(a){var c=
|
||||
Number(a);if(!(/^[0-9]+$/.test(c)&&0<c&&65536>c))throw new TypeError('Port "'+a+'" is not a valid port');}};b.noConflict=function(a){if(a)return a={URI:this.noConflict()},k.URITemplate&&"function"===typeof k.URITemplate.noConflict&&(a.URITemplate=k.URITemplate.noConflict()),k.IPv6&&"function"===typeof k.IPv6.noConflict&&(a.IPv6=k.IPv6.noConflict()),k.SecondLevelDomains&&"function"===typeof k.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=k.SecondLevelDomains.noConflict()),a;k.URI===this&&(k.URI=
|
||||
w);return this};e.build=function(a){if(!0===a)this._deferred_build=!0;else if(void 0===a||this._deferred_build)this._string=b.build(this._parts),this._deferred_build=!1;return this};e.clone=function(){return new b(this)};e.valueOf=e.toString=function(){return this.build(!1)._string};e.protocol=r("protocol");e.username=r("username");e.password=r("password");e.hostname=r("hostname");e.port=r("port");e.query=C("query","?");e.fragment=C("fragment","#");e.search=function(a,c){var b=this.query(a,c);return"string"===
|
||||
typeof b&&b.length?"?"+b:b};e.hash=function(a,c){var b=this.fragment(a,c);return"string"===typeof b&&b.length?"#"+b:b};e.pathname=function(a,c){if(void 0===a||!0===a){var d=this._parts.path||(this._parts.hostname?"/":"");return a?(this._parts.urn?b.decodeUrnPath:b.decodePath)(d):d}this._parts.path=this._parts.urn?a?b.recodeUrnPath(a):"":a?b.recodePath(a):"/";this.build(!c);return this};e.path=e.pathname;e.href=function(a,c){var d;if(void 0===a)return this.toString();this._string="";this._parts=b._parts();
|
||||
var l=a instanceof b,e="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(e=b.getDomAttribute(a),a=a[e]||"",e=!1);!l&&e&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a||a instanceof String)this._parts=b.parse(String(a),this._parts);else if(l||e){l=l?a._parts:a;for(d in l)"query"!==d&&t.call(this._parts,d)&&(this._parts[d]=l[d]);l.query&&this.query(l.query,!1)}else throw new TypeError("invalid input");this.build(!c);return this};e.is=function(a){var c=!1,d=!1,e=!1,m=!1,
|
||||
g=!1,f=!1,k=!1,p=!this._parts.urn;this._parts.hostname&&(p=!1,d=b.ip4_expression.test(this._parts.hostname),e=b.ip6_expression.test(this._parts.hostname),c=d||e,g=(m=!c)&&h&&h.has(this._parts.hostname),f=m&&b.idn_expression.test(this._parts.hostname),k=m&&b.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return p;case "absolute":return!p;case "domain":case "name":return m;case "sld":return g;case "ip":return c;case "ip4":case "ipv4":case "inet4":return d;case "ip6":case "ipv6":case "inet6":return e;
|
||||
case "idn":return f;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return k}return null};var G=e.protocol,H=e.port,I=e.hostname;e.protocol=function(a,c){if(a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(b.protocol_expression)))throw new TypeError('Protocol "'+a+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return G.call(this,a,c)};e.scheme=e.protocol;e.port=function(a,c){if(this._parts.urn)return void 0===a?"":this;void 0!==a&&(0===a&&
|
||||
(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),b.ensureValidPort(a)));return H.call(this,a,c)};e.hostname=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var d={preventInvalidHostname:this._parts.preventInvalidHostname};if("/"!==b.parseHost(a,d))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');a=d.hostname;this._parts.preventInvalidHostname&&b.ensureValidHostname(a,this._parts.protocol)}return I.call(this,a,c)};e.origin=function(a,
|
||||
c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){var d=this.protocol();return this.authority()?(d?d+"://":"")+this.authority():""}d=b(a);this.protocol(d.protocol()).authority(d.authority()).build(!c);return this};e.host=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?b.buildHost(this._parts):"";if("/"!==b.parseHost(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');this.build(!c);return this};
|
||||
e.authority=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?b.buildAuthority(this._parts):"";if("/"!==b.parseAuthority(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');this.build(!c);return this};e.userinfo=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){var d=b.buildUserinfo(this._parts);return d?d.substring(0,d.length-1):d}"@"!==a[a.length-1]&&(a+="@");b.parseUserinfo(a,
|
||||
this._parts);this.build(!c);return this};e.resource=function(a,c){if(void 0===a)return this.path()+this.search()+this.hash();var d=b.parse(a);this._parts.path=d.path;this._parts.query=d.query;this._parts.fragment=d.fragment;this.build(!c);return this};e.subdomain=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,d)||""}d=this._parts.hostname.length-
|
||||
this.domain().length;d=this._parts.hostname.substring(0,d);d=new RegExp("^"+q(d));a&&"."!==a.charAt(a.length-1)&&(a+=".");if(-1!==a.indexOf(":"))throw new TypeError("Domains cannot contain colons");a&&b.ensureValidHostname(a,this._parts.protocol);this._parts.hostname=this._parts.hostname.replace(d,a);this.build(!c);return this};e.domain=function(a,c){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=
|
||||
this._parts.hostname.match(/\./g);if(d&&2>d.length)return this._parts.hostname;d=this._parts.hostname.length-this.tld(c).length-1;d=this._parts.hostname.lastIndexOf(".",d-1)+1;return this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");if(-1!==a.indexOf(":"))throw new TypeError("Domains cannot contain colons");b.ensureValidHostname(a,this._parts.protocol);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(d=new RegExp(q(this.domain())+"$"),this._parts.hostname=
|
||||
this._parts.hostname.replace(d,a));this.build(!c);return this};e.tld=function(a,c){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var b=this._parts.hostname.lastIndexOf(".");b=this._parts.hostname.substring(b+1);return!0!==c&&h&&h.list[b.toLowerCase()]?h.get(this._parts.hostname)||b:b}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(h&&h.is(a))b=new RegExp(q(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(b,
|
||||
a);else throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");b=new RegExp(q(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(b,a)}else throw new TypeError("cannot set TLD empty");this.build(!c);return this};e.directory=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";
|
||||
if("/"===this._parts.path)return"/";var d=this._parts.path.length-this.filename().length-1;d=this._parts.path.substring(0,d)||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}d=this._parts.path.length-this.filename().length;d=this._parts.path.substring(0,d);d=new RegExp("^"+q(d));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=b.recodePath(a);this._parts.path=this._parts.path.replace(d,a);this.build(!c);return this};e.filename=function(a,
|
||||
c){if(this._parts.urn)return void 0===a?"":this;if("string"!==typeof a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this._parts.path.lastIndexOf("/");d=this._parts.path.substring(d+1);return a?b.decodePathSegment(d):d}d=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&(d=!0);var e=new RegExp(q(this.filename())+"$");a=b.recodePath(a);this._parts.path=this._parts.path.replace(e,a);d?this.normalizePath(c):this.build(!c);return this};e.suffix=function(a,c){if(this._parts.urn)return void 0===
|
||||
a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this.filename(),e=d.lastIndexOf(".");if(-1===e)return"";d=d.substring(e+1);d=/^[a-z0-9%]+$/i.test(d)?d:"";return a?b.decodePathSegment(d):d}"."===a.charAt(0)&&(a=a.substring(1));if(d=this.suffix())e=a?new RegExp(q(d)+"$"):new RegExp(q("."+d)+"$");else{if(!a)return this;this._parts.path+="."+b.recodePath(a)}e&&(a=b.recodePath(a),this._parts.path=this._parts.path.replace(e,a));this.build(!c);return this};e.segment=
|
||||
function(a,c,b){var d=this._parts.urn?":":"/",e=this.path(),g="/"===e.substring(0,1);e=e.split(d);void 0!==a&&"number"!==typeof a&&(b=c,c=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');g&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===c)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(u(c)){e=[];a=0;for(var f=c.length;a<f;a++)if(c[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(A(c[a]))}else{if(c||
|
||||
"string"===typeof c)c=A(c),""===e[e.length-1]?e[e.length-1]=c:e.push(c)}else c?e[a]=A(c):e.splice(a,1);g&&e.unshift("");return this.path(e.join(d),b)};e.segmentCoded=function(a,c,d){var e;"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0===c){a=this.segment(a,c,d);if(u(a)){var g=0;for(e=a.length;g<e;g++)a[g]=b.decode(a[g])}else a=void 0!==a?b.decode(a):void 0;return a}if(u(c))for(g=0,e=c.length;g<e;g++)c[g]=b.encode(c[g]);else c="string"===typeof c||c instanceof String?b.encode(c):c;return this.segment(a,
|
||||
c,d)};var J=e.query;e.query=function(a,c){if(!0===a)return b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"===typeof a){var d=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace),e=a.call(this,d);this._parts.query=b.buildQuery(e||d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);this.build(!c);return this}return void 0!==a&&"string"!==typeof a?(this._parts.query=b.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!c),
|
||||
this):J.call(this,a,c)};e.setQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("string"===typeof a||a instanceof String)e[a]=void 0!==c?c:null;else if("object"===typeof a)for(var g in a)t.call(a,g)&&(e[g]=a[g]);else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.addQuery=
|
||||
function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.addQuery(e,a,void 0===c?null:c);this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.removeQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.removeQuery(e,a,c);this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==
|
||||
typeof a&&(d=c);this.build(!d);return this};e.hasQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return b.hasQuery(e,a,c,d)};e.setSearch=e.setQuery;e.addSearch=e.addQuery;e.removeSearch=e.removeQuery;e.hasSearch=e.hasQuery;e.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};
|
||||
e.normalizeProtocol=function(a){"string"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!a));return this};e.normalizeHostname=function(a){this._parts.hostname&&(this.is("IDN")&&f?this._parts.hostname=f.toASCII(this._parts.hostname):this.is("IPv6")&&n&&(this._parts.hostname=n.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!a));return this};e.normalizePort=function(a){"string"===typeof this._parts.protocol&&
|
||||
this._parts.port===b.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};e.normalizePath=function(a){var c=this._parts.path;if(!c)return this;if(this._parts.urn)return this._parts.path=b.recodeUrnPath(this._parts.path),this.build(!a),this;if("/"===this._parts.path)return this;c=b.recodePath(c);var d="";if("/"!==c.charAt(0)){var e=!0;c="/"+c}if("/.."===c.slice(-3)||"/."===c.slice(-2))c+="/";c=c.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");e&&(d=c.substring(1).match(/^(\.\.\/)+/)||
|
||||
"")&&(d=d[0]);for(;;){var g=c.search(/\/\.\.(\/|$)/);if(-1===g)break;else if(0===g){c=c.substring(3);continue}var f=c.substring(0,g).lastIndexOf("/");-1===f&&(f=g);c=c.substring(0,f)+c.substring(g+3)}e&&this.is("relative")&&(c=d+c.substring(1));this._parts.path=c;this.build(!a);return this};e.normalizePathname=e.normalizePath;e.normalizeQuery=function(a){"string"===typeof this._parts.query&&(this._parts.query.length?this.query(b.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=
|
||||
null,this.build(!a));return this};e.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};e.normalizeSearch=e.normalizeQuery;e.normalizeHash=e.normalizeFragment;e.iso8859=function(){var a=b.encode,c=b.decode;b.encode=escape;b.decode=decodeURIComponent;try{this.normalize()}finally{b.encode=a,b.decode=c}return this};e.unicode=function(){var a=b.encode,c=b.decode;b.encode=E;b.decode=unescape;try{this.normalize()}finally{b.encode=a,b.decode=c}return this};
|
||||
e.readable=function(){var a=this.clone();a.username("").password("").normalize();var c="";a._parts.protocol&&(c+=a._parts.protocol+"://");a._parts.hostname&&(a.is("punycode")&&f?(c+=f.toUnicode(a._parts.hostname),a._parts.port&&(c+=":"+a._parts.port)):c+=a.host());a._parts.hostname&&a._parts.path&&"/"!==a._parts.path.charAt(0)&&(c+="/");c+=a.path(!0);if(a._parts.query){for(var d="",e=0,g=a._parts.query.split("&"),h=g.length;e<h;e++){var k=(g[e]||"").split("=");d+="&"+b.decodeQuery(k[0],this._parts.escapeQuerySpace).replace(/&/g,
|
||||
"%26");void 0!==k[1]&&(d+="="+b.decodeQuery(k[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}c+="?"+d.substring(1)}return c+=b.decodeQuery(a.hash(),!0)};e.absoluteTo=function(a){var c=this.clone(),d=["protocol","username","password","hostname","port"],e,g;if(this._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a instanceof b||(a=new b(a));if(c._parts.protocol)return c;c._parts.protocol=a._parts.protocol;if(this._parts.hostname)return c;for(e=0;g=d[e];e++)c._parts[g]=
|
||||
a._parts[g];c._parts.path?(".."===c._parts.path.substring(-2)&&(c._parts.path+="/"),"/"!==c.path().charAt(0)&&(d=(d=a.directory())?d:0===a.path().indexOf("/")?"/":"",c._parts.path=(d?d+"/":"")+c._parts.path,c.normalizePath())):(c._parts.path=a._parts.path,c._parts.query||(c._parts.query=a._parts.query));c.build();return c};e.relativeTo=function(a){var c=this.clone().normalize();if(c._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a=(new b(a)).normalize();var d=
|
||||
c._parts;var e=a._parts;var g=c.path();a=a.path();if("/"!==g.charAt(0))throw Error("URI is already relative");if("/"!==a.charAt(0))throw Error("Cannot calculate a URI relative to another relative URI");d.protocol===e.protocol&&(d.protocol=null);if(d.username===e.username&&d.password===e.password&&null===d.protocol&&null===d.username&&null===d.password&&d.hostname===e.hostname&&d.port===e.port)d.hostname=null,d.port=null;else return c.build();if(g===a)return d.path="",c.build();g=b.commonPath(g,a);
|
||||
if(!g)return c.build();e=e.path.substring(g.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");d.path=e+d.path.substring(g.length)||"./";return c.build()};e.equals=function(a){var c=this.clone(),d=new b(a);a={};var e;c.normalize();d.normalize();if(c.toString()===d.toString())return!0;var g=c.query();var f=d.query();c.query("");d.query("");if(c.toString()!==d.toString()||g.length!==f.length)return!1;c=b.parseQuery(g,this._parts.escapeQuerySpace);f=b.parseQuery(f,this._parts.escapeQuerySpace);for(e in c)if(t.call(c,
|
||||
e)){if(!u(c[e])){if(c[e]!==f[e])return!1}else if(!D(c[e],f[e]))return!1;a[e]=!0}for(e in f)if(t.call(f,e)&&!a[e])return!1;return!0};e.preventInvalidHostname=function(a){this._parts.preventInvalidHostname=!!a;return this};e.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};e.escapeQuerySpace=function(a){this._parts.escapeQuerySpace=!!a;return this};return b});
|
||||
(function(f,n){"object"===typeof module&&module.exports?module.exports=n(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],n):f.URITemplate=n(f.URI,f)})(this,function(f,n){function h(b){if(h._cache[b])return h._cache[b];if(!(this instanceof h))return new h(b);this.expression=b;h._cache[b]=this;return this}function k(b){this.data=b;this.cache={}}var b=n&&n.URITemplate,q=Object.prototype.hasOwnProperty,z=h.prototype,u={"":{prefix:"",separator:",",named:!1,empty_name_separator:!1,
|
||||
encode:"encode"},"+":{prefix:"",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},"#":{prefix:"#",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},".":{prefix:".",separator:".",named:!1,empty_name_separator:!1,encode:"encode"},"/":{prefix:"/",separator:"/",named:!1,empty_name_separator:!1,encode:"encode"},";":{prefix:";",separator:";",named:!0,empty_name_separator:!1,encode:"encode"},"?":{prefix:"?",separator:"&",named:!0,empty_name_separator:!0,encode:"encode"},
|
||||
"&":{prefix:"&",separator:"&",named:!0,empty_name_separator:!0,encode:"encode"}};h._cache={};h.EXPRESSION_PATTERN=/\{([^a-zA-Z0-9%_]?)([^\}]+)(\}|$)/g;h.VARIABLE_PATTERN=/^([^*:.](?:\.?[^*:.])*)((\*)|:(\d+))?$/;h.VARIABLE_NAME_PATTERN=/[^a-zA-Z0-9%_.]/;h.LITERAL_PATTERN=/[<>{}"`^| \\]/;h.expand=function(b,f,k){var g=u[b.operator],p=g.named?"Named":"Unnamed";b=b.variables;var n=[],r,q;for(q=0;r=b[q];q++){var w=f.get(r.name);if(0===w.type&&k&&k.strict)throw Error('Missing expansion value for variable "'+
|
||||
r.name+'"');if(w.val.length){if(1<w.type&&r.maxlength)throw Error('Invalid expression: Prefix modifier not applicable to variable "'+r.name+'"');n.push(h["expand"+p](w,g,r.explode,r.explode&&g.separator||",",r.maxlength,r.name))}else w.type&&n.push("")}return n.length?g.prefix+n.join(g.separator):""};h.expandNamed=function(b,h,k,n,q,u){var g="",p=h.encode;h=h.empty_name_separator;var A=!b[p].length,e=2===b.type?"":f[p](u),t;var y=0;for(t=b.val.length;y<t;y++){if(q){var v=f[p](b.val[y][1].substring(0,
|
||||
q));2===b.type&&(e=f[p](b.val[y][0].substring(0,q)))}else A?(v=f[p](b.val[y][1]),2===b.type?(e=f[p](b.val[y][0]),b[p].push([e,v])):b[p].push([void 0,v])):(v=b[p][y][1],2===b.type&&(e=b[p][y][0]));g&&(g+=n);k?g+=e+(h||v?"=":"")+v:(y||(g+=f[p](u)+(h||v?"=":"")),2===b.type&&(g+=e+","),g+=v)}return g};h.expandUnnamed=function(b,h,k,n,q){var g="",p=h.encode;h=h.empty_name_separator;var A=!b[p].length,w;var e=0;for(w=b.val.length;e<w;e++){if(q)var t=f[p](b.val[e][1].substring(0,q));else A?(t=f[p](b.val[e][1]),
|
||||
b[p].push([2===b.type?f[p](b.val[e][0]):void 0,t])):t=b[p][e][1];g&&(g+=n);if(2===b.type){var u=q?f[p](b.val[e][0].substring(0,q)):b[p][e][0];g+=u;g=k?g+(h||t?"=":""):g+","}g+=t}return g};h.noConflict=function(){n.URITemplate===h&&(n.URITemplate=b);return h};z.expand=function(b,f){var g="";this.parts&&this.parts.length||this.parse();b instanceof k||(b=new k(b));for(var p=0,n=this.parts.length;p<n;p++)g+="string"===typeof this.parts[p]?this.parts[p]:h.expand(this.parts[p],b,f);return g};z.parse=function(){var b=
|
||||
this.expression,f=h.EXPRESSION_PATTERN,k=h.VARIABLE_PATTERN,n=h.VARIABLE_NAME_PATTERN,q=h.LITERAL_PATTERN,z=[],r=0,C=function(b){if(b.match(q))throw Error('Invalid Literal "'+b+'"');return b};for(f.lastIndex=0;;){var w=f.exec(b);if(null===w){z.push(C(b.substring(r)));break}else z.push(C(b.substring(r,w.index))),r=w.index+w[0].length;if(!u[w[1]])throw Error('Unknown Operator "'+w[1]+'" in "'+w[0]+'"');if(!w[3])throw Error('Unclosed Expression "'+w[0]+'"');var e=w[2].split(",");for(var t=0,y=e.length;t<
|
||||
y;t++){var v=e[t].match(k);if(null===v)throw Error('Invalid Variable "'+e[t]+'" in "'+w[0]+'"');if(v[1].match(n))throw Error('Invalid Variable Name "'+v[1]+'" in "'+w[0]+'"');e[t]={name:v[1],explode:!!v[3],maxlength:v[4]&&parseInt(v[4],10)}}if(!e.length)throw Error('Expression Missing Variable(s) "'+w[0]+'"');z.push({expression:w[0],operator:w[1],variables:e})}z.length||z.push(C(b));this.parts=z;return this};k.prototype.get=function(b){var f=this.data,g={type:0,val:[],encode:[],encodeReserved:[]};
|
||||
if(void 0!==this.cache[b])return this.cache[b];this.cache[b]=g;f="[object Function]"===String(Object.prototype.toString.call(f))?f(b):"[object Function]"===String(Object.prototype.toString.call(f[b]))?f[b](b):f[b];if(void 0!==f&&null!==f)if("[object Array]"===String(Object.prototype.toString.call(f))){var h=0;for(b=f.length;h<b;h++)void 0!==f[h]&&null!==f[h]&&g.val.push([void 0,String(f[h])]);g.val.length&&(g.type=3)}else if("[object Object]"===String(Object.prototype.toString.call(f))){for(h in f)q.call(f,
|
||||
h)&&void 0!==f[h]&&null!==f[h]&&g.val.push([h,String(f[h])]);g.val.length&&(g.type=2)}else g.type=1,g.val.push([void 0,String(f)]);return g};f.expand=function(b,k){var g=(new h(b)).expand(k);return new f(g)};return h});
|
||||
@@ -0,0 +1,113 @@
|
||||
let contributorsLoaded = false;
|
||||
|
||||
const CONTRIBUTORS_API_URL = "https://api.github.com/repos/sabeechen/hassio-google-drive-backup/contributors";
|
||||
const CONTRIBUTOR_COMMIT_URL = "https://github.com/sabeechen/hassio-google-drive-backup/commits?author={AUTHOR}";
|
||||
const CONTRIBUTORS_COUNT_TO_SHOW = 14;
|
||||
|
||||
const EXTRA_CONTRIBUTORS = {
|
||||
"sabeechen": "Original author. Did most of this.",
|
||||
"ericmatte": "Redesigned the UI with divine HTML and CSS wizardry.",
|
||||
"jhampson-dbre": "Fixed a really nasty timing bug.",
|
||||
};
|
||||
|
||||
function createElementFromHTML(htmlString) {
|
||||
var div = document.createElement("div");
|
||||
div.innerHTML = htmlString.trim();
|
||||
return div.firstChild;
|
||||
}
|
||||
|
||||
function showElement(id) {
|
||||
document.getElementById(id).classList.remove("default-hidden");
|
||||
}
|
||||
|
||||
function hideElement(id) {
|
||||
document.getElementById(id).classList.add("default-hidden");
|
||||
}
|
||||
|
||||
async function preloadImage(url) {
|
||||
return new Promise((resolve) => {
|
||||
const img = new Image();
|
||||
img.src = url;
|
||||
img.onload = () => resolve(img);
|
||||
});
|
||||
}
|
||||
|
||||
const extraContributorTemplate = `
|
||||
<div class="contributor-extra">
|
||||
<div class="contributor-img-wrapper"></div>
|
||||
<div>
|
||||
<div>
|
||||
<a href="{hrefUsername}" target="_blank">{username}</a>
|
||||
-
|
||||
<a href="{hrefContributions}" target="_blank">{contributions}</a>
|
||||
</div>
|
||||
<div>{details}</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
async function loadContributor(contributor) {
|
||||
const img = await preloadImage(contributor.avatar_url);
|
||||
img.className = "contributor-img";
|
||||
img.title = `@${contributor.login}`;
|
||||
img.alt = img.title;
|
||||
|
||||
const a = document.createElement("a");
|
||||
a.href = contributor.html_url;
|
||||
a.target = "_blank";
|
||||
a.appendChild(img);
|
||||
|
||||
if (contributor.login in EXTRA_CONTRIBUTORS) {
|
||||
const div = createElementFromHTML(
|
||||
extraContributorTemplate
|
||||
.replace("{hrefUsername}", contributor.html_url)
|
||||
.replace("{username}", `@${contributor.login}`)
|
||||
.replace("{hrefContributions}", CONTRIBUTOR_COMMIT_URL.replace("{AUTHOR}", contributor.login))
|
||||
.replace("{contributions}", `${contributor.contributions} contributions`)
|
||||
.replace("{details}", EXTRA_CONTRIBUTORS[contributor.login]),
|
||||
);
|
||||
div.querySelector(".contributor-img-wrapper").appendChild(a);
|
||||
|
||||
return { element: div, isExtra: true };
|
||||
} else {
|
||||
return { element: a, isExtra: false };
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchContributors() {
|
||||
if (contributorsLoaded) return;
|
||||
|
||||
const data = await fetch(CONTRIBUTORS_API_URL);
|
||||
showElement("contributors-loading");
|
||||
hideElement("contributors-count");
|
||||
hideElement("contributors");
|
||||
|
||||
if (data.ok) {
|
||||
const contributors = await data.json();
|
||||
const containerSimple = document.getElementById("contributors-simple");
|
||||
const containerExtra = document.getElementById("contributors-extra");
|
||||
containerSimple.innerHTML = "";
|
||||
containerExtra.innerHTML = "";
|
||||
|
||||
const contributorsToShow = contributors.slice(0, CONTRIBUTORS_COUNT_TO_SHOW);
|
||||
const contributorItems = await Promise.all(contributorsToShow.map((contributor) => loadContributor(contributor)));
|
||||
|
||||
contributorItems.forEach((item) => {
|
||||
(item.isExtra ? containerExtra : containerSimple).appendChild(item.element);
|
||||
});
|
||||
|
||||
document.getElementById("contributors-more-link-count").innerText = contributors.length - CONTRIBUTORS_COUNT_TO_SHOW;
|
||||
document.getElementById("contributors-count").innerText = contributors.length;
|
||||
showElement("contributors-count");
|
||||
showElement("contributors");
|
||||
contributorsLoaded = true;
|
||||
}
|
||||
|
||||
hideElement("contributors-loading");
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
M.Modal.init(document.querySelector("#about_modal"), {
|
||||
onOpenStart: () => fetchContributors(),
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,605 @@
|
||||
/*!
|
||||
* colpick Color Picker
|
||||
* https://github.com/mrgrain/colpick
|
||||
*
|
||||
* Copyright 2013, 2015 Moritz Kornher, Jose Vargas, Stefan Petre
|
||||
* Released under the MIT license and GPLv2 license
|
||||
* https://github.com/mrgrain/colpick/blob/master/LICENSE
|
||||
*/
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS
|
||||
factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
var colpick = function () {
|
||||
var
|
||||
tpl = '<div class="colpick"><div class="colpick_color"><div class="colpick_color_overlay1"><div class="colpick_color_overlay2"><div class="colpick_selector_outer"><div class="colpick_selector_inner"></div></div></div></div></div><div class="colpick_hue"><div class="colpick_hue_arrs"><div class="colpick_hue_larr"></div><div class="colpick_hue_rarr"></div></div></div><div class="colpick_new_color"></div><div class="colpick_current_color"></div><div class="colpick_hex_field"><div class="colpick_field_letter">#</div><input type="text" maxlength="6" size="6" /></div><div class="colpick_rgb_r colpick_field"><div class="colpick_field_letter">R</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_rgb_g colpick_field"><div class="colpick_field_letter">G</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_rgb_b colpick_field"><div class="colpick_field_letter">B</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_h colpick_field"><div class="colpick_field_letter">H</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_s colpick_field"><div class="colpick_field_letter">S</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_hsb_b colpick_field"><div class="colpick_field_letter">B</div><input type="text" maxlength="3" size="3" /><div class="colpick_field_arrs"><div class="colpick_field_uarr"></div><div class="colpick_field_darr"></div></div></div><div class="colpick_submit"></div></div>',
|
||||
defaults = {
|
||||
showEvent: 'click',
|
||||
onShow: function () {
|
||||
},
|
||||
onBeforeShow: function () {
|
||||
},
|
||||
onHide: function () {
|
||||
},
|
||||
onChange: function () {
|
||||
},
|
||||
onSubmit: function () {
|
||||
},
|
||||
colorScheme: 'light',
|
||||
color: 'auto',
|
||||
livePreview: true,
|
||||
flat: false,
|
||||
layout: 'full',
|
||||
submit: 1,
|
||||
submitText: 'OK',
|
||||
height: 156,
|
||||
polyfill: false,
|
||||
styles: false
|
||||
},
|
||||
//Fill the inputs of the plugin
|
||||
fillRGBFields = function (hsb, cal) {
|
||||
var rgb = hsbToRgb(hsb);
|
||||
$(cal).data('colpick').fields
|
||||
.eq(1).val(rgb.r).end()
|
||||
.eq(2).val(rgb.g).end()
|
||||
.eq(3).val(rgb.b).end();
|
||||
},
|
||||
fillHSBFields = function (hsb, cal) {
|
||||
$(cal).data('colpick').fields
|
||||
.eq(4).val(Math.round(hsb.h)).end()
|
||||
.eq(5).val(Math.round(hsb.s)).end()
|
||||
.eq(6).val(Math.round(hsb.b)).end();
|
||||
},
|
||||
fillHexFields = function (hsb, cal) {
|
||||
$(cal).data('colpick').fields.eq(0).val(hsbToHex(hsb));
|
||||
},
|
||||
//Set the round selector position
|
||||
setSelector = function (hsb, cal) {
|
||||
$(cal).data('colpick').selector.css('backgroundColor', '#' + hsbToHex({h: hsb.h, s: 100, b: 100}));
|
||||
$(cal).data('colpick').selectorIndic.css({
|
||||
left: parseInt($(cal).data('colpick').height * hsb.s / 100, 10),
|
||||
top: parseInt($(cal).data('colpick').height * (100 - hsb.b) / 100, 10)
|
||||
});
|
||||
},
|
||||
//Set the hue selector position
|
||||
setHue = function (hsb, cal) {
|
||||
$(cal).data('colpick').hue.css('top', parseInt($(cal).data('colpick').height - $(cal).data('colpick').height * hsb.h / 360, 10));
|
||||
},
|
||||
//Set current and new colors
|
||||
setCurrentColor = function (hsb, cal) {
|
||||
$(cal).data('colpick').currentColor.css('backgroundColor', '#' + hsbToHex(hsb));
|
||||
},
|
||||
setNewColor = function (hsb, cal) {
|
||||
$(cal).data('colpick').newColor.css('backgroundColor', '#' + hsbToHex(hsb));
|
||||
},
|
||||
//Called when the new color is changed
|
||||
change = function () {
|
||||
var cal = $(this).parent().parent(), col;
|
||||
if (this.parentNode.className.indexOf('_hex') > 0) {
|
||||
cal.data('colpick').color = col = hexToHsb(fixHex(this.value));
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
} else if (this.parentNode.className.indexOf('_hsb') > 0) {
|
||||
cal.data('colpick').color = col = fixHSB({
|
||||
h: parseInt(cal.data('colpick').fields.eq(4).val(), 10),
|
||||
s: parseInt(cal.data('colpick').fields.eq(5).val(), 10),
|
||||
b: parseInt(cal.data('colpick').fields.eq(6).val(), 10)
|
||||
});
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHexFields(col, cal.get(0));
|
||||
} else {
|
||||
cal.data('colpick').color = col = rgbToHsb(fixRGB({
|
||||
r: parseInt(cal.data('colpick').fields.eq(1).val(), 10),
|
||||
g: parseInt(cal.data('colpick').fields.eq(2).val(), 10),
|
||||
b: parseInt(cal.data('colpick').fields.eq(3).val(), 10)
|
||||
}));
|
||||
fillHexFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
}
|
||||
setSelector(col, cal.get(0));
|
||||
setHue(col, cal.get(0));
|
||||
setNewColor(col, cal.get(0));
|
||||
cal.data('colpick').onChange.apply(cal.parent(), [col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el, 0]);
|
||||
},
|
||||
//Change style on blur and on focus of inputs
|
||||
blur = function () {
|
||||
$(this).parent().removeClass('colpick_focus');
|
||||
},
|
||||
focus = function () {
|
||||
$(this).parent().parent().data('colpick').fields.parent().removeClass('colpick_focus');
|
||||
$(this).parent().addClass('colpick_focus');
|
||||
},
|
||||
//Increment/decrement arrows functions
|
||||
downIncrement = function (ev) {
|
||||
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
|
||||
var field = $(this).parent().find('input').focus();
|
||||
var current = {
|
||||
el: $(this).parent().addClass('colpick_slider'),
|
||||
max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
|
||||
y: ev.pageY,
|
||||
field: field,
|
||||
val: parseInt(field.val(), 10),
|
||||
preview: $(this).parent().parent().data('colpick').livePreview
|
||||
};
|
||||
$(document).mouseup(current, upIncrement);
|
||||
$(document).mousemove(current, moveIncrement);
|
||||
},
|
||||
moveIncrement = function (ev) {
|
||||
ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val - ev.pageY + ev.data.y, 10))));
|
||||
if (ev.data.preview) {
|
||||
change.apply(ev.data.field.get(0), [true]);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
upIncrement = function (ev) {
|
||||
change.apply(ev.data.field.get(0), [true]);
|
||||
ev.data.el.removeClass('colpick_slider').find('input').focus();
|
||||
$(document).off('mouseup', upIncrement);
|
||||
$(document).off('mousemove', moveIncrement);
|
||||
return false;
|
||||
},
|
||||
//Hue slider functions
|
||||
downHue = function (ev) {
|
||||
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
|
||||
var current = {
|
||||
cal: $(this).parent(),
|
||||
y: $(this).offset().top
|
||||
};
|
||||
$(document).on('mouseup touchend', current, upHue);
|
||||
$(document).on('mousemove touchmove', current, moveHue);
|
||||
|
||||
var pageY = ((ev.type == 'touchstart') ? ev.originalEvent.changedTouches[0].pageY : ev.pageY );
|
||||
change.apply(
|
||||
current.cal.data('colpick')
|
||||
.fields.eq(4).val(parseInt(360 * (current.cal.data('colpick').height - (pageY - current.y)) / current.cal.data('colpick').height, 10))
|
||||
.get(0),
|
||||
[current.cal.data('colpick').livePreview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
moveHue = function (ev) {
|
||||
var pageY = ((ev.type == 'touchmove') ? ev.originalEvent.changedTouches[0].pageY : ev.pageY );
|
||||
change.apply(
|
||||
ev.data.cal.data('colpick')
|
||||
.fields.eq(4).val(parseInt(360 * (ev.data.cal.data('colpick').height - Math.max(0, Math.min(ev.data.cal.data('colpick').height, (pageY - ev.data.y)))) / ev.data.cal.data('colpick').height, 10))
|
||||
.get(0),
|
||||
[ev.data.preview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
upHue = function (ev) {
|
||||
fillRGBFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
|
||||
fillHexFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
|
||||
$(document).off('mouseup touchend', upHue);
|
||||
$(document).off('mousemove touchmove', moveHue);
|
||||
return false;
|
||||
},
|
||||
//Color selector functions
|
||||
downSelector = function (ev) {
|
||||
ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
|
||||
var current = {
|
||||
cal: $(this).parent(),
|
||||
pos: $(this).offset()
|
||||
};
|
||||
current.preview = current.cal.data('colpick').livePreview;
|
||||
|
||||
$(document).on('mouseup touchend', current, upSelector);
|
||||
$(document).on('mousemove touchmove', current, moveSelector);
|
||||
|
||||
var pageX, pageY;
|
||||
if (ev.type == 'touchstart') {
|
||||
pageX = ev.originalEvent.changedTouches[0].pageX;
|
||||
pageY = ev.originalEvent.changedTouches[0].pageY;
|
||||
} else {
|
||||
pageX = ev.pageX;
|
||||
pageY = ev.pageY;
|
||||
}
|
||||
|
||||
change.apply(
|
||||
current.cal.data('colpick').fields
|
||||
.eq(6).val(parseInt(100 * (current.cal.data('colpick').height - (pageY - current.pos.top)) / current.cal.data('colpick').height, 10)).end()
|
||||
.eq(5).val(parseInt(100 * (pageX - current.pos.left) / current.cal.data('colpick').height, 10))
|
||||
.get(0),
|
||||
[current.preview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
moveSelector = function (ev) {
|
||||
var pageX, pageY;
|
||||
if (ev.type == 'touchmove') {
|
||||
pageX = ev.originalEvent.changedTouches[0].pageX;
|
||||
pageY = ev.originalEvent.changedTouches[0].pageY;
|
||||
} else {
|
||||
pageX = ev.pageX;
|
||||
pageY = ev.pageY;
|
||||
}
|
||||
|
||||
change.apply(
|
||||
ev.data.cal.data('colpick').fields
|
||||
.eq(6).val(parseInt(100 * (ev.data.cal.data('colpick').height - Math.max(0, Math.min(ev.data.cal.data('colpick').height, (pageY - ev.data.pos.top)))) / ev.data.cal.data('colpick').height, 10)).end()
|
||||
.eq(5).val(parseInt(100 * (Math.max(0, Math.min(ev.data.cal.data('colpick').height, (pageX - ev.data.pos.left)))) / ev.data.cal.data('colpick').height, 10))
|
||||
.get(0),
|
||||
[ev.data.preview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
upSelector = function (ev) {
|
||||
fillRGBFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
|
||||
fillHexFields(ev.data.cal.data('colpick').color, ev.data.cal.get(0));
|
||||
$(document).off('mouseup touchend', upSelector);
|
||||
$(document).off('mousemove touchmove', moveSelector);
|
||||
return false;
|
||||
},
|
||||
//Submit button
|
||||
clickSubmit = function () {
|
||||
var cal = $(this).parent();
|
||||
var col = cal.data('colpick').color;
|
||||
cal.data('colpick').origColor = col;
|
||||
setCurrentColor(col, cal.get(0));
|
||||
cal.data('colpick').onSubmit(col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el);
|
||||
},
|
||||
//Show/hide the color picker
|
||||
show = function (ev) {
|
||||
if (ev) {
|
||||
// Prevent the trigger of any direct parent
|
||||
ev.stopPropagation();
|
||||
}
|
||||
var cal = $('#' + $(this).data('colpickId'));
|
||||
if (ev && !cal.data('colpick').polyfill) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
cal.data('colpick').onBeforeShow.apply(this, [cal.get(0)]);
|
||||
var pos = $(this).offset();
|
||||
var top = pos.top + this.offsetHeight;
|
||||
var left = pos.left;
|
||||
var viewPort = getViewport();
|
||||
var calW = cal.width();
|
||||
if (left + calW > viewPort.l + viewPort.w) {
|
||||
left -= calW;
|
||||
}
|
||||
cal.css({left: left + 'px', top: top + 'px'});
|
||||
if (cal.data('colpick').onShow.apply(this, [cal.get(0)]) != false) {
|
||||
cal.show();
|
||||
}
|
||||
//Hide when user clicks outside
|
||||
$('html').mousedown({cal: cal}, hide);
|
||||
cal.mousedown(function (ev) {
|
||||
ev.stopPropagation();
|
||||
})
|
||||
},
|
||||
hide = function (ev) {
|
||||
var cal = $('#' + $(this).data('colpickId'));
|
||||
if (ev) {
|
||||
cal = ev.data.cal;
|
||||
}
|
||||
if (cal.data('colpick').onHide.apply(this, [cal.get(0)]) != false) {
|
||||
cal.hide();
|
||||
}
|
||||
$('html').off('mousedown', hide);
|
||||
},
|
||||
getViewport = function () {
|
||||
var m = document.compatMode == 'CSS1Compat';
|
||||
return {
|
||||
l: window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
|
||||
w: window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth)
|
||||
};
|
||||
},
|
||||
//Fix the values if the user enters a negative or high value
|
||||
fixHSB = function (hsb) {
|
||||
return {
|
||||
h: Math.min(360, Math.max(0, hsb.h)),
|
||||
s: Math.min(100, Math.max(0, hsb.s)),
|
||||
b: Math.min(100, Math.max(0, hsb.b))
|
||||
};
|
||||
},
|
||||
fixRGB = function (rgb) {
|
||||
return {
|
||||
r: Math.min(255, Math.max(0, rgb.r)),
|
||||
g: Math.min(255, Math.max(0, rgb.g)),
|
||||
b: Math.min(255, Math.max(0, rgb.b))
|
||||
};
|
||||
},
|
||||
fixHex = function (hex) {
|
||||
var len = 6 - hex.length;
|
||||
if (len == 3) {
|
||||
var e = [];
|
||||
for (var j = 0; j < len; j++) {
|
||||
e.push(hex[j]);
|
||||
e.push(hex[j]);
|
||||
}
|
||||
hex = e.join('');
|
||||
} else {
|
||||
if (len > 0) {
|
||||
var o = [];
|
||||
for (var i = 0; i < len; i++) {
|
||||
o.push('0');
|
||||
}
|
||||
o.push(hex);
|
||||
hex = o.join('');
|
||||
}
|
||||
}
|
||||
return hex;
|
||||
},
|
||||
restoreOriginal = function () {
|
||||
var cal = $(this).parent();
|
||||
var col = cal.data('colpick').origColor;
|
||||
cal.data('colpick').color = col;
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHexFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
setSelector(col, cal.get(0));
|
||||
setHue(col, cal.get(0));
|
||||
setNewColor(col, cal.get(0));
|
||||
};
|
||||
return {
|
||||
init: function (opt) {
|
||||
opt = $.extend({}, defaults, opt || {});
|
||||
//Set color
|
||||
if (opt.color === 'auto') {
|
||||
} else if (typeof opt.color == 'string') {
|
||||
opt.color = hexToHsb(opt.color);
|
||||
} else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
|
||||
opt.color = rgbToHsb(opt.color);
|
||||
} else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
|
||||
opt.color = fixHSB(opt.color);
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
|
||||
//For each selected DOM element
|
||||
return this.each(function () {
|
||||
//If the element does not have an ID
|
||||
if (!$(this).data('colpickId')) {
|
||||
var options = $.extend({}, opt);
|
||||
//Color
|
||||
if (opt.color === 'auto') {
|
||||
options.color = $(this).val() ? hexToHsb($(this).val()) : {h: 0, s: 0, b: 0};
|
||||
}
|
||||
options.origColor = options.color;
|
||||
|
||||
//Polyfill
|
||||
if (typeof opt.polyfill == 'function') {
|
||||
options.polyfill = opt.polyfill(this);
|
||||
}
|
||||
if (options.polyfill && $(this).is('input') && this.type === "color") {
|
||||
return;
|
||||
}
|
||||
|
||||
//Generate and assign a random ID
|
||||
var id = 'collorpicker_' + parseInt(Math.random() * 1000);
|
||||
$(this).data('colpickId', id);
|
||||
//Set the tpl's ID and get the HTML
|
||||
var cal = $(tpl).attr('id', id);
|
||||
//Add class according to layout
|
||||
cal.addClass('colpick_' + options.layout + (options.submit ? '' : ' colpick_' + options.layout + '_ns'));
|
||||
//Add class if the color scheme is not default
|
||||
if (options.colorScheme != 'light') {
|
||||
cal.addClass('colpick_' + options.colorScheme);
|
||||
}
|
||||
//Setup submit button
|
||||
cal.find('div.colpick_submit').html(options.submitText).click(clickSubmit);
|
||||
//Setup input fields
|
||||
options.fields = cal.find('input').change(change).blur(blur).focus(focus);
|
||||
cal.find('div.colpick_field_arrs').mousedown(downIncrement).end().find('div.colpick_current_color').click(restoreOriginal);
|
||||
//Setup hue selector
|
||||
options.selector = cal.find('div.colpick_color').on('mousedown touchstart', downSelector);
|
||||
options.selectorIndic = options.selector.find('div.colpick_selector_outer');
|
||||
//Store parts of the plugin
|
||||
options.el = this;
|
||||
options.hue = cal.find('div.colpick_hue_arrs');
|
||||
var huebar = options.hue.parent();
|
||||
//Paint the hue bar
|
||||
var UA = navigator.userAgent.toLowerCase();
|
||||
var isIE = navigator.appName === 'Microsoft Internet Explorer';
|
||||
var IEver = isIE ? parseFloat(UA.match(/msie ([0-9]*[\.0-9]+)/)[1]) : 0;
|
||||
var ngIE = ( isIE && IEver < 10 );
|
||||
var stops = ['#ff0000', '#ff0080', '#ff00ff', '#8000ff', '#0000ff', '#0080ff', '#00ffff', '#00ff80', '#00ff00', '#80ff00', '#ffff00', '#ff8000', '#ff0000'];
|
||||
if (ngIE) {
|
||||
var i, div;
|
||||
for (i = 0; i <= 11; i++) {
|
||||
div = $('<div></div>').attr('style', 'height:8.333333%; filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=' + stops[i] + ', endColorstr=' + stops[i + 1] + '); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=' + stops[i] + ', endColorstr=' + stops[i + 1] + ')";');
|
||||
huebar.append(div);
|
||||
}
|
||||
} else {
|
||||
var stopList = stops.join(',');
|
||||
huebar.attr('style', 'background:-webkit-linear-gradient(top,' + stopList + '); background: -o-linear-gradient(top,' + stopList + '); background: -ms-linear-gradient(top,' + stopList + '); background:-moz-linear-gradient(top,' + stopList + '); -webkit-linear-gradient(top,' + stopList + '); background:linear-gradient(to bottom,' + stopList + '); ');
|
||||
}
|
||||
cal.find('div.colpick_hue').on('mousedown touchstart', downHue);
|
||||
options.newColor = cal.find('div.colpick_new_color');
|
||||
options.currentColor = cal.find('div.colpick_current_color');
|
||||
//Store options and fill with default color
|
||||
cal.data('colpick', options);
|
||||
fillRGBFields(options.color, cal.get(0));
|
||||
fillHSBFields(options.color, cal.get(0));
|
||||
fillHexFields(options.color, cal.get(0));
|
||||
setHue(options.color, cal.get(0));
|
||||
setSelector(options.color, cal.get(0));
|
||||
setCurrentColor(options.color, cal.get(0));
|
||||
setNewColor(options.color, cal.get(0));
|
||||
//Append to body if flat=false, else show in place
|
||||
if (options.flat) {
|
||||
cal.appendTo(options.appendTo || this).show();
|
||||
cal.css(options.styles || {
|
||||
position: 'relative',
|
||||
display: 'block'
|
||||
});
|
||||
} else {
|
||||
cal.appendTo(options.appendTo || document.body);
|
||||
$(this).on(options.showEvent, show);
|
||||
cal.css(options.styles || {
|
||||
position: 'absolute'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
//Shows the picker
|
||||
showPicker: function () {
|
||||
return this.each(function () {
|
||||
if ($(this).data('colpickId')) {
|
||||
show.apply(this);
|
||||
}
|
||||
});
|
||||
},
|
||||
//Hides the picker
|
||||
hidePicker: function () {
|
||||
return this.each(function () {
|
||||
if ($(this).data('colpickId')) {
|
||||
hide.apply(this);
|
||||
}
|
||||
});
|
||||
},
|
||||
//Sets a color as new and current (default)
|
||||
setColor: function (col, setCurrent) {
|
||||
setCurrent = (typeof setCurrent === "undefined") ? 1 : setCurrent;
|
||||
if (typeof col == 'string') {
|
||||
col = hexToHsb(col);
|
||||
} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
|
||||
col = rgbToHsb(col);
|
||||
} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
|
||||
col = fixHSB(col);
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
return this.each(function () {
|
||||
if ($(this).data('colpickId')) {
|
||||
var cal = $('#' + $(this).data('colpickId'));
|
||||
cal.data('colpick').color = col;
|
||||
cal.data('colpick').origColor = col;
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
fillHexFields(col, cal.get(0));
|
||||
setHue(col, cal.get(0));
|
||||
setSelector(col, cal.get(0));
|
||||
|
||||
setNewColor(col, cal.get(0));
|
||||
cal.data('colpick').onChange.apply(cal.parent(), [col, hsbToHex(col), hsbToRgb(col), cal.data('colpick').el, 1]);
|
||||
if (setCurrent) {
|
||||
setCurrentColor(col, cal.get(0));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
destroy: function () {
|
||||
$('#' + $(this).data('colpickId')).remove();
|
||||
}
|
||||
};
|
||||
}();
|
||||
//Color space conversions
|
||||
var hexToRgb = function (hex) {
|
||||
hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
|
||||
return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
|
||||
};
|
||||
var hexToHsb = function (hex) {
|
||||
return rgbToHsb(hexToRgb(hex));
|
||||
};
|
||||
var rgbToHsb = function (rgb) {
|
||||
var hsb = {h: 0, s: 0, b: 0};
|
||||
var min = Math.min(rgb.r, rgb.g, rgb.b);
|
||||
var max = Math.max(rgb.r, rgb.g, rgb.b);
|
||||
var delta = max - min;
|
||||
hsb.b = max;
|
||||
hsb.s = max != 0 ? 255 * delta / max : 0;
|
||||
if (hsb.s != 0) {
|
||||
if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
|
||||
else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
|
||||
else hsb.h = 4 + (rgb.r - rgb.g) / delta;
|
||||
} else hsb.h = -1;
|
||||
hsb.h *= 60;
|
||||
if (hsb.h < 0) hsb.h += 360;
|
||||
hsb.s *= 100 / 255;
|
||||
hsb.b *= 100 / 255;
|
||||
return hsb;
|
||||
};
|
||||
var hsbToRgb = function (hsb) {
|
||||
var rgb = {};
|
||||
var h = hsb.h;
|
||||
var s = hsb.s * 255 / 100;
|
||||
var v = hsb.b * 255 / 100;
|
||||
if (s == 0) {
|
||||
rgb.r = rgb.g = rgb.b = v;
|
||||
} else {
|
||||
var t1 = v;
|
||||
var t2 = (255 - s) * v / 255;
|
||||
var t3 = (t1 - t2) * (h % 60) / 60;
|
||||
if (h == 360) h = 0;
|
||||
if (h < 60) {
|
||||
rgb.r = t1;
|
||||
rgb.b = t2;
|
||||
rgb.g = t2 + t3
|
||||
}
|
||||
else if (h < 120) {
|
||||
rgb.g = t1;
|
||||
rgb.b = t2;
|
||||
rgb.r = t1 - t3
|
||||
}
|
||||
else if (h < 180) {
|
||||
rgb.g = t1;
|
||||
rgb.r = t2;
|
||||
rgb.b = t2 + t3
|
||||
}
|
||||
else if (h < 240) {
|
||||
rgb.b = t1;
|
||||
rgb.r = t2;
|
||||
rgb.g = t1 - t3
|
||||
}
|
||||
else if (h < 300) {
|
||||
rgb.b = t1;
|
||||
rgb.g = t2;
|
||||
rgb.r = t2 + t3
|
||||
}
|
||||
else if (h < 360) {
|
||||
rgb.r = t1;
|
||||
rgb.g = t2;
|
||||
rgb.b = t1 - t3
|
||||
}
|
||||
else {
|
||||
rgb.r = 0;
|
||||
rgb.g = 0;
|
||||
rgb.b = 0
|
||||
}
|
||||
}
|
||||
return {r: Math.round(rgb.r), g: Math.round(rgb.g), b: Math.round(rgb.b)};
|
||||
};
|
||||
var rgbToHex = function (rgb) {
|
||||
var hex = [
|
||||
rgb.r.toString(16),
|
||||
rgb.g.toString(16),
|
||||
rgb.b.toString(16)
|
||||
];
|
||||
$.each(hex, function (nr, val) {
|
||||
if (val.length == 1) {
|
||||
hex[nr] = '0' + val;
|
||||
}
|
||||
});
|
||||
return hex.join('');
|
||||
};
|
||||
var hsbToHex = function (hsb) {
|
||||
return rgbToHex(hsbToRgb(hsb));
|
||||
};
|
||||
$.fn.extend({
|
||||
colpick: colpick.init,
|
||||
colpickHide: colpick.hidePicker,
|
||||
colpickShow: colpick.showPicker,
|
||||
colpickSetColor: colpick.setColor,
|
||||
colpickDestroy: colpick.destroy
|
||||
});
|
||||
$.extend({
|
||||
colpick: {
|
||||
rgbToHex: rgbToHex,
|
||||
rgbToHsb: rgbToHsb,
|
||||
hsbToHex: hsbToHex,
|
||||
hsbToRgb: hsbToRgb,
|
||||
hexToHsb: hexToHsb,
|
||||
hexToRgb: hexToRgb
|
||||
}
|
||||
});
|
||||
}));
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 275 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
|
||||
The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts:
|
||||
|
||||
```html
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
|
||||
rel="stylesheet">
|
||||
```
|
||||
|
||||
Read more in our full usage guide:
|
||||
http://google.github.io/material-design-icons/#icon-font-for-the-web
|
||||
@@ -0,0 +1,932 @@
|
||||
3d_rotation e84d
|
||||
ac_unit eb3b
|
||||
access_alarm e190
|
||||
access_alarms e191
|
||||
access_time e192
|
||||
accessibility e84e
|
||||
accessible e914
|
||||
account_balance e84f
|
||||
account_balance_wallet e850
|
||||
account_box e851
|
||||
account_circle e853
|
||||
adb e60e
|
||||
add e145
|
||||
add_a_photo e439
|
||||
add_alarm e193
|
||||
add_alert e003
|
||||
add_box e146
|
||||
add_circle e147
|
||||
add_circle_outline e148
|
||||
add_location e567
|
||||
add_shopping_cart e854
|
||||
add_to_photos e39d
|
||||
add_to_queue e05c
|
||||
adjust e39e
|
||||
airline_seat_flat e630
|
||||
airline_seat_flat_angled e631
|
||||
airline_seat_individual_suite e632
|
||||
airline_seat_legroom_extra e633
|
||||
airline_seat_legroom_normal e634
|
||||
airline_seat_legroom_reduced e635
|
||||
airline_seat_recline_extra e636
|
||||
airline_seat_recline_normal e637
|
||||
airplanemode_active e195
|
||||
airplanemode_inactive e194
|
||||
airplay e055
|
||||
airport_shuttle eb3c
|
||||
alarm e855
|
||||
alarm_add e856
|
||||
alarm_off e857
|
||||
alarm_on e858
|
||||
album e019
|
||||
all_inclusive eb3d
|
||||
all_out e90b
|
||||
android e859
|
||||
announcement e85a
|
||||
apps e5c3
|
||||
archive e149
|
||||
arrow_back e5c4
|
||||
arrow_downward e5db
|
||||
arrow_drop_down e5c5
|
||||
arrow_drop_down_circle e5c6
|
||||
arrow_drop_up e5c7
|
||||
arrow_forward e5c8
|
||||
arrow_upward e5d8
|
||||
art_track e060
|
||||
aspect_ratio e85b
|
||||
assessment e85c
|
||||
assignment e85d
|
||||
assignment_ind e85e
|
||||
assignment_late e85f
|
||||
assignment_return e860
|
||||
assignment_returned e861
|
||||
assignment_turned_in e862
|
||||
assistant e39f
|
||||
assistant_photo e3a0
|
||||
attach_file e226
|
||||
attach_money e227
|
||||
attachment e2bc
|
||||
audiotrack e3a1
|
||||
autorenew e863
|
||||
av_timer e01b
|
||||
backspace e14a
|
||||
backup e864
|
||||
battery_alert e19c
|
||||
battery_charging_full e1a3
|
||||
battery_full e1a4
|
||||
battery_std e1a5
|
||||
battery_unknown e1a6
|
||||
beach_access eb3e
|
||||
beenhere e52d
|
||||
block e14b
|
||||
bluetooth e1a7
|
||||
bluetooth_audio e60f
|
||||
bluetooth_connected e1a8
|
||||
bluetooth_disabled e1a9
|
||||
bluetooth_searching e1aa
|
||||
blur_circular e3a2
|
||||
blur_linear e3a3
|
||||
blur_off e3a4
|
||||
blur_on e3a5
|
||||
book e865
|
||||
bookmark e866
|
||||
bookmark_border e867
|
||||
border_all e228
|
||||
border_bottom e229
|
||||
border_clear e22a
|
||||
border_color e22b
|
||||
border_horizontal e22c
|
||||
border_inner e22d
|
||||
border_left e22e
|
||||
border_outer e22f
|
||||
border_right e230
|
||||
border_style e231
|
||||
border_top e232
|
||||
border_vertical e233
|
||||
branding_watermark e06b
|
||||
brightness_1 e3a6
|
||||
brightness_2 e3a7
|
||||
brightness_3 e3a8
|
||||
brightness_4 e3a9
|
||||
brightness_5 e3aa
|
||||
brightness_6 e3ab
|
||||
brightness_7 e3ac
|
||||
brightness_auto e1ab
|
||||
brightness_high e1ac
|
||||
brightness_low e1ad
|
||||
brightness_medium e1ae
|
||||
broken_image e3ad
|
||||
brush e3ae
|
||||
bubble_chart e6dd
|
||||
bug_report e868
|
||||
build e869
|
||||
burst_mode e43c
|
||||
business e0af
|
||||
business_center eb3f
|
||||
cached e86a
|
||||
cake e7e9
|
||||
call e0b0
|
||||
call_end e0b1
|
||||
call_made e0b2
|
||||
call_merge e0b3
|
||||
call_missed e0b4
|
||||
call_missed_outgoing e0e4
|
||||
call_received e0b5
|
||||
call_split e0b6
|
||||
call_to_action e06c
|
||||
camera e3af
|
||||
camera_alt e3b0
|
||||
camera_enhance e8fc
|
||||
camera_front e3b1
|
||||
camera_rear e3b2
|
||||
camera_roll e3b3
|
||||
cancel e5c9
|
||||
card_giftcard e8f6
|
||||
card_membership e8f7
|
||||
card_travel e8f8
|
||||
casino eb40
|
||||
cast e307
|
||||
cast_connected e308
|
||||
center_focus_strong e3b4
|
||||
center_focus_weak e3b5
|
||||
change_history e86b
|
||||
chat e0b7
|
||||
chat_bubble e0ca
|
||||
chat_bubble_outline e0cb
|
||||
check e5ca
|
||||
check_box e834
|
||||
check_box_outline_blank e835
|
||||
check_circle e86c
|
||||
chevron_left e5cb
|
||||
chevron_right e5cc
|
||||
child_care eb41
|
||||
child_friendly eb42
|
||||
chrome_reader_mode e86d
|
||||
class e86e
|
||||
clear e14c
|
||||
clear_all e0b8
|
||||
close e5cd
|
||||
closed_caption e01c
|
||||
cloud e2bd
|
||||
cloud_circle e2be
|
||||
cloud_done e2bf
|
||||
cloud_download e2c0
|
||||
cloud_off e2c1
|
||||
cloud_queue e2c2
|
||||
cloud_upload e2c3
|
||||
code e86f
|
||||
collections e3b6
|
||||
collections_bookmark e431
|
||||
color_lens e3b7
|
||||
colorize e3b8
|
||||
comment e0b9
|
||||
compare e3b9
|
||||
compare_arrows e915
|
||||
computer e30a
|
||||
confirmation_number e638
|
||||
contact_mail e0d0
|
||||
contact_phone e0cf
|
||||
contacts e0ba
|
||||
content_copy e14d
|
||||
content_cut e14e
|
||||
content_paste e14f
|
||||
control_point e3ba
|
||||
control_point_duplicate e3bb
|
||||
copyright e90c
|
||||
create e150
|
||||
create_new_folder e2cc
|
||||
credit_card e870
|
||||
crop e3be
|
||||
crop_16_9 e3bc
|
||||
crop_3_2 e3bd
|
||||
crop_5_4 e3bf
|
||||
crop_7_5 e3c0
|
||||
crop_din e3c1
|
||||
crop_free e3c2
|
||||
crop_landscape e3c3
|
||||
crop_original e3c4
|
||||
crop_portrait e3c5
|
||||
crop_rotate e437
|
||||
crop_square e3c6
|
||||
dashboard e871
|
||||
data_usage e1af
|
||||
date_range e916
|
||||
dehaze e3c7
|
||||
delete e872
|
||||
delete_forever e92b
|
||||
delete_sweep e16c
|
||||
description e873
|
||||
desktop_mac e30b
|
||||
desktop_windows e30c
|
||||
details e3c8
|
||||
developer_board e30d
|
||||
developer_mode e1b0
|
||||
device_hub e335
|
||||
devices e1b1
|
||||
devices_other e337
|
||||
dialer_sip e0bb
|
||||
dialpad e0bc
|
||||
directions e52e
|
||||
directions_bike e52f
|
||||
directions_boat e532
|
||||
directions_bus e530
|
||||
directions_car e531
|
||||
directions_railway e534
|
||||
directions_run e566
|
||||
directions_subway e533
|
||||
directions_transit e535
|
||||
directions_walk e536
|
||||
disc_full e610
|
||||
dns e875
|
||||
do_not_disturb e612
|
||||
do_not_disturb_alt e611
|
||||
do_not_disturb_off e643
|
||||
do_not_disturb_on e644
|
||||
dock e30e
|
||||
domain e7ee
|
||||
done e876
|
||||
done_all e877
|
||||
donut_large e917
|
||||
donut_small e918
|
||||
drafts e151
|
||||
drag_handle e25d
|
||||
drive_eta e613
|
||||
dvr e1b2
|
||||
edit e3c9
|
||||
edit_location e568
|
||||
eject e8fb
|
||||
email e0be
|
||||
enhanced_encryption e63f
|
||||
equalizer e01d
|
||||
error e000
|
||||
error_outline e001
|
||||
euro_symbol e926
|
||||
ev_station e56d
|
||||
event e878
|
||||
event_available e614
|
||||
event_busy e615
|
||||
event_note e616
|
||||
event_seat e903
|
||||
exit_to_app e879
|
||||
expand_less e5ce
|
||||
expand_more e5cf
|
||||
explicit e01e
|
||||
explore e87a
|
||||
exposure e3ca
|
||||
exposure_neg_1 e3cb
|
||||
exposure_neg_2 e3cc
|
||||
exposure_plus_1 e3cd
|
||||
exposure_plus_2 e3ce
|
||||
exposure_zero e3cf
|
||||
extension e87b
|
||||
face e87c
|
||||
fast_forward e01f
|
||||
fast_rewind e020
|
||||
favorite e87d
|
||||
favorite_border e87e
|
||||
featured_play_list e06d
|
||||
featured_video e06e
|
||||
feedback e87f
|
||||
fiber_dvr e05d
|
||||
fiber_manual_record e061
|
||||
fiber_new e05e
|
||||
fiber_pin e06a
|
||||
fiber_smart_record e062
|
||||
file_download e2c4
|
||||
file_upload e2c6
|
||||
filter e3d3
|
||||
filter_1 e3d0
|
||||
filter_2 e3d1
|
||||
filter_3 e3d2
|
||||
filter_4 e3d4
|
||||
filter_5 e3d5
|
||||
filter_6 e3d6
|
||||
filter_7 e3d7
|
||||
filter_8 e3d8
|
||||
filter_9 e3d9
|
||||
filter_9_plus e3da
|
||||
filter_b_and_w e3db
|
||||
filter_center_focus e3dc
|
||||
filter_drama e3dd
|
||||
filter_frames e3de
|
||||
filter_hdr e3df
|
||||
filter_list e152
|
||||
filter_none e3e0
|
||||
filter_tilt_shift e3e2
|
||||
filter_vintage e3e3
|
||||
find_in_page e880
|
||||
find_replace e881
|
||||
fingerprint e90d
|
||||
first_page e5dc
|
||||
fitness_center eb43
|
||||
flag e153
|
||||
flare e3e4
|
||||
flash_auto e3e5
|
||||
flash_off e3e6
|
||||
flash_on e3e7
|
||||
flight e539
|
||||
flight_land e904
|
||||
flight_takeoff e905
|
||||
flip e3e8
|
||||
flip_to_back e882
|
||||
flip_to_front e883
|
||||
folder e2c7
|
||||
folder_open e2c8
|
||||
folder_shared e2c9
|
||||
folder_special e617
|
||||
font_download e167
|
||||
format_align_center e234
|
||||
format_align_justify e235
|
||||
format_align_left e236
|
||||
format_align_right e237
|
||||
format_bold e238
|
||||
format_clear e239
|
||||
format_color_fill e23a
|
||||
format_color_reset e23b
|
||||
format_color_text e23c
|
||||
format_indent_decrease e23d
|
||||
format_indent_increase e23e
|
||||
format_italic e23f
|
||||
format_line_spacing e240
|
||||
format_list_bulleted e241
|
||||
format_list_numbered e242
|
||||
format_paint e243
|
||||
format_quote e244
|
||||
format_shapes e25e
|
||||
format_size e245
|
||||
format_strikethrough e246
|
||||
format_textdirection_l_to_r e247
|
||||
format_textdirection_r_to_l e248
|
||||
format_underlined e249
|
||||
forum e0bf
|
||||
forward e154
|
||||
forward_10 e056
|
||||
forward_30 e057
|
||||
forward_5 e058
|
||||
free_breakfast eb44
|
||||
fullscreen e5d0
|
||||
fullscreen_exit e5d1
|
||||
functions e24a
|
||||
g_translate e927
|
||||
gamepad e30f
|
||||
games e021
|
||||
gavel e90e
|
||||
gesture e155
|
||||
get_app e884
|
||||
gif e908
|
||||
golf_course eb45
|
||||
gps_fixed e1b3
|
||||
gps_not_fixed e1b4
|
||||
gps_off e1b5
|
||||
grade e885
|
||||
gradient e3e9
|
||||
grain e3ea
|
||||
graphic_eq e1b8
|
||||
grid_off e3eb
|
||||
grid_on e3ec
|
||||
group e7ef
|
||||
group_add e7f0
|
||||
group_work e886
|
||||
hd e052
|
||||
hdr_off e3ed
|
||||
hdr_on e3ee
|
||||
hdr_strong e3f1
|
||||
hdr_weak e3f2
|
||||
headset e310
|
||||
headset_mic e311
|
||||
healing e3f3
|
||||
hearing e023
|
||||
help e887
|
||||
help_outline e8fd
|
||||
high_quality e024
|
||||
highlight e25f
|
||||
highlight_off e888
|
||||
history e889
|
||||
home e88a
|
||||
hot_tub eb46
|
||||
hotel e53a
|
||||
hourglass_empty e88b
|
||||
hourglass_full e88c
|
||||
http e902
|
||||
https e88d
|
||||
image e3f4
|
||||
image_aspect_ratio e3f5
|
||||
import_contacts e0e0
|
||||
import_export e0c3
|
||||
important_devices e912
|
||||
inbox e156
|
||||
indeterminate_check_box e909
|
||||
info e88e
|
||||
info_outline e88f
|
||||
input e890
|
||||
insert_chart e24b
|
||||
insert_comment e24c
|
||||
insert_drive_file e24d
|
||||
insert_emoticon e24e
|
||||
insert_invitation e24f
|
||||
insert_link e250
|
||||
insert_photo e251
|
||||
invert_colors e891
|
||||
invert_colors_off e0c4
|
||||
iso e3f6
|
||||
keyboard e312
|
||||
keyboard_arrow_down e313
|
||||
keyboard_arrow_left e314
|
||||
keyboard_arrow_right e315
|
||||
keyboard_arrow_up e316
|
||||
keyboard_backspace e317
|
||||
keyboard_capslock e318
|
||||
keyboard_hide e31a
|
||||
keyboard_return e31b
|
||||
keyboard_tab e31c
|
||||
keyboard_voice e31d
|
||||
kitchen eb47
|
||||
label e892
|
||||
label_outline e893
|
||||
landscape e3f7
|
||||
language e894
|
||||
laptop e31e
|
||||
laptop_chromebook e31f
|
||||
laptop_mac e320
|
||||
laptop_windows e321
|
||||
last_page e5dd
|
||||
launch e895
|
||||
layers e53b
|
||||
layers_clear e53c
|
||||
leak_add e3f8
|
||||
leak_remove e3f9
|
||||
lens e3fa
|
||||
library_add e02e
|
||||
library_books e02f
|
||||
library_music e030
|
||||
lightbulb_outline e90f
|
||||
line_style e919
|
||||
line_weight e91a
|
||||
linear_scale e260
|
||||
link e157
|
||||
linked_camera e438
|
||||
list e896
|
||||
live_help e0c6
|
||||
live_tv e639
|
||||
local_activity e53f
|
||||
local_airport e53d
|
||||
local_atm e53e
|
||||
local_bar e540
|
||||
local_cafe e541
|
||||
local_car_wash e542
|
||||
local_convenience_store e543
|
||||
local_dining e556
|
||||
local_drink e544
|
||||
local_florist e545
|
||||
local_gas_station e546
|
||||
local_grocery_store e547
|
||||
local_hospital e548
|
||||
local_hotel e549
|
||||
local_laundry_service e54a
|
||||
local_library e54b
|
||||
local_mall e54c
|
||||
local_movies e54d
|
||||
local_offer e54e
|
||||
local_parking e54f
|
||||
local_pharmacy e550
|
||||
local_phone e551
|
||||
local_pizza e552
|
||||
local_play e553
|
||||
local_post_office e554
|
||||
local_printshop e555
|
||||
local_see e557
|
||||
local_shipping e558
|
||||
local_taxi e559
|
||||
location_city e7f1
|
||||
location_disabled e1b6
|
||||
location_off e0c7
|
||||
location_on e0c8
|
||||
location_searching e1b7
|
||||
lock e897
|
||||
lock_open e898
|
||||
lock_outline e899
|
||||
looks e3fc
|
||||
looks_3 e3fb
|
||||
looks_4 e3fd
|
||||
looks_5 e3fe
|
||||
looks_6 e3ff
|
||||
looks_one e400
|
||||
looks_two e401
|
||||
loop e028
|
||||
loupe e402
|
||||
low_priority e16d
|
||||
loyalty e89a
|
||||
mail e158
|
||||
mail_outline e0e1
|
||||
map e55b
|
||||
markunread e159
|
||||
markunread_mailbox e89b
|
||||
memory e322
|
||||
menu e5d2
|
||||
merge_type e252
|
||||
message e0c9
|
||||
mic e029
|
||||
mic_none e02a
|
||||
mic_off e02b
|
||||
mms e618
|
||||
mode_comment e253
|
||||
mode_edit e254
|
||||
monetization_on e263
|
||||
money_off e25c
|
||||
monochrome_photos e403
|
||||
mood e7f2
|
||||
mood_bad e7f3
|
||||
more e619
|
||||
more_horiz e5d3
|
||||
more_vert e5d4
|
||||
motorcycle e91b
|
||||
mouse e323
|
||||
move_to_inbox e168
|
||||
movie e02c
|
||||
movie_creation e404
|
||||
movie_filter e43a
|
||||
multiline_chart e6df
|
||||
music_note e405
|
||||
music_video e063
|
||||
my_location e55c
|
||||
nature e406
|
||||
nature_people e407
|
||||
navigate_before e408
|
||||
navigate_next e409
|
||||
navigation e55d
|
||||
near_me e569
|
||||
network_cell e1b9
|
||||
network_check e640
|
||||
network_locked e61a
|
||||
network_wifi e1ba
|
||||
new_releases e031
|
||||
next_week e16a
|
||||
nfc e1bb
|
||||
no_encryption e641
|
||||
no_sim e0cc
|
||||
not_interested e033
|
||||
note e06f
|
||||
note_add e89c
|
||||
notifications e7f4
|
||||
notifications_active e7f7
|
||||
notifications_none e7f5
|
||||
notifications_off e7f6
|
||||
notifications_paused e7f8
|
||||
offline_pin e90a
|
||||
ondemand_video e63a
|
||||
opacity e91c
|
||||
open_in_browser e89d
|
||||
open_in_new e89e
|
||||
open_with e89f
|
||||
pages e7f9
|
||||
pageview e8a0
|
||||
palette e40a
|
||||
pan_tool e925
|
||||
panorama e40b
|
||||
panorama_fish_eye e40c
|
||||
panorama_horizontal e40d
|
||||
panorama_vertical e40e
|
||||
panorama_wide_angle e40f
|
||||
party_mode e7fa
|
||||
pause e034
|
||||
pause_circle_filled e035
|
||||
pause_circle_outline e036
|
||||
payment e8a1
|
||||
people e7fb
|
||||
people_outline e7fc
|
||||
perm_camera_mic e8a2
|
||||
perm_contact_calendar e8a3
|
||||
perm_data_setting e8a4
|
||||
perm_device_information e8a5
|
||||
perm_identity e8a6
|
||||
perm_media e8a7
|
||||
perm_phone_msg e8a8
|
||||
perm_scan_wifi e8a9
|
||||
person e7fd
|
||||
person_add e7fe
|
||||
person_outline e7ff
|
||||
person_pin e55a
|
||||
person_pin_circle e56a
|
||||
personal_video e63b
|
||||
pets e91d
|
||||
phone e0cd
|
||||
phone_android e324
|
||||
phone_bluetooth_speaker e61b
|
||||
phone_forwarded e61c
|
||||
phone_in_talk e61d
|
||||
phone_iphone e325
|
||||
phone_locked e61e
|
||||
phone_missed e61f
|
||||
phone_paused e620
|
||||
phonelink e326
|
||||
phonelink_erase e0db
|
||||
phonelink_lock e0dc
|
||||
phonelink_off e327
|
||||
phonelink_ring e0dd
|
||||
phonelink_setup e0de
|
||||
photo e410
|
||||
photo_album e411
|
||||
photo_camera e412
|
||||
photo_filter e43b
|
||||
photo_library e413
|
||||
photo_size_select_actual e432
|
||||
photo_size_select_large e433
|
||||
photo_size_select_small e434
|
||||
picture_as_pdf e415
|
||||
picture_in_picture e8aa
|
||||
picture_in_picture_alt e911
|
||||
pie_chart e6c4
|
||||
pie_chart_outlined e6c5
|
||||
pin_drop e55e
|
||||
place e55f
|
||||
play_arrow e037
|
||||
play_circle_filled e038
|
||||
play_circle_outline e039
|
||||
play_for_work e906
|
||||
playlist_add e03b
|
||||
playlist_add_check e065
|
||||
playlist_play e05f
|
||||
plus_one e800
|
||||
poll e801
|
||||
polymer e8ab
|
||||
pool eb48
|
||||
portable_wifi_off e0ce
|
||||
portrait e416
|
||||
power e63c
|
||||
power_input e336
|
||||
power_settings_new e8ac
|
||||
pregnant_woman e91e
|
||||
present_to_all e0df
|
||||
print e8ad
|
||||
priority_high e645
|
||||
public e80b
|
||||
publish e255
|
||||
query_builder e8ae
|
||||
question_answer e8af
|
||||
queue e03c
|
||||
queue_music e03d
|
||||
queue_play_next e066
|
||||
radio e03e
|
||||
radio_button_checked e837
|
||||
radio_button_unchecked e836
|
||||
rate_review e560
|
||||
receipt e8b0
|
||||
recent_actors e03f
|
||||
record_voice_over e91f
|
||||
redeem e8b1
|
||||
redo e15a
|
||||
refresh e5d5
|
||||
remove e15b
|
||||
remove_circle e15c
|
||||
remove_circle_outline e15d
|
||||
remove_from_queue e067
|
||||
remove_red_eye e417
|
||||
remove_shopping_cart e928
|
||||
reorder e8fe
|
||||
repeat e040
|
||||
repeat_one e041
|
||||
replay e042
|
||||
replay_10 e059
|
||||
replay_30 e05a
|
||||
replay_5 e05b
|
||||
reply e15e
|
||||
reply_all e15f
|
||||
report e160
|
||||
report_problem e8b2
|
||||
restaurant e56c
|
||||
restaurant_menu e561
|
||||
restore e8b3
|
||||
restore_page e929
|
||||
ring_volume e0d1
|
||||
room e8b4
|
||||
room_service eb49
|
||||
rotate_90_degrees_ccw e418
|
||||
rotate_left e419
|
||||
rotate_right e41a
|
||||
rounded_corner e920
|
||||
router e328
|
||||
rowing e921
|
||||
rss_feed e0e5
|
||||
rv_hookup e642
|
||||
satellite e562
|
||||
save e161
|
||||
scanner e329
|
||||
schedule e8b5
|
||||
school e80c
|
||||
screen_lock_landscape e1be
|
||||
screen_lock_portrait e1bf
|
||||
screen_lock_rotation e1c0
|
||||
screen_rotation e1c1
|
||||
screen_share e0e2
|
||||
sd_card e623
|
||||
sd_storage e1c2
|
||||
search e8b6
|
||||
security e32a
|
||||
select_all e162
|
||||
send e163
|
||||
sentiment_dissatisfied e811
|
||||
sentiment_neutral e812
|
||||
sentiment_satisfied e813
|
||||
sentiment_very_dissatisfied e814
|
||||
sentiment_very_satisfied e815
|
||||
settings e8b8
|
||||
settings_applications e8b9
|
||||
settings_backup_restore e8ba
|
||||
settings_bluetooth e8bb
|
||||
settings_brightness e8bd
|
||||
settings_cell e8bc
|
||||
settings_ethernet e8be
|
||||
settings_input_antenna e8bf
|
||||
settings_input_component e8c0
|
||||
settings_input_composite e8c1
|
||||
settings_input_hdmi e8c2
|
||||
settings_input_svideo e8c3
|
||||
settings_overscan e8c4
|
||||
settings_phone e8c5
|
||||
settings_power e8c6
|
||||
settings_remote e8c7
|
||||
settings_system_daydream e1c3
|
||||
settings_voice e8c8
|
||||
share e80d
|
||||
shop e8c9
|
||||
shop_two e8ca
|
||||
shopping_basket e8cb
|
||||
shopping_cart e8cc
|
||||
short_text e261
|
||||
show_chart e6e1
|
||||
shuffle e043
|
||||
signal_cellular_4_bar e1c8
|
||||
signal_cellular_connected_no_internet_4_bar e1cd
|
||||
signal_cellular_no_sim e1ce
|
||||
signal_cellular_null e1cf
|
||||
signal_cellular_off e1d0
|
||||
signal_wifi_4_bar e1d8
|
||||
signal_wifi_4_bar_lock e1d9
|
||||
signal_wifi_off e1da
|
||||
sim_card e32b
|
||||
sim_card_alert e624
|
||||
skip_next e044
|
||||
skip_previous e045
|
||||
slideshow e41b
|
||||
slow_motion_video e068
|
||||
smartphone e32c
|
||||
smoke_free eb4a
|
||||
smoking_rooms eb4b
|
||||
sms e625
|
||||
sms_failed e626
|
||||
snooze e046
|
||||
sort e164
|
||||
sort_by_alpha e053
|
||||
spa eb4c
|
||||
space_bar e256
|
||||
speaker e32d
|
||||
speaker_group e32e
|
||||
speaker_notes e8cd
|
||||
speaker_notes_off e92a
|
||||
speaker_phone e0d2
|
||||
spellcheck e8ce
|
||||
star e838
|
||||
star_border e83a
|
||||
star_half e839
|
||||
stars e8d0
|
||||
stay_current_landscape e0d3
|
||||
stay_current_portrait e0d4
|
||||
stay_primary_landscape e0d5
|
||||
stay_primary_portrait e0d6
|
||||
stop e047
|
||||
stop_screen_share e0e3
|
||||
storage e1db
|
||||
store e8d1
|
||||
store_mall_directory e563
|
||||
straighten e41c
|
||||
streetview e56e
|
||||
strikethrough_s e257
|
||||
style e41d
|
||||
subdirectory_arrow_left e5d9
|
||||
subdirectory_arrow_right e5da
|
||||
subject e8d2
|
||||
subscriptions e064
|
||||
subtitles e048
|
||||
subway e56f
|
||||
supervisor_account e8d3
|
||||
surround_sound e049
|
||||
swap_calls e0d7
|
||||
swap_horiz e8d4
|
||||
swap_vert e8d5
|
||||
swap_vertical_circle e8d6
|
||||
switch_camera e41e
|
||||
switch_video e41f
|
||||
sync e627
|
||||
sync_disabled e628
|
||||
sync_problem e629
|
||||
system_update e62a
|
||||
system_update_alt e8d7
|
||||
tab e8d8
|
||||
tab_unselected e8d9
|
||||
tablet e32f
|
||||
tablet_android e330
|
||||
tablet_mac e331
|
||||
tag_faces e420
|
||||
tap_and_play e62b
|
||||
terrain e564
|
||||
text_fields e262
|
||||
text_format e165
|
||||
textsms e0d8
|
||||
texture e421
|
||||
theaters e8da
|
||||
thumb_down e8db
|
||||
thumb_up e8dc
|
||||
thumbs_up_down e8dd
|
||||
time_to_leave e62c
|
||||
timelapse e422
|
||||
timeline e922
|
||||
timer e425
|
||||
timer_10 e423
|
||||
timer_3 e424
|
||||
timer_off e426
|
||||
title e264
|
||||
toc e8de
|
||||
today e8df
|
||||
toll e8e0
|
||||
tonality e427
|
||||
touch_app e913
|
||||
toys e332
|
||||
track_changes e8e1
|
||||
traffic e565
|
||||
train e570
|
||||
tram e571
|
||||
transfer_within_a_station e572
|
||||
transform e428
|
||||
translate e8e2
|
||||
trending_down e8e3
|
||||
trending_flat e8e4
|
||||
trending_up e8e5
|
||||
tune e429
|
||||
turned_in e8e6
|
||||
turned_in_not e8e7
|
||||
tv e333
|
||||
unarchive e169
|
||||
undo e166
|
||||
unfold_less e5d6
|
||||
unfold_more e5d7
|
||||
update e923
|
||||
usb e1e0
|
||||
verified_user e8e8
|
||||
vertical_align_bottom e258
|
||||
vertical_align_center e259
|
||||
vertical_align_top e25a
|
||||
vibration e62d
|
||||
video_call e070
|
||||
video_label e071
|
||||
video_library e04a
|
||||
videocam e04b
|
||||
videocam_off e04c
|
||||
videogame_asset e338
|
||||
view_agenda e8e9
|
||||
view_array e8ea
|
||||
view_carousel e8eb
|
||||
view_column e8ec
|
||||
view_comfy e42a
|
||||
view_compact e42b
|
||||
view_day e8ed
|
||||
view_headline e8ee
|
||||
view_list e8ef
|
||||
view_module e8f0
|
||||
view_quilt e8f1
|
||||
view_stream e8f2
|
||||
view_week e8f3
|
||||
vignette e435
|
||||
visibility e8f4
|
||||
visibility_off e8f5
|
||||
voice_chat e62e
|
||||
voicemail e0d9
|
||||
volume_down e04d
|
||||
volume_mute e04e
|
||||
volume_off e04f
|
||||
volume_up e050
|
||||
vpn_key e0da
|
||||
vpn_lock e62f
|
||||
wallpaper e1bc
|
||||
warning e002
|
||||
watch e334
|
||||
watch_later e924
|
||||
wb_auto e42c
|
||||
wb_cloudy e42d
|
||||
wb_incandescent e42e
|
||||
wb_iridescent e436
|
||||
wb_sunny e430
|
||||
wc e63d
|
||||
web e051
|
||||
web_asset e069
|
||||
weekend e16b
|
||||
whatshot e80e
|
||||
widgets e1bd
|
||||
wifi e63e
|
||||
wifi_lock e1e1
|
||||
wifi_tethering e1e2
|
||||
work e8f9
|
||||
wrap_text e25b
|
||||
youtube_searched_for e8fa
|
||||
zoom_in e8ff
|
||||
zoom_out e900
|
||||
zoom_out_map e56b
|
||||
@@ -0,0 +1,36 @@
|
||||
@font-face {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(MaterialIcons-Regular.eot); /* For IE6-8 */
|
||||
src: local('Material Icons'),
|
||||
local('MaterialIcons-Regular'),
|
||||
url(MaterialIcons-Regular.woff2) format('woff2'),
|
||||
url(MaterialIcons-Regular.woff) format('woff'),
|
||||
url(MaterialIcons-Regular.ttf) format('truetype');
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-size: 24px; /* Preferred icon size */
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-wrap: normal;
|
||||
white-space: nowrap;
|
||||
direction: ltr;
|
||||
|
||||
/* Support for all WebKit browsers. */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
/* Support for Safari and Chrome. */
|
||||
text-rendering: optimizeLegibility;
|
||||
|
||||
/* Support for Firefox. */
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Support for IE. */
|
||||
font-feature-settings: 'liga';
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
@font-face {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(iconfont/MaterialIcons-Regular.eot); /* For IE6-8 */
|
||||
src: local('Material Icons'),
|
||||
local('MaterialIcons-Regular'),
|
||||
url(iconfont/MaterialIcons-Regular.woff2) format('woff2'),
|
||||
url(iconfont/MaterialIcons-Regular.woff) format('woff'),
|
||||
url(iconfont/MaterialIcons-Regular.ttf) format('truetype');
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-size: 24px; /* Preferred icon size */
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-wrap: normal;
|
||||
white-space: nowrap;
|
||||
direction: ltr;
|
||||
|
||||
/* Support for all WebKit browsers. */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
/* Support for Safari and Chrome. */
|
||||
text-rendering: optimizeLegibility;
|
||||
|
||||
/* Support for Firefox. */
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Support for IE. */
|
||||
font-feature-settings: 'liga';
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
(function($){
|
||||
$(function(){
|
||||
|
||||
$('.sidenav').sidenav();
|
||||
|
||||
}); // end of document ready
|
||||
})(jQuery); // end of jQuery name space
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
|
||||
(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
|
||||
write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
|
||||
for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
|
||||
7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
|
||||
0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
|
||||
setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
|
||||
j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
|
||||
b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
|
||||
c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
|
||||
0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
|
||||
(d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
|
||||
78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
|
||||
j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
|
||||
a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
|
||||
a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
|
||||
2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
|
||||
LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
|
||||
this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
|
||||
[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
|
||||
116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
|
||||
43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
|
||||
3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
|
||||
55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
|
||||
45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
|
||||
(a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
|
||||
correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
|
||||
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
|
||||
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery);
|
||||
File diff suppressed because one or more lines are too long
+12337
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,894 @@
|
||||
tooltipBackedUp = "This backup has been uploaded to Google Drive."
|
||||
tooltipDriveOnly = "This backup is only in Google Drive. Select \"Upload\" from the actions menu to Upload it to Home Assistant."
|
||||
tooltipHassio = "This backup is only in Home Assistant. Change the number of backups you keep in Drive to get it to upload."
|
||||
tooltipWaiting = "This backup is waiting to upload to Google Drive."
|
||||
tooltipLoading = "This backup is being downloaded from Google Drive to Home Assistant. Soon it will be available to restore."
|
||||
tooltipPending = "This backup is being created. If it takes a long time, see the addon's FAQ on GitHub"
|
||||
tooltipUploading = "This backup is being uploaded to Google Drive."
|
||||
|
||||
var github_bug_desc = `
|
||||
Please add some information about your configuration and the problem you ran into here.
|
||||
More info really helps speed up debugging, if you don't even read this and help me understand what happened, I probably won't help you.
|
||||
Remember that its just one guy back here doing all of this.
|
||||
If english isn't your first language, don't sweat it. Just try to be clear and I'll do the same for you. Some things you might consider including:
|
||||
* What were you doing when the problem happened?
|
||||
* A screenshot if its something visual.
|
||||
* What configuration options are you using with the add-on?
|
||||
* What logs is the add-on printing out? You can see the detailed logs by clicking "Logs" at the right of the web-UI.
|
||||
* Are there any problematic looking logs from the supervisor? You can get to them from the Home Assistant Interface from "Supervisor" > "System" > "System Log"
|
||||
\n\n`;
|
||||
var name_keys = {}
|
||||
|
||||
function toggleSlide(checkbox, target) {
|
||||
if ($(checkbox).is(':checked')) {
|
||||
$('#' + target).slideDown(400);
|
||||
} else {
|
||||
$('#' + target).slideUp(400);
|
||||
}
|
||||
}
|
||||
|
||||
function toggleLinkSlide(checkbox, target) {
|
||||
target = $('#' + target);
|
||||
if (target.is(":visible")) {
|
||||
target.slideUp(400);
|
||||
} else {
|
||||
target.slideDown(400);
|
||||
}
|
||||
}
|
||||
|
||||
function sourceToName(source) {
|
||||
if (source == "GoogleDrive") {
|
||||
return "Google Drive";
|
||||
} else if (source == "HomeAssistant") {
|
||||
return "Home Assistant";
|
||||
} else {
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function restoreClick(target) {
|
||||
$('#restore_help_card').fadeIn(500);
|
||||
//window.top.location.replace($(target).data('url'))
|
||||
}
|
||||
|
||||
function setInputValue(id, value) {
|
||||
if (value == null) {
|
||||
// Leave at default
|
||||
return;
|
||||
}
|
||||
if (typeof (value) == 'boolean') {
|
||||
$('#' + id).prop('checked', value);
|
||||
} else {
|
||||
$('#' + id).val(value);
|
||||
}
|
||||
}
|
||||
|
||||
function test(target) {
|
||||
console.log(target);
|
||||
}
|
||||
|
||||
function downloadBackup(target) {
|
||||
window.location.assign('download?slug=' + encodeURIComponent($(target).data('backup').slug));
|
||||
}
|
||||
|
||||
function uploadBackup(target) {
|
||||
var slug = $(target).data('backup').slug;
|
||||
var name = $(target).data('backup').name;
|
||||
$("#do_upload_button").attr("onClick", "doUpload('" + slug + "', '" + name + "')");
|
||||
}
|
||||
|
||||
function doUpload(slug, name) {
|
||||
message = "Uploading '" + name + "'";
|
||||
url = "upload?slug=" + encodeURIComponent(slug);
|
||||
postJson(url, {}, refreshstats, null, message);
|
||||
}
|
||||
|
||||
function configureDetailBadge(name, text, show) {
|
||||
let container = $('.' + name);
|
||||
let span = $('.detail-name', container);
|
||||
if (show) {
|
||||
span.html(text);
|
||||
container.show();
|
||||
} else {
|
||||
container.hide();
|
||||
}
|
||||
}
|
||||
var SIZE_SI = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
|
||||
function asSizeString(size) {
|
||||
current = size * 1.0;
|
||||
for (let id in SIZE_SI) {
|
||||
if (current < 1024) {
|
||||
return (Math.round(current * 10) / 10) + " " + SIZE_SI[id];
|
||||
}
|
||||
current /= 1024
|
||||
}
|
||||
return "Beyond mortal comprehension"
|
||||
}
|
||||
|
||||
function errorReports(send) {
|
||||
var jqxhr = $.get("errorreports?send=" + send)
|
||||
$('#error_reports_card').fadeOut(500)
|
||||
}
|
||||
hideIngress = false;
|
||||
function exposeServer(expose) {
|
||||
var url = "exposeserver?expose=" + expose;
|
||||
postJson(url, {}, function (data) {
|
||||
$('#ingress_upgrade_card').fadeOut(500);
|
||||
if (expose == "true") {
|
||||
refreshstats();
|
||||
} else {
|
||||
if (data.hasOwnProperty("redirect")) {
|
||||
// Reqirect to the url
|
||||
window.location.assign(data.redirect.replace("{host}", window.location.hostname))
|
||||
}
|
||||
}
|
||||
}, null, "Saving setting...");
|
||||
}
|
||||
|
||||
function callBackupSnapshot(doSwitch) {
|
||||
var url = "callbackupsnapshot?switch=" + doSwitch;
|
||||
postJson(url, {}, function (data) {
|
||||
$('#backup_upgrade_card').fadeOut(500);
|
||||
refreshstats();
|
||||
}, null, "Saving...");
|
||||
}
|
||||
|
||||
function dismissIgnoredBackupWarning(doSwitch) {
|
||||
var url = "ignoredbackupswitch?switch=" + doSwitch;
|
||||
postJson(url, {}, function (data) {
|
||||
$('#warn_upgrade_backups_card').fadeOut(500);
|
||||
refreshstats();
|
||||
}, null, "Saving settings...");
|
||||
}
|
||||
|
||||
function ackCheckIgnoredBackups() {
|
||||
postJson("ackignorecheck", {}, function (data) {
|
||||
$('#ignore_helper_card').fadeOut(500);
|
||||
}, null, "Acknowledging...");
|
||||
|
||||
}
|
||||
|
||||
function aknowledgeooboauth() {
|
||||
var url = "aknowledgeooboauth";
|
||||
postJson(url, {}, function (data) {
|
||||
$('#warn_creds_deprecated_card').fadeOut(500);
|
||||
refreshstats();
|
||||
}, null, "Acknowledging...");
|
||||
}
|
||||
|
||||
function resolvefolder(use_existing) {
|
||||
var url = "resolvefolder?use_existing=" + use_existing;
|
||||
postJson(url, {}, refreshstats, null, null);
|
||||
setErrorWatermark();
|
||||
$('#existing_backup_folder').hide();
|
||||
refreshstats();
|
||||
}
|
||||
|
||||
function allowImmediateBackup(use_existing) {
|
||||
var url = "ignorestartupcooldown";
|
||||
postJson("ignorestartupcooldown", {}, refreshstats, null, "Ignoring delay...");
|
||||
$('#backups_boot_waiting_card').hide();
|
||||
refreshstats();
|
||||
}
|
||||
|
||||
function sync(dialog_class) {
|
||||
postJsonCloseErrorDialog("startSync", dialog_class);
|
||||
}
|
||||
|
||||
function postJsonCloseErrorDialog(url, dialog_class) {
|
||||
postJson(url, {},
|
||||
function (data) {
|
||||
if (dialog_class) {
|
||||
// Hide the error dialog
|
||||
$("." + dialog_class).hide();
|
||||
setErrorWatermark();
|
||||
}
|
||||
refreshstats(data);
|
||||
}, null)
|
||||
}
|
||||
|
||||
function toast(text) {
|
||||
M.toast({ html: text });
|
||||
}
|
||||
|
||||
function htmlEntities(str) {
|
||||
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace("'", "'");
|
||||
}
|
||||
|
||||
function postJson(path, json, onSuccess, onFail = null, toastWhile = null) {
|
||||
var notification = null
|
||||
var returned = false
|
||||
if (toastWhile) {
|
||||
setTimeout(function () {
|
||||
if (!returned) {
|
||||
notification = M.toast({ html: toastWhile, displayLength: 99999999 });
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
$.post({
|
||||
url: path,
|
||||
data: JSON.stringify(json),
|
||||
success: function (data) {
|
||||
returned = true;
|
||||
if (notification != null) {
|
||||
notification.dismiss();
|
||||
}
|
||||
if (data.hasOwnProperty("message")) {
|
||||
toast(data.message);
|
||||
}
|
||||
if (data.hasOwnProperty("reload_page") && data.reload_page) {
|
||||
// Reload the page
|
||||
window.location.assign(getInnerHomeUri());
|
||||
}
|
||||
if (onSuccess) {
|
||||
onSuccess(data);
|
||||
}
|
||||
},
|
||||
dataType: "json",
|
||||
contentType: 'application/json'
|
||||
}).fail(
|
||||
function (e) {
|
||||
returned = true;
|
||||
if (notification != null) {
|
||||
notification.dismiss();
|
||||
}
|
||||
var info = parseErrorInfo(e);
|
||||
if (onFail) {
|
||||
onFail(info);
|
||||
}
|
||||
button_text = " <a class='btn-flat' target='_blank' onClick=\"$('#error_details_card').fadeIn(400);return false;\">Details</a>"
|
||||
$('#error_details_paragraph').text(info.details);
|
||||
|
||||
M.toast({ html: info.message + button_text, displayLength: 10000 });
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
function parseErrorInfo(e) {
|
||||
if (e.hasOwnProperty("message") && e.hasOwnProperty("details")) {
|
||||
return {
|
||||
message: e.message,
|
||||
details: e.details
|
||||
}
|
||||
}
|
||||
|
||||
if (e.hasOwnProperty("responseText")) {
|
||||
try {
|
||||
return JSON.parse(e.responseText)
|
||||
} catch (err) {
|
||||
// Try something else
|
||||
}
|
||||
}
|
||||
|
||||
if (e.hasOwnProperty("status") && e.hasOwnProperty("statusText") && e.hasOwnProperty("responseText")) {
|
||||
// Its an HTTP error, so format appropriately
|
||||
return {
|
||||
message: "Got unexpected HTTP error " + e.status + ": " + e.statusText,
|
||||
details: e.responseText
|
||||
}
|
||||
}
|
||||
return {
|
||||
message: "Got an unexpected error",
|
||||
details: JSON.stringify(error, undefined, 2)
|
||||
}
|
||||
}
|
||||
|
||||
function getInnerHomeUri() {
|
||||
return normalizeAddonUrl(URI(window.location.href));
|
||||
}
|
||||
|
||||
function getOutterHomeUri() {
|
||||
if (parent !== window) {
|
||||
return normalizeAddonUrl(URI(parent.location.href), false);
|
||||
} else {
|
||||
return getInnerHomeUri()
|
||||
}
|
||||
}
|
||||
|
||||
function getHomeAssistantUrl(path, alt_host) {
|
||||
if (parent !== window) {
|
||||
// Probably this is an ingress window
|
||||
var start = URI(normalizeAddonUrl(URI(parent.location.href), false));
|
||||
return start.pathname(path).toString();
|
||||
} else {
|
||||
// Probably this is the addon on a custom port
|
||||
var host = URI(window.location.href).hostname();
|
||||
return URI(alt_host.replace("{host}", host)).pathname(path).toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function normalizeAddonUrl(uri, add_trailing_slash = true) {
|
||||
path = uri.pathname();
|
||||
endings = [
|
||||
/\/reauthenticate$/g,
|
||||
/\/reauthenticate\/$/g,
|
||||
/\/index$/g,
|
||||
/\/index\/$/g,
|
||||
/\/index.html$/g,
|
||||
/\/index.html\/$/g
|
||||
]
|
||||
for (var i = 0; i < endings.length; i++) {
|
||||
path = path.replace(endings[i], "/");
|
||||
}
|
||||
if (add_trailing_slash) {
|
||||
path = path + "/";
|
||||
}
|
||||
path = path.replace("//", "/");
|
||||
return uri.pathname(path).search("").fragment("").hash("").toString();
|
||||
}
|
||||
|
||||
function cancelSync() {
|
||||
postJson("cancelSync", {}, refreshstats, null, "Canceling...")
|
||||
}
|
||||
|
||||
function setErrorWatermark() {
|
||||
error_minimum = last_data.last_error_count
|
||||
}
|
||||
|
||||
function bugReport() {
|
||||
postJson("makeanissue", {}, openBugDialog, null, "Generating Bug Info...")
|
||||
}
|
||||
|
||||
function openBugDialog(resp) {
|
||||
$("#bug_markdown_display").val(resp.markdown);
|
||||
renderMarkdown();
|
||||
tabs = M.Tabs.getInstance(document.querySelector("#bug_report_tabs"));
|
||||
M.Modal.getInstance(document.querySelector('#bug_modal')).open();
|
||||
tabs.select("bug_markdown");
|
||||
tabs.select("bug_preview");
|
||||
tabs.updateTabIndicator();
|
||||
}
|
||||
|
||||
function doBugDetailCopy() {
|
||||
tabs.select("bug_markdown");
|
||||
var copyText = document.getElementById("bug_markdown_display");
|
||||
copyText.select();
|
||||
document.execCommand("copy");
|
||||
M.toast({ html: "Copied! Now go to GitHub" });
|
||||
}
|
||||
|
||||
function renderMarkdown() {
|
||||
$("#bug_preview_display").html(window.markdownit().render($("#bug_markdown_display").val()));
|
||||
}
|
||||
|
||||
sync_toast = null;
|
||||
error_toast = null
|
||||
last_data = null;
|
||||
error_minimum = 0
|
||||
// Refreshes the display with stats from the server.
|
||||
function refreshstats() {
|
||||
var jqxhr = $.get("getstatus", processStatusUpdate, "json").fail(
|
||||
function (e) {
|
||||
console.log("Status update failed: ");
|
||||
console.log(e);
|
||||
$("#backups_loading").show();
|
||||
if (error_toast == null) {
|
||||
M.Toast.dismissAll();
|
||||
sync_toast = null;
|
||||
error_toast = M.toast({ html: 'Lost connection to add-on, will keep trying to connect...', displayLength: 9999999 })
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
function processSourcesUpdate(sources) {
|
||||
sources_div = $('#sources');
|
||||
for (var key in sources) {
|
||||
if (!sources.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
let source = sources[key];
|
||||
|
||||
if (!source.enabled) {
|
||||
continue;
|
||||
}
|
||||
let template = $(".source_" + key);
|
||||
let isNew = false;
|
||||
if (template.length == 0) {
|
||||
isNew = true;
|
||||
template = $('#source-template').find(".source-ui").clone();
|
||||
template.addClass("source_" + key);
|
||||
template.addClass("active_source");
|
||||
template.data("source", key);
|
||||
}
|
||||
|
||||
$(".source_title", template).html("in " + source.title );
|
||||
$(".source-detail", template).html(source.detail);
|
||||
if (source.detail.length > 0) {
|
||||
$(".source-detail-label", template).show();
|
||||
} else {
|
||||
$(".source-detail-label", template).hide();
|
||||
}
|
||||
$("use", template).attr('xlink:href', "#" + source.icon);
|
||||
|
||||
if (source.retained > 0) {
|
||||
$(".source_retain_count", template).html(source.retained);
|
||||
$(".source_retain_label", template).show();
|
||||
} else {
|
||||
$(".source_retain_label", template).hide();
|
||||
}
|
||||
if (source.ignored > 0) {
|
||||
$(".source_ignored_count", template).html(source.ignored);
|
||||
$(".source_ignored_size", template).html(source.ignored_size);
|
||||
$(".source_ignored_label", template).show();
|
||||
} else {
|
||||
$(".source_ignored_label", template).hide();
|
||||
}
|
||||
$(".source_backup_count", template).html(source.backups + " (" + source.size + ")");
|
||||
|
||||
if (source.hasOwnProperty("free_space")) {
|
||||
$('.source_free_space_text', template).html(source.free_space + " remaining");
|
||||
$('.source_free_space_tooltip', template).attr("data-tooltip", "An estimate of the space available in " + source.title + ".");
|
||||
$('.source_free_space', template).show();
|
||||
} else {
|
||||
$('.source_free_space', template).hide();
|
||||
}
|
||||
|
||||
if (isNew) {
|
||||
sources_div.append(template);
|
||||
}
|
||||
}
|
||||
$(".active_source").each(function () {
|
||||
let source = $(this);
|
||||
let key = source.data('source');
|
||||
if (!(sources.hasOwnProperty(source.data('source')) && sources[key].enabled)) {
|
||||
source.remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function processBackupsUpdate(data) {
|
||||
let detail_modal = document.getElementById('details_modal');
|
||||
let detail_modal_slug = $("#details_modal").data('slug');
|
||||
detail_modal = M.Modal.getInstance(detail_modal);
|
||||
|
||||
let regular_backups = [];
|
||||
let ignored_backups = [];
|
||||
for (var key in data.backups) {
|
||||
if (data.backups.hasOwnProperty(key)) {
|
||||
backup = data.backups[key];
|
||||
if (backup.ignored) {
|
||||
ignored_backups.push(backup);
|
||||
} else {
|
||||
regular_backups.push(backup);
|
||||
}
|
||||
|
||||
// Update the detail modal is necessary
|
||||
if (detail_modal_slug == backup.slug && detail_modal && detail_modal.isOpen) {
|
||||
setValuesForBackupUpdate(backup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let count_regular = populateBackupDiv($('#backups'), regular_backups, "archive");
|
||||
let count_ignored = populateBackupDiv($('#backups_ignored'), ignored_backups, "cloud_off");
|
||||
|
||||
if (count_ignored == 0) {
|
||||
$(".ignored_backup_slider").addClass("default-hidden");
|
||||
} else {
|
||||
$(".ignored_backup_slider").removeClass("default-hidden");
|
||||
}
|
||||
if (count_ignored > 1) {
|
||||
$(".ignored_backup_plural").removeClass("default-hidden");
|
||||
} else {
|
||||
$(".ignored_backup_plural").addClass("default-hidden");
|
||||
}
|
||||
|
||||
$(".ignored_backup_count").html(count_ignored);
|
||||
return count_regular + count_ignored;
|
||||
}
|
||||
|
||||
function populateBackupDiv(backup_div, backups, icon) {
|
||||
slugs = []
|
||||
count = 0;
|
||||
for (var key in backups) {
|
||||
if (backups.hasOwnProperty(key)) {
|
||||
count++;
|
||||
backup = backups[key];
|
||||
// try to find the item
|
||||
var template = $(".slug" + backup.slug, backup_div);
|
||||
slugs.push(backup.slug);
|
||||
var isNew = false;
|
||||
if (template.length == 0) {
|
||||
var template = $('#backup-template').find(".backup-ui").clone();
|
||||
template.addClass("slug" + backup.slug);
|
||||
template.addClass("active-backup");
|
||||
template.data("slug", backup.slug);
|
||||
template.data("timestamp", backup.timestamp);
|
||||
$("#backup_card", template).attr('id', "backup_card" + backup.slug);
|
||||
$("#loading", template).attr('id', "loading" + backup.slug);
|
||||
$(".backup_icon", template).html(icon);
|
||||
isNew = true;
|
||||
}
|
||||
|
||||
$("#size", template).html(backup['size']);
|
||||
if (backup['type'].toLowerCase() == 'full') {
|
||||
$("#type", template).html("Full backup");
|
||||
} else if (backup['type'].toLowerCase() == 'partial') {
|
||||
$("#type", template).html( "Partial backup");
|
||||
} else {
|
||||
$("#type", template).html('');
|
||||
}
|
||||
|
||||
$("#createdAt", template).html(backup['createdAt']);
|
||||
$("#name", template).html(backup['name']);
|
||||
$("#name", template).attr('title', backup['name']);
|
||||
$("#status", template).html(backup['status']);
|
||||
let note = $("#note", template);
|
||||
if (backup.note) {
|
||||
note.html(backup['note']);
|
||||
note.attr('data-tooltip', backup['note']);
|
||||
note.addClass('tooltipped');
|
||||
} else {
|
||||
note.html(" ");
|
||||
note.attr('data-tooltip', '');
|
||||
note.removeClass('tooltipped');
|
||||
}
|
||||
if (backup.status_detail) {
|
||||
$("#gen_detail", template).show();
|
||||
tooltip = "Kept generationally for " + backup.status_detail[0];
|
||||
$("#gen_detail", template).attr('data-tooltip', tooltip);
|
||||
} else {
|
||||
$("#gen_detail", template).hide();
|
||||
}
|
||||
|
||||
|
||||
if (backup.protected) {
|
||||
$(".icon-protected", template).show();
|
||||
} else {
|
||||
$(".icon-protected", template).hide();
|
||||
}
|
||||
|
||||
delete_next = [];
|
||||
retained = false;
|
||||
for (let source of backup.sources){
|
||||
if (source.delete_next) {
|
||||
delete_next.push(source);
|
||||
}
|
||||
if (source.retained) {
|
||||
retained = true;
|
||||
}
|
||||
}
|
||||
if (delete_next.length > 1) {
|
||||
$(".icon-warn-delete", template).show();
|
||||
$(".icon-warn-delete", template).attr("data-tooltip", "This backup will be deleted next from " + delete_next.length + " places when a new backup is created.");
|
||||
} else if (delete_next.length == 1) {
|
||||
$(".icon-warn-delete", template).show();
|
||||
$(".icon-warn-delete", template).attr("data-tooltip", "This backup will be deleted next from " + sourceToName(delete_next[0].key) + " when a new backup is created.");
|
||||
} else {
|
||||
$(".icon-warn-delete", template).hide();
|
||||
}
|
||||
|
||||
if (retained) {
|
||||
$(".icon-retain", template).show();
|
||||
} else {
|
||||
$(".icon-retain", template).hide();
|
||||
}
|
||||
|
||||
tip = "Help unavailable";
|
||||
|
||||
if (backup.status.includes("Drive")) {
|
||||
tip = tooltipDriveOnly;
|
||||
} else if (backup.status.includes("Backed Up")) {
|
||||
tip = tooltipBackedUp;
|
||||
} else if (backup.status.includes("Loading")) {
|
||||
tip = tooltipLoading;
|
||||
} else if (backup.status.includes("HA Only")) {
|
||||
tip = tooltipHassio;
|
||||
} else if (backup.status.includes("Pending")) {
|
||||
tip = tooltipPending;
|
||||
} else if (backup.status.includes("Upload")) {
|
||||
tip = tooltipUploading;
|
||||
} else if (backup.status.includes("aiting")) {
|
||||
tip = tooltipWaiting;
|
||||
}
|
||||
$("#status-help", template).attr("data-tooltip", tip);
|
||||
|
||||
if (isNew) {
|
||||
before = null;
|
||||
// Find where the backup should be inserted, which is almost always at the top.
|
||||
// This is an inefficient way of sorting but prevents juggling DOM entities around
|
||||
// and the "search" is almsot always O(1) in practice.
|
||||
$(".active-backup", backup_div).each(function () {
|
||||
if (template.data('timestamp') > $(this).data('timestamp')) {
|
||||
before = $(this);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (before != null) {
|
||||
template.insertBefore(before);
|
||||
} else {
|
||||
backup_div.append(template);
|
||||
}
|
||||
}
|
||||
|
||||
if (backup.isPending) {
|
||||
$("#loading" + backup.slug).show();
|
||||
$("#backup_card" + backup.slug).css("cursor", "auto");
|
||||
} else {
|
||||
$("#loading" + backup.slug).hide();
|
||||
$("#backup_card" + backup.slug).css("cursor", "pointer");
|
||||
}
|
||||
|
||||
// Set up context
|
||||
$("#backup_card" + backup.slug).data('backup', backup);
|
||||
}
|
||||
}
|
||||
// Remove the backup card if the backup was deleted.
|
||||
$(".active-backup", backup_div).each(function () {
|
||||
var backup = $(this)
|
||||
if (!slugs.includes(backup.data('slug'))) {
|
||||
backup.remove();
|
||||
}
|
||||
});
|
||||
return count;
|
||||
}
|
||||
|
||||
function processStatusUpdate(data) {
|
||||
name_keys = data.backup_name_keys;
|
||||
$('#last_backup').empty().append(data.last_backup_text);
|
||||
$('#last_backup').attr("datetime", data.last_backup_machine);
|
||||
$('#last_backup').attr("title", data.last_backup_detail);
|
||||
|
||||
$('#next_backup').empty().append(data.next_backup_text);
|
||||
$('#next_backup').attr("datetime", data.next_backup_machine);
|
||||
$('#next_backup').attr("title", data.next_backup_detail);
|
||||
|
||||
if (data.sources.GoogleDrive.enabled && data.folder_id && data.folder_id.length > 0 ) {
|
||||
$('.open_drive_link').attr("href", "https://drive.google.com/drive/u/0/folders/" + data.folder_id);
|
||||
$('.open_drive_menu').show()
|
||||
} else {
|
||||
$('.open_drive_menu').hide()
|
||||
}
|
||||
|
||||
processSourcesUpdate(data.sources);
|
||||
count = processBackupsUpdate(data);
|
||||
|
||||
// Update the "syncing" toast message
|
||||
if (data.syncing) {
|
||||
if (sync_toast == null) {
|
||||
sync_toast = M.toast({ html: '<span>Syncing...</span><a class="btn-flat toast-action" onclick="cancelSync()">Cancel</button>', displayLength: 999999999 })
|
||||
}
|
||||
} else {
|
||||
// Make sure the toast isn't up
|
||||
if (sync_toast != null) {
|
||||
sync_toast.dismiss();
|
||||
sync_toast = null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (count == 0) {
|
||||
if (!data.firstSync) {
|
||||
$("#no_backups_block").show();
|
||||
$("#backups_loading").hide();
|
||||
} else {
|
||||
$("#backups_loading").show();
|
||||
$("#no_backups_block").hide();
|
||||
}
|
||||
} else {
|
||||
$("#no_backups_block").hide();
|
||||
$("#backups_loading").hide();
|
||||
}
|
||||
|
||||
var found = false;
|
||||
var error = data.last_error;
|
||||
$('.error_card').each(function (i) {
|
||||
var item = $(this);
|
||||
let id = item.attr('id');
|
||||
if (id == "error_card" || id == "error_details_card") {
|
||||
// This card gets handled separately because it catches any other error.
|
||||
return;
|
||||
}
|
||||
if (data.last_error == null) {
|
||||
if (item.is(":visible")) {
|
||||
item.hide();
|
||||
}
|
||||
} else if (item.hasClass(error.error_type) && data.last_error_count != error_minimum && !data.ignore_errors_for_now && !data.ignore_sync_error) {
|
||||
found = true;
|
||||
if (data.hasOwnProperty('dns_info')) {
|
||||
var dns_div = $('.dns_info', item)
|
||||
if (dns_div.length > 0) {
|
||||
populateDnsInfo(dns_div, data.dns_info)
|
||||
}
|
||||
}
|
||||
if (error.data != null) {
|
||||
for (key in error.data) {
|
||||
if (!error.data.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
var value = error.data[key];
|
||||
var index = key.lastIndexOf("#");
|
||||
if (index > 0) {
|
||||
var attr = key.slice(index + 1);
|
||||
key = key.slice(0, index);
|
||||
$("#data_" + key, item).attr(attr, value);
|
||||
} else {
|
||||
$("#data_" + key, item).html(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item.is(":hidden")) {
|
||||
item.show()
|
||||
}
|
||||
} else {
|
||||
item.hide();
|
||||
}
|
||||
});
|
||||
|
||||
if (data.last_error != null && !found && data.last_error_count != error_minimum && !data.ignore_errors_for_now && !data.ignore_sync_error) {
|
||||
var card = $("#error_card")
|
||||
if (!card.is(":visible")) {
|
||||
card.fadeIn();
|
||||
}
|
||||
populateGitHubInfo(card, data.last_error);
|
||||
} else {
|
||||
$("#error_card").hide();
|
||||
}
|
||||
|
||||
// Only show one of the "question" cards at a TimeRanges, ir order to prevent the UI from blowing up
|
||||
let question_card = null;
|
||||
if (data.notify_check_ignored) {
|
||||
question_card = "ignore_helper_card";
|
||||
} else if (data.backup_cooldown_active) {
|
||||
question_card = "backups_boot_waiting_card";
|
||||
} else if(data.warn_ingress_upgrade && !hideIngress) {
|
||||
question_card = "ingress_upgrade_card";
|
||||
} else if (data.ask_error_reports && !found) {
|
||||
question_card = "error_reports_card";
|
||||
} else if (data.warn_backup_upgrade && !found) {
|
||||
question_card = "backup_upgrade_card";
|
||||
} else if (data.warn_upgrade_backups) {
|
||||
question_card = "warn_upgrade_backups_card";
|
||||
} else if (data.warn_oob_oauth) {
|
||||
question_card = "warn_creds_deprecated_card";
|
||||
}
|
||||
|
||||
$('.question-card').each(function (i) {
|
||||
let item = $(this);
|
||||
let id = item.attr('id');
|
||||
let visible = item.is(":visible");
|
||||
if (id == question_card && !visible) {
|
||||
item.fadeIn(500);
|
||||
item.slideDown(1000);
|
||||
} else if (id != question_card && visible) {
|
||||
item.slideUp(1000);
|
||||
item.fadeOut(500);
|
||||
}
|
||||
});
|
||||
|
||||
if (data.is_custom_creds) {
|
||||
$(".hide-for-custom-creds").hide();
|
||||
$(".hide-for-default-creds").show();
|
||||
} else {
|
||||
$(".hide-for-custom-creds").show();
|
||||
$(".hide-for-default-creds").hide();
|
||||
}
|
||||
|
||||
|
||||
$("#restore_hard_link").attr("href", getHomeAssistantUrl(data.restore_backup_path, data.ha_url_base));
|
||||
|
||||
last_data = data;
|
||||
|
||||
$('.tooltipped').tooltip({ "exitDelay": 1000 });
|
||||
if (error_toast != null) {
|
||||
error_toast.dismiss();
|
||||
error_toast = null;
|
||||
}
|
||||
}
|
||||
|
||||
function populateDnsInfo(target, data) {
|
||||
if (data == null) {
|
||||
target.html("No DNS info is available")
|
||||
} else if (data.hasOwnProperty('error')) {
|
||||
target.html(JSON.stringify(data.error))
|
||||
} else {
|
||||
var html = "";
|
||||
for (var host in data) {
|
||||
if (data.hasOwnProperty(host)) {
|
||||
html += "<div class='col s12 m6 row'> <h6>Host: " + host + "</h6>";
|
||||
var ips = data[host];
|
||||
for (var ip in ips) {
|
||||
if (ips.hasOwnProperty(ip)) {
|
||||
result = ips[ip];
|
||||
html += "<div class='col s7'>" + ip + "</div><div class='col s5'>" + result + "</div>";
|
||||
}
|
||||
}
|
||||
html += "</div>";
|
||||
}
|
||||
}
|
||||
target.html(html);
|
||||
}
|
||||
}
|
||||
|
||||
function populateGitHubInfo(target, error) {
|
||||
$('#generic_error_title', target).text(error.message);
|
||||
$('#generic_error_details', target).text(error.details);
|
||||
$('#error_github_search', target).attr("href", "https://github.com/sabeechen/hassio-google-drive-backup/issues?q=" + encodeURIComponent("\"" + error.message.replace("\"", "\\\"") + "\""));
|
||||
}
|
||||
|
||||
function simulateError() {
|
||||
$.get("simerror?error=This%20is%20a%20fake%20error.%20Select%20'Stop%20Simulated%20Error'%20from%20the%20menu%20to%20stop%20it.",
|
||||
function (data) {
|
||||
sync()
|
||||
})
|
||||
}
|
||||
|
||||
function stopSimulateError() {
|
||||
$.get("simerror?error=",
|
||||
function (data) {
|
||||
sync()
|
||||
})
|
||||
}
|
||||
|
||||
function newBackupClick() {
|
||||
setInputValue("retain_drive_one_off", false);
|
||||
setInputValue("retain_ha_one_off", false);
|
||||
setInputValue("backup_name_one_off", "");
|
||||
setInputValue("backup_note_one_off", "");
|
||||
backupNameOneOffExample();
|
||||
M.Modal.getInstance(document.querySelector('#backupmodal')).open();
|
||||
}
|
||||
|
||||
function doNewBackup() {
|
||||
var drive = $("#retain_drive_one_off").prop('checked');
|
||||
var ha = $("#retain_ha_one_off").prop('checked');
|
||||
var name = $("#backup_name_one_off").val()
|
||||
let note = $("#backup_note_one_off").val()
|
||||
var url = "backup?custom_name=" + encodeURIComponent(name) + "&retain_drive=" + drive + "&retain_ha=" + ha + "¬e=" + encodeURIComponent(note);
|
||||
postJson(url, {}, refreshstats, null, "Requesting backup (takes a few seconds)...");
|
||||
return false;
|
||||
}
|
||||
|
||||
function allowDeletion(always) {
|
||||
var url = "confirmdelete?always=" + always;
|
||||
postJson(url, {}, refreshstats, null, "Allowing deletion and syncing...");
|
||||
}
|
||||
|
||||
function chooseBackupFolder() {
|
||||
window.open(last_data.choose_folder_url);
|
||||
}
|
||||
|
||||
function skipLowSpaceWarning() {
|
||||
postJsonCloseErrorDialog("skipspacecheck", "low_space");
|
||||
}
|
||||
|
||||
|
||||
|
||||
$(document).ready(function () {
|
||||
if (window.top.location === window.location) {
|
||||
// We're in a standard webpage, show the full header
|
||||
$(".ingress-only").hide();
|
||||
$(".nav-wrapper .right").addClass("hide-on-med-and-down")
|
||||
} else {
|
||||
// We're in an ingress iframe.
|
||||
$(".non-ingress").hide();
|
||||
$(".nav-wrapper .brand-logo").addClass("hide-on-med-and-down")
|
||||
}
|
||||
M.Tabs.init(document.querySelector("#bug_report_tabs"), { "onShow": renderMarkdown });
|
||||
});
|
||||
|
||||
|
||||
function copyFromInput(id) {
|
||||
var copyText = document.getElementById(id);
|
||||
copyText.select();
|
||||
document.execCommand("copy");
|
||||
}
|
||||
|
||||
function saveFolder(id) {
|
||||
url = "changefolder?id=" + id
|
||||
postJson(url, {}, refreshstats, null, "Setting backup folder...");
|
||||
}
|
||||
|
||||
function exampleBackupName(backup_type, template) {
|
||||
name_keys["{type}"] = $("#partial_backups").is(':checked') ? "Partial" : "Full";
|
||||
if (template.length == 0) {
|
||||
template = last_data.backup_name_template;
|
||||
}
|
||||
for (key in name_keys) {
|
||||
template = template.replace(key, name_keys[key]);
|
||||
}
|
||||
return template;
|
||||
}
|
||||
@@ -0,0 +1,353 @@
|
||||
settingsChanged = false;
|
||||
|
||||
function showPallette(element) {
|
||||
let target = $(element);
|
||||
target.colpick({
|
||||
'layout': 'rgbhex',
|
||||
'color': target.html(),
|
||||
'onSubmit': colorSubmit,
|
||||
'onChange': function(hsb,hex,rgb,el,bySetColor){
|
||||
settingsChanged = true;
|
||||
let color = new Color(rgb['r'], rgb['g'], rgb['b']);
|
||||
updateColorSelector(target, color);
|
||||
setStyles();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateColorSelector(target, color) {
|
||||
target.html(color.toHex());
|
||||
target.css("background-color", color.toCss());
|
||||
target.css("color", color.textColor().toCss());
|
||||
target.css("border", "2px");
|
||||
target.css("border-color", color.textColor().toCss());
|
||||
target.css("border-style", 'solid');
|
||||
}
|
||||
|
||||
function colorSubmit(hsb,hex,rgb,el,bySetColor){
|
||||
setStyles();
|
||||
$(el).colpickHide();
|
||||
}
|
||||
|
||||
function setStyles() {
|
||||
background = Color.parse($("#background_color").html());
|
||||
accent = Color.parse($("#accent_color").html());
|
||||
window.setColors(background, accent);
|
||||
}
|
||||
|
||||
function revertColors() {
|
||||
background = Color.defaultBackground()
|
||||
updateColorSelector($("#background_color"), background);
|
||||
accent = Color.defaultAccent();
|
||||
updateColorSelector($("#accent_color"), accent);
|
||||
|
||||
window.setColors(background, accent);
|
||||
}
|
||||
|
||||
function backupNameExample() {
|
||||
$("#backup_example").html(exampleBackupName("Full", $("#backup_name").val()));
|
||||
}
|
||||
|
||||
function backupNameOneOffExample() {
|
||||
$("#backup_name_example_one_off").html(exampleBackupName("Full", $("#backup_name_one_off").val()));
|
||||
}
|
||||
|
||||
function checkForSecret() {
|
||||
var password = $("#backup_password");
|
||||
var password2 = $("#backup_password_reenter");
|
||||
var block = $("#password_renter_block");
|
||||
var new_password = password.val();
|
||||
var old_password = password.data('old_password');
|
||||
if (password.val().startsWith("!secret ")) {
|
||||
password.attr('type', 'text');
|
||||
block.fadeOut();
|
||||
return true;
|
||||
} else {
|
||||
password.attr('type', 'password');
|
||||
if (new_password.length > 0 && old_password != new_password) {
|
||||
block.fadeIn();
|
||||
if (new_password == password2.val()) {
|
||||
password2.removeClass("invalid");
|
||||
return true;
|
||||
} else {
|
||||
password2.addClass("invalid");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
block.fadeOut();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
// handle "escape" when settings dialog is presented
|
||||
$(document).keyup(function (e) {
|
||||
if (e.keyCode === 27) { // 27==escape
|
||||
if (M.Modal.getInstance(document.querySelector('#settings_modal')).isOpen) {
|
||||
handleCloseSettings();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var settingsDialog = $("#settings_modal");
|
||||
$('#settings_modal :input').change(function () {
|
||||
settingsChanged = true;
|
||||
});
|
||||
});
|
||||
|
||||
function handleCloseSettings() {
|
||||
// determine is the settings hanve changed.
|
||||
if (settingsChanged) {
|
||||
if (confirm("Discard changes?")) {
|
||||
window.setColors(config.background_color, config.accent_color);
|
||||
M.Modal.getInstance(document.getElementById("settings_modal")).close();
|
||||
}
|
||||
} else {
|
||||
window.setColors(config.background_color, config.accent_color);
|
||||
M.Modal.getInstance(document.getElementById("settings_modal")).close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function loadSettings() {
|
||||
postJson("getconfig", {}, handleSettingsDialog, null, "Loading settings...")
|
||||
}
|
||||
|
||||
function handleSettingsDialog(data) {
|
||||
config = data.config;
|
||||
addons = data.addons;
|
||||
defaults = data.defaults
|
||||
for (key in config) {
|
||||
if (config.hasOwnProperty(key)) {
|
||||
setInputValue(key, config[key]);
|
||||
}
|
||||
}
|
||||
|
||||
setInputValue("generational_enabled",
|
||||
config.generational_days > 0 || config.generational_weeks > 0 || config.generational_months > 0 || config.generational_years > 0);
|
||||
|
||||
var exclude_addons = [];
|
||||
var stop_addons = []
|
||||
if (config.hasOwnProperty('exclude_addons') && config.exclude_addons.length > 0) {
|
||||
exclude_addons = config.exclude_addons.split(",");
|
||||
}
|
||||
if (config.hasOwnProperty('stop_addons') && config.stop_addons.length > 0) {
|
||||
stop_addons = config.stop_addons.split(",");
|
||||
}
|
||||
|
||||
setInputValue("partial_backups", config.exclude_folders.length > 0 || exclude_addons.length > 0);
|
||||
setInputValue("stop_addons", stop_addons.length > 0);
|
||||
|
||||
// Set the state of excluded and stopped addons.
|
||||
$("#settings_addons").html("");
|
||||
$("#stopped_addons").html("");
|
||||
for (addon in addons) {
|
||||
addon = addons[addon];
|
||||
template = `<li class="indented-li">
|
||||
<label>
|
||||
<input class="filled-in {selector}" type="checkbox" name="{id}" id="{id}" data-slug="{slug}" settings_ignore='true' {checked} />
|
||||
<span>{name} <span class="helper-text">(v{version})</span></span>
|
||||
<br />
|
||||
<span class="helper-text">{description}</span>
|
||||
</label>
|
||||
</li>`;
|
||||
template = template
|
||||
.replace("{id}", addon.slug)
|
||||
.replace("{id}", addon.slug)
|
||||
.replace("{slug}", addon.slug)
|
||||
.replace("{description}", addon.description)
|
||||
.replace("{name}", addon.name)
|
||||
.replace("{version}", addon.version);
|
||||
|
||||
$("#settings_addons").append(template.replace("{checked}", exclude_addons.includes(addon.slug) ? "" : "checked").replace("{selector}", "settings_addon_checkbox"));
|
||||
$("#stopped_addons").append(template.replace("{checked}", stop_addons.includes(addon.slug) ? "checked" : "").replace("{selector}", "settings_stop_addon_checkbox"));
|
||||
}
|
||||
|
||||
$("#folder_selection_list").html("");
|
||||
for (folder of data.folders) {
|
||||
template = `<li class="indented-li">
|
||||
<label class="checkbox-label">
|
||||
<input class="filled-in settings_folder_checkbox" settings_ignore="true" type="checkbox" name="{id}" id="{id}" data-slug="{slug}" {checked} />
|
||||
<span class="checkbox-label">{name}</span>
|
||||
<br />
|
||||
<span class="helper-text">{description}</span>
|
||||
</label>
|
||||
</li>`;
|
||||
template = template
|
||||
.replace("{id}", folder.id)
|
||||
.replace("{id}", folder.id)
|
||||
.replace("{slug}", folder.slug)
|
||||
.replace("{description}", folder.description)
|
||||
.replace("{name}", folder.name)
|
||||
.replace("{name}", folder.slug)
|
||||
.replace("{checked}", config.exclude_folders.includes(folder.slug) ? "" : "checked");
|
||||
$("#folder_selection_list").append(template);
|
||||
}
|
||||
|
||||
$("#settings_error_div").hide();
|
||||
M.updateTextFields();
|
||||
$("#use_ssl").trigger("change");
|
||||
$("#generational_enabled").trigger("change");
|
||||
$("#partial_backups").trigger("change");
|
||||
$("#expose_extra_server").trigger("change");
|
||||
settingsChanged = false;
|
||||
backupNameExample();
|
||||
|
||||
// Configure the visibility/link of the "current backup folder" help text and button.
|
||||
if (data.backup_folder && data.backup_folder.length > 0) {
|
||||
$("#current_folder_span").show()
|
||||
$('#current_folder_link').attr("href", "https://drive.google.com/drive/u/0/folders/" + data.backup_folder);
|
||||
} else {
|
||||
$("#current_folder_span").hide();
|
||||
}
|
||||
|
||||
if (config.specify_backup_folder && last_data && last_data.sources.GoogleDrive.enabled) {
|
||||
$("#choose_folder_controls").show();
|
||||
} else {
|
||||
$("#choose_folder_controls").hide();
|
||||
}
|
||||
|
||||
setInputValue("settings_specify_folder_id", data.backup_folder);
|
||||
|
||||
if (config.hasOwnProperty("backup_password")) {
|
||||
$("#backup_password").data("old_password", config.backup_password);
|
||||
} else {
|
||||
$("#backup_password").data("old_password", "");
|
||||
}
|
||||
$("#backup_password_reenter").val("");
|
||||
|
||||
let background = config.background_color;
|
||||
if (!background || background.length == 0) {
|
||||
background = Color.defaultBackground();
|
||||
} else {
|
||||
background = Color.parse(config.background_color);
|
||||
}
|
||||
let accent = config.accent_color;
|
||||
if (!accent || accent.length == 0) {
|
||||
accent = Color.defaultAccent();
|
||||
} else {
|
||||
accent = Color.parse(config.accent_color);
|
||||
}
|
||||
|
||||
updateColorSelector($("#background_color"), background);
|
||||
updateColorSelector($("#accent_color"), accent);
|
||||
checkForSecret();
|
||||
M.Modal.getInstance(document.querySelector('#settings_modal')).open();
|
||||
showPallette($("#background_color"));
|
||||
showPallette($("#accent_color"));
|
||||
|
||||
toggleSlide(document.querySelector('#stop_addons'), 'settings_stop_addons_details');
|
||||
updateIgnoredBackupOptions();
|
||||
M.updateTextFields();
|
||||
}
|
||||
|
||||
function chooseFolderChanged() {
|
||||
if ($("#specify_backup_folder").is(':checked') && last_data && last_data.sources.GoogleDrive.enabled) {
|
||||
$("#choose_folder_controls").show();
|
||||
} else {
|
||||
$("#choose_folder_controls").hide();
|
||||
}
|
||||
M.updateTextFields();
|
||||
}
|
||||
|
||||
function updateIgnoredBackupOptions() {
|
||||
if ($("#ignore_upgrade_backups").prop('checked') || $("#ignore_other_backups").prop('checked')) {
|
||||
$("#ignored-backup-duration-block").fadeIn();
|
||||
} else {
|
||||
$("#ignored-backup-duration-block").fadeOut();
|
||||
}
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
if (!document.getElementById('settings_form').checkValidity()) {
|
||||
showSettingError({message: "Some configuration is invalid, check for red errors up above."})
|
||||
return;
|
||||
}
|
||||
|
||||
if (!checkForSecret()) {
|
||||
showSettingError({message: "New backup passwords don't match"})
|
||||
return;
|
||||
}
|
||||
toast("Saving...")
|
||||
var config = {}
|
||||
$("select", $("#settings_form")).each(function () {
|
||||
var target = $(this)
|
||||
config[target.attr("id")] = target.val();
|
||||
});
|
||||
$("input", $("#settings_form")).each(function () {
|
||||
var target = $(this)
|
||||
if (target.attr("settings_ignore") == "true") {
|
||||
return;
|
||||
}
|
||||
var value = target.val()
|
||||
if (target.attr("type") == "checkbox") {
|
||||
value = target.prop('checked')
|
||||
} else {
|
||||
if (value.length == 0) {
|
||||
return;
|
||||
} else if (target.attr("type") == "number") {
|
||||
value = parseInt(value)
|
||||
}
|
||||
}
|
||||
config[target.attr("id")] = value;
|
||||
});
|
||||
excluded_addons = ""
|
||||
excluded_folders = ""
|
||||
stop_addons = ""
|
||||
if ($("#partial_backups").prop('checked')) {
|
||||
$(".settings_folder_checkbox").each(function () {
|
||||
if (!$(this).is(":checked")) {
|
||||
excluded_folders = excluded_folders + $(this).data("slug") + ",";
|
||||
}
|
||||
});
|
||||
$(".settings_addon_checkbox").each(function () {
|
||||
if (!$(this).is(":checked")) {
|
||||
excluded_addons = excluded_addons + $(this).data('slug') + ",";
|
||||
}
|
||||
});
|
||||
}
|
||||
if ($("#stop_addons").prop('checked')) {
|
||||
$(".settings_stop_addon_checkbox").each(function () {
|
||||
if ($(this).is(":checked")) {
|
||||
stop_addons = stop_addons + $(this).data('slug') + ",";
|
||||
}
|
||||
});
|
||||
}
|
||||
config.exclude_folders = excluded_folders.replace(/(^,)|(,$)/g, "");
|
||||
config.exclude_addons = excluded_addons.replace(/(^,)|(,$)/g, "");
|
||||
config.stop_addons = stop_addons.replace(/(^,)|(,$)/g, "");
|
||||
if (!$("#generational_enabled").prop('checked')) {
|
||||
generational_delete = ["generational_days", "generational_weeks", "generational_months", "generational_years"]
|
||||
for (prop in generational_delete) {
|
||||
if (config.hasOwnProperty(generational_delete[prop])) {
|
||||
delete config[generational_delete[prop]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( $("#background_color").html() == Color.defaultBackground().toHex()){
|
||||
config.background_color = "";
|
||||
} else {
|
||||
config.background_color = $("#background_color").html();
|
||||
}
|
||||
|
||||
if ( $("#accent_color").html() == Color.defaultAccent().toHex()){
|
||||
config.accent_color = "";
|
||||
} else {
|
||||
config.accent_color = $("#accent_color").html();
|
||||
}
|
||||
|
||||
modal = M.Modal.getInstance(document.getElementById("settings_modal"))
|
||||
postJson("saveconfig", {"config": config, "backup_folder": $("#settings_specify_folder_id").val()}, closeSettings, showSettingError);
|
||||
}
|
||||
|
||||
function closeSettings(){
|
||||
M.Modal.getInstance(document.getElementById("settings_modal")).close()
|
||||
}
|
||||
|
||||
function showSettingError(e){
|
||||
var element = $("#settings_error");
|
||||
element.html(e.message);
|
||||
$("#settings_error_div").fadeIn(400);
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
const themeStyleContainer = document.getElementById("theme");
|
||||
|
||||
class Color {
|
||||
constructor(r = 0, g = 0, b = 0, a = 1) {
|
||||
this.r = this._clamp(r);
|
||||
this.g = this._clamp(g);
|
||||
this.b = this._clamp(b);
|
||||
this.a = this._clamp(a, 0, 1);
|
||||
}
|
||||
|
||||
static black() {
|
||||
return new Color(0, 0, 0);
|
||||
}
|
||||
|
||||
static white() {
|
||||
return new Color(255, 255, 255);
|
||||
}
|
||||
|
||||
static grey() {
|
||||
return new Color(128, 128, 128);
|
||||
}
|
||||
|
||||
static defaultAccent() {
|
||||
return new Color(3, 169, 260);
|
||||
}
|
||||
|
||||
static defaultBackgroundLight() {
|
||||
return Color.white();
|
||||
}
|
||||
|
||||
static defaultBackgroundDark() {
|
||||
return new Color(26, 26, 26);
|
||||
}
|
||||
|
||||
static defaultBackground() {
|
||||
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
return Color.defaultBackgroundDark();
|
||||
} else {
|
||||
return Color.defaultBackgroundLight();
|
||||
}
|
||||
}
|
||||
|
||||
static hexToRgb(hex) {
|
||||
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
||||
return result
|
||||
? {
|
||||
r: parseInt(result[1], 16),
|
||||
g: parseInt(result[2], 16),
|
||||
b: parseInt(result[3], 16),
|
||||
}
|
||||
: null;
|
||||
}
|
||||
|
||||
static parse(color) {
|
||||
const rgb = this.hexToRgb(color);
|
||||
return new Color(rgb.r, rgb.g, rgb.b);
|
||||
}
|
||||
|
||||
tint(to, amount) {
|
||||
amount = this._clamp(amount, 0, 1);
|
||||
|
||||
const r_new = this.r + (to.r - this.r) * amount;
|
||||
const g_new = this.g + (to.g - this.g) * amount;
|
||||
const b_new = this.b + (to.b - this.b) * amount;
|
||||
const a_new = this.a + (to.a - this.a) * amount;
|
||||
return new Color(r_new, g_new, b_new, a_new);
|
||||
}
|
||||
|
||||
darken(amount) {
|
||||
return this.tint(Color.black(), amount);
|
||||
}
|
||||
|
||||
lighten(amount) {
|
||||
return this.tint(Color.white(), amount);
|
||||
}
|
||||
|
||||
shift(amount) {
|
||||
return this.luminance() >= 0.5 ? this.darken(amount) : this.lighten(amount);
|
||||
}
|
||||
|
||||
saturate(change) {
|
||||
const Pr = 0.299;
|
||||
const Pg = 0.587;
|
||||
const Pb = 0.114;
|
||||
const P = Math.sqrt(this.r * this.r * Pr + this.g * this.g * Pg + this.b * this.b * Pb);
|
||||
|
||||
const R = this._clamp(P + (this.r - P) * change);
|
||||
const G = this._clamp(P + (this.g - P) * change);
|
||||
const B = this._clamp(P + (this.b - P) * change);
|
||||
return new Color(R, G, B, this.a);
|
||||
}
|
||||
|
||||
_clamp(value, min = 0, max = 255) {
|
||||
if (value > max) {
|
||||
return max;
|
||||
}
|
||||
if (value < min) {
|
||||
return min;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
toCss() {
|
||||
return "rgba(" + Math.floor(this.r) + "," + Math.floor(this.g) + "," + Math.floor(this.b) + "," + this.a + ")";
|
||||
}
|
||||
|
||||
toHex() {
|
||||
const componentToHex = (c) => {
|
||||
var hex = c.toString(16);
|
||||
return hex.length == 1 ? "0" + hex : hex;
|
||||
};
|
||||
|
||||
return (
|
||||
"#" + componentToHex(Math.floor(this.r)) + componentToHex(Math.floor(this.g)) + componentToHex(Math.floor(this.b))
|
||||
);
|
||||
}
|
||||
|
||||
textColor() {
|
||||
const luma = (0.299 * this.r + 0.587 * this.g + 0.114 * this.b) / 255;
|
||||
return luma > 0.53 ? Color.black() : Color.white();
|
||||
}
|
||||
|
||||
luminance() {
|
||||
const rg = Math.floor(this.r) <= 10 ? this.r / 3294.0 : Math.pow(this.r / 269.0 + 0.0513, 2.4);
|
||||
const gg = Math.floor(this.g) <= 10 ? this.g / 3294.0 : Math.pow(this.g / 269.0 + 0.0513, 2.4);
|
||||
const bg = Math.floor(this.b) <= 10 ? this.b / 3294.0 : Math.pow(this.b / 269.0 + 0.0513, 2.4);
|
||||
return 0.2126 * rg + 0.7152 * gg + 0.0722 * bg;
|
||||
}
|
||||
|
||||
contrast(other) {
|
||||
let big = this.luminance();
|
||||
let small = other.luminance();
|
||||
|
||||
if (big < small) {
|
||||
const temp = big;
|
||||
big = small;
|
||||
small = temp;
|
||||
}
|
||||
|
||||
return (big + 0.05) / (small + 0.05);
|
||||
}
|
||||
|
||||
withAlpha(alpha) {
|
||||
return new Color(this.r, this.g, this.b, alpha);
|
||||
}
|
||||
|
||||
// Return a color close to this but also legible against bg_color.
|
||||
// This is used in some places to make the UI minimally useable even
|
||||
// if the user picks stupid bg/accent colors.
|
||||
makeLegible(bg_color) {
|
||||
let ideal = bg_color.textColor();
|
||||
let contrast = bg_color.contrast(this);
|
||||
// This has a bunch of magic constants that were choosen experimentally.
|
||||
// Don't fuck with them.
|
||||
let contrast_threshold = 2.5;
|
||||
if (contrast > contrast_threshold) {
|
||||
return this;
|
||||
} else {
|
||||
const scale = 1 - (contrast - 1) / (contrast_threshold - 1);
|
||||
return this.tint(ideal, scale * 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setColors(background, accent) {
|
||||
if (!background || (typeof(background) == 'string' && background.length == 0)) {
|
||||
background = Color.defaultBackground();
|
||||
} else if (typeof(background) == 'string') {
|
||||
background = Color.parse(background);
|
||||
}
|
||||
|
||||
if (!accent || (typeof(accent) == 'string' && accent.length == 0)) {
|
||||
accent = Color.defaultAccent();
|
||||
} else if (typeof(accent) == 'string') {
|
||||
accent = Color.parse(accent);
|
||||
}
|
||||
|
||||
themeStyleContainer.dataset.backgroundColor = background.toHex();
|
||||
themeStyleContainer.dataset.accentColor = accent.toHex();
|
||||
|
||||
let text = background.textColor();
|
||||
accent = accent.makeLegible(background);
|
||||
let linkAccent = accent.makeLegible(background);
|
||||
|
||||
let drop_shadow = Color.black();
|
||||
let bg_lum = background.luminance();
|
||||
if (bg_lum < 0.01) {
|
||||
drop_shadow = Color.white().tint(Color.black(), 0.9);
|
||||
}
|
||||
|
||||
let icon_warn = Color.parse("#f57f17").makeLegible(background);
|
||||
let input_label = Color.parse("#9e9e9e").makeLegible(background);
|
||||
let danger_text = Color.parse("#FF0000").tint(text, 0.25).makeLegible(background);
|
||||
let danger_bg = danger_text.textColor();
|
||||
let blue_icon = Color.parse("#0D47A1").makeLegible(background);
|
||||
|
||||
const styleSheet = {
|
||||
":root": {
|
||||
// Cls colors
|
||||
"--cls-color": text.toCss(),
|
||||
"--cls-sec-color": text.toCss(),
|
||||
"--cls-size": "2rem",
|
||||
"--cls-margin": "1rem",
|
||||
"--cls-speed": "4s",
|
||||
// Texts & icons colors
|
||||
"--helper-text-color": text.tint(background, 0.25).toCss(),
|
||||
"--text-primary-color": text.shift(0.13).toCss(),
|
||||
"--text-secondary-color": text.shift(0.26).toCss(),
|
||||
"--divider-color": text.withAlpha(0.12).toCss(),
|
||||
"--shadow-color": drop_shadow.withAlpha(0.14).toCss(),
|
||||
"--icon-color": text.shift(0.13).withAlpha(0.6).toCss(),
|
||||
"--icon-warn": icon_warn.toCss(),
|
||||
"--input-label": input_label.toCss(),
|
||||
"--danger-text": danger_text.toCss(),
|
||||
"--danger-bg": danger_text.textColor().toCss(),
|
||||
"--blue-icon": blue_icon.toCss(),
|
||||
// Accent colors
|
||||
"--accent-color": accent.toCss(),
|
||||
"--accent-dark": accent.darken(0.3).toCss(),
|
||||
"--accent-text-color": accent.textColor().toCss(),
|
||||
"--accent-focus-color": accent.saturate(1.2).toCss(),
|
||||
"--accent-hover-color": accent.textColor().toCss(),
|
||||
"--accent-bg-hover-color": accent.toCss(),
|
||||
"--accent-link-color": linkAccent.toCss(),
|
||||
"--progress-bg": accent.tint(background, 0.75).toCss(),
|
||||
"--accent-ripple": linkAccent.withAlpha(0.2).toCss(),
|
||||
// Background colors
|
||||
"--background-color": background.toCss(),
|
||||
"--background-sidenav-color": background.shift(0.03).toCss(),
|
||||
"--background-hover": background.shift(0.065),
|
||||
"--background-modal-color": background.tint(text, 0.02).toCss(),
|
||||
"--background-primary-color": background.shift(0.02).toCss(),
|
||||
},
|
||||
};
|
||||
|
||||
const properties = Object.keys(styleSheet).map((selector) => {
|
||||
const selectorProperties = Object.keys(styleSheet[selector]).map(
|
||||
(property) => ` ${property}: ${styleSheet[selector][property]};`,
|
||||
);
|
||||
|
||||
return `${selector} {\n${selectorProperties.join("\n")}\n}`;
|
||||
});
|
||||
|
||||
themeStyleContainer.innerHTML = properties.join("\n");
|
||||
}
|
||||
|
||||
setColors(themeStyleContainer.dataset.backgroundColor, themeStyleContainer.dataset.accentColor);
|
||||
Reference in New Issue
Block a user